Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Программирование.pdf
Скачиваний:
26
Добавлен:
12.08.2019
Размер:
4.74 Mб
Скачать

vk.com/club152685050 | vk.com/id446425943

Лекция 1

1

Лекция 1.

Тема: Общие вопросы программирования. Номенклатура языков программирования.

План

1.Понятие алгоритма

2.Свойства алгоритма

3.Алгоритмические языки

4.История развития языков программирования

5.Парадигмы программирования

Алгоритм относится к основным понятиям математики, а поэтому не имеет определения. Часто это понятие формулируют так:

"точное предписание о порядке выполнения действий, из заданного фиксированного множества, для решения всех задач, заданного класса".

Рассмотрим подробнее ключевые слова в этой формулировке:

"точное предписаниеозначает, что предписание однозначно и одинаково понимается всеми исполнителями алгоритма и при одних и тех же исходных данных любой исполнитель всегда получает один и тот же результат;

“из заданного фиксированного множества” означает, что множество действий, используемых в предписании, оговорено заранее и не может меняться в ходе исполнения алгоритма.

“решения всех задач, заданного класса” означает, что это предписание предназначено для решения класса задач, а не одной отдельной задачи.

Свойства алгоритма: дискретность, определенность, результативность, массовость, сложность.

1.Дискретность алгоритма. Свойство алгоритма, означающее, что процесс решения задачи, определяемый алгоритмом, расчленен на отдельные элементарные шаги и соответственно алгоритм представляет последовательность указаний, команд, определяющих порядок выполнения шагов процесса.

2.Определенность алгоритма. Это свойство означает, что каждая команда алгоритма (предписание, выдаваемое на каждом шаге) должна быть понятна исполнителю, не оставлять места для её неоднозначного толкования и неопределенного исполнения. Описание алгоритма должно быть таким, чтобы его мог выполнить любой грамотный пользователь.

3.Результативность алгоритма. Свойство алгоритма, состоящее в том, что он всегда приводит к результату через конечное, возможно, очень большое число шагов.

4.Массовость алгоритма. Это свойство заключается в том, что каждый алгоритм, разработанный для решения некоторой задачи должен быть применим для решения задач этого типа при всех допустимых значениях

vk.com/club152685050 | vk.com/id446425943

Лекция 1

2

исходных данных. Массовость предполагает существование четко определенного класса объектов, которые могут быть исходными данными.

5.Сложностью алгоритма называется количество действий в вычислительном процессе этого алгоритма.

Наука программирование (computer science) занимается исследованием свойств алгоритмов и разработкой методов построения программ. По своему положению и используемым методам она является областью прикладной математики. Все попытки подхода к программированию как к технической дисциплине, а к созданию программ как к промышленному производству, неизменно терпели неудачу.

Программирование предполагает запись алгоритмов на некотором алгоритмическом языке или языке программирования.

Алгоритмические языки

Первые языки программирования возникли относительно недавно. Различные исследователи указывают в качестве времени их создания 20-е, 30-е и даже 40-е годы XX столетия.

Программирование начиналось с записи программ непосредственно в виде машинных команд (в кодах, как говорят программисты), это было «программирование входа», когда программист с помощью специальных устройств набивал на перфоленты или перфокарты двоичные коды команд и входных данных. Дать команду – значило набрать набор двоичных кодов. Сравнительно скоро научились составлять наборы таких кодов и записывать их на носители. Позже для облегчения кодирования был разработан язык Ассемблера, который позволяет записывать машинные команды в символическом виде. Подход, который реализуется в Ассемблере называется операциональным (максимально приближен к двоичным кодам)

Недостатки:

1.Достаточная сложность языка Ассемблера для пользователя;

2.программы, написанные на языке Ассемблер, зависят от конкретной ЭВМ (вопрос о переносе программ);

3.Сложность программ и невозможность в них разобраться другому;

4.Невозможность тестирования программ, следовательно, программы были ненадежны;

5.Программы были плодом индивидуального творчества;

6.Для этих программ существовали только интерпретаторы.

Почти сразу с возникновением компьютеров были разработаны языки высокого уровня, т.е. языки, не зависящие от конкретной архитектуры. Для выполнения программы на языке высокого уровня ее нужно сначала перевести на язык машинных команд.

Специальная программа, выполняющая такой перевод, называется транслятором. Оттранслированная программа затем выполняется непосредственно компьютером. Трансляторы бывают двух типов

 

Трансляторы

Интерпретаторы

Компиляторы

vk.com/club152685050 | vk.com/id446425943

Лекция 1

 

 

3

 

 

Переводят

текст

программы в

Вначале создают исполняемый файл,

двоичные

коды

по отдельным

который

затем

можно

операторам операторам, при этом,

протестировать,

 

проверить.

при этом операторы сразу же

Компилятор

 

улавливает

исполняются.

 

синтаксические ошибки и сообщает о

 

 

 

них.

 

 

Наиболее распространенные компилируемые языки - это Си, C++, Фортран, Паскаль. Интерпретируемые языки - это языки, такие как Java, Visual Basic и C#.

Всередине 50-х годов под руководством Джона Бэкуса для фирмы IBM был разработан алгоритмический язык программирования FORTRAN (FORmula TRANslator). Создание этого языка, предоставляющего возможность записи алгоритма вычислений с использованием условных операторов и операторов ввода/вывода, стало точкой отсчета эры алгоритмических языков программирования.

Как альтернатива языку FORTRAN, первоначально ориентированному на архитектуру IBM, под руководством Питера Наура в конце 50-х годов был разработан язык ALGOL (ALGOrithmic Language). Основной целью,

преследуемой разработчиками этого языка, была независимость от конкретной архитектуры вычислительной системы. Кроме того, создатели языка ALGOL стремились разработать язык, удобный для описания алгоритмов и применяющий систему обозначений, близкую к той, что принята в математике.

Языки FORTRAN и ALGOL были первыми языками, ориентированными на программирование вычислений.

Язык PL/I, первые версии которого появились в начале 60-х годов, был первоначально ориентирован на IBM 360 и расширял возможности языка FORTRAN некоторыми средствами языка COBOL, разработанного в эти же годы. Несмотря на определенную популярность языка PL/I у программистов, работавших на компьютерах IBM и машинах серии ЕС, в настоящее время он представляет чисто теоретический интерес.

Вконце 60-х годов под руководством Найарда и Дала был разработан язык Simula-67, использующий концепцию пользовательских типов данных. Фактически это первый язык, применяющий понятие классов.

Всередине 70-х годов Вирт предложил язык Pascal, который сразу стал широко использоваться.

Вэто же время по инициативе Министерства обороны США началась работа по созданию языка высокого уровня, получившего название Ada – в честь Ады Лавлейс, программистки и дочери лорда Байрона.

Универсальный язык программирования С был разработан в середине 70-х годов Денисом Ритчи и Кеном Томпсоном. Этот язык стал популярным языком системного программирования и в свое время использовался для написания ядра операционной системы UNIX. Язык С лег в основу разработки языков программирования C++ и Java.

vk.com/club152685050 | vk.com/id446425943

Лекция 1

4

Языки высокого уровня значительно повышают эффективность труда разработчиков за счет абстрагирования от конкретных деталей аппаратного обеспечения. Одна инструкция (оператор) языка высокого уровня соответствовала последовательности из нескольких низкоуровневых инструкций, или команд. Исходя из того, что программа, по сути, представляла собой набор директив, обращенных к компьютеру, такой подход к программированию получил название императивного.

Еще одной особенностью языков высокого уровня была возможность повторного использования ранее написанных программных блоков, выполняющих те или иные действия, посредством их идентификации и последующего обращения к ним, например по имени. Такие блоки получили название функций или процедур, и программирование приобрело более упорядоченный характер.

Кроме того, с появлением языков высокого уровня зависимость реализации от аппаратного обеспечения существенно уменьшилась.

Нужно отметить, что операторы и ключевые слова новых языков программирования были более осмысленными, чем безликие цифровые последовательности кодов, что также обеспечивало повышение производительности труда программистов.

Все перечисленные выше языки реализуют так называемый императивный подход к программированию.

В60-х годах возникает новый подход к программированию, который до сих пор успешно конкурирует с императивным, а именно,

декларативный подход.

Суть подхода состоит в том, что программа представляет собой не набор команд, а описание действий, которые необходимо осуществить.

Этот подход существенно проще и прозрачнее формализуется математическими средствами. Следовательно, программы проще проверять на наличие ошибок (тестировать), а также на соответствие заданной технической спецификации (верифицировать).

Высокая степень абстракции также является преимуществом данного подхода. Фактически, программист оперирует не набором инструкций, а абстрактными понятиями, которые могут быть достаточно обобщенными.

Врамках декларативного подхода развивалось несколько направлений: - функциональные языки - языки логического программирования

Одним из путей развития декларативного стиля программирования

стал функциональный подход, возникший после создания языка LISP. Отличительной особенностью данного подхода является то, что любая

программа, написанная на таком языке, может интерпретироваться как функция с одним или несколькими аргументами.

Сложные программы при таком подходе строятся посредством агрегирования функций. При этом текст программы представляет собой функцию, некоторые аргументы которой можно также рассматривать как функции. Таким образом, повторное использование кода сводится к вызову

vk.com/club152685050 | vk.com/id446425943

Лекция 1

5

ранее описанной функции, структура которой, в отличие от процедуры императивного языка, математически прозрачна.

Достоинством функциональных языков является то, что программист сосредотачивается на области исследований (предметной области) и в меньшей степени заботится о рутинных операциях.

Недостатки: Часто к ним относят нелинейную структуру программы и относительно невысокую эффективность реализации. Однако первый недостаток достаточно субъективен, а второй успешно преодолен современными реализациями, в частности, рядом последних трансляторов языка SML, включая и компилятор для среды Microsoft .NET.

В70-х годах возникла еще одна ветвь языков декларативного программирования, связанная с проектами в области искусственного интеллекта, а именно языки логического программирования.

Согласно логическому подходу к программированию, программа представляет собой совокупность правил или логических высказываний. Кроме того, в программе допустимы логические причинно-следственные связи, в частности, на основе операции импликации.

Таким образом, языки логического программирования базируются на классической логике и применимы для систем логического вывода, в частности, для так называемых экспертных систем. На языках логического программирования естественно формализуется логика поведения, и они применимы для описаний правил принятия решений, например, в системах, ориентированных на поддержку бизнеса.

Важным преимуществом такого подхода является достаточно высокий уровень машинной независимости, а также возможность откатов – возвращения к предыдущей подцели при отрицательном результате анализа одного из вариантов в процессе поиска решения (скажем, очередного хода при игре в шахматы), что избавляет от необходимости поиска решения путем полного перебора вариантов и увеличивает эффективность реализации.

Одним из недостатков логического подхода в концептуальном плане является специфичность класса решаемых задач.

Другой недостаток практического характера состоит в сложности эффективной реализации для принятия решений в реальном времени, скажем, для систем жизнеобеспечения.

Нелинейность структуры программы является особенностью декларативного подхода и, строго говоря, представляет собой оригинальную особенность, а не объективный недостаток.

Вкачестве примеров языков логического программирования можно привести

Prolog (название возникло от слов PROgramming in LOGic) и Mercury.

Важным шагом на пути к совершенствованию языков программирования стало появление объектно-ориентированного подхода к программированию (ООП) и соответствующего класса языков.

Врамках данного подхода программа представляет собой описание объектов, их свойств (или атрибутов), совокупностей (или классов),

vk.com/club152685050 | vk.com/id446425943

Лекция 1

6

отношений между ними, способов их взаимодействия и операций над объектами (или методов).

Пожалуй, наиболее известным примером объектно-ориентированного языка программирования является язык C++, развившийся из императивного языка С. Его прямым потомком и логическим продолжением является язык С#.

Другим примером объектно-ориентированного языка является Object Pascal, развившийся из языков Pascal и Turbo Pascal.

Сложность адекватной (непротиворечивой и полной) формализации объектной теории порождает трудности тестирования и верификации созданного программного обеспечения. Вероятно, это обстоятельство является одним из самых существенных недостатков объектноориентированного подхода к программированию.

Развитием событийно управляемой концепции объектноориентированного подхода стало появление в 90-х годах целого класса языков программирования, которые получили название языков сценариев или скриптов.

Врамках данного подхода программа представляет собой совокупность возможных сценариев обработки данных, выбор которых инициируется наступлением того или иного события (щелчок по кнопке мыши, попадание курсора в определенную позицию, изменение атрибутов того или иного объекта, переполнение буфера памяти и т.д.). События могут инициироваться как операционной системой (в частности, Microsoft Windows), так и пользователем.

Основные достоинства языков данного класса унаследованы от объектно-ориентированных языков программирования. Это интуитивная ясность описаний, близость к предметной области, высокая степень абстракции, хорошая переносимость.

Существенным преимуществом языков сценариев является их совместимость с передовыми инструментальными средствами автоматизированного проектирования и быстрой реализации программного обеспечения, или так называемыми CASE- (Computer-Aided Software

Engineering) и RAD- (Rapid Application Development) средствами.

Естественно, что вместе с достоинствами объектно-ориентированного подхода языки сценариев унаследовали и ряд недостатков. К последним, прежде всего, относятся сложность тестирования и верификации программ и возможности возникновения в ходе эксплуатации множественных побочных эффектов, проявляющихся за счет сложной природы взаимодействия объектов и среды, представленной интерфейсами с большим количеством одновременно работающих пользователей программного обеспечения, операционной системой и внешними источниками данных.

Характерные примеры сценарных языков программирования: VBScript, PowerScript, LotusScript, JavaScript.

В90-х годах с распространением сети Интернет расширяется возможность распределенной обработки данных, что отражается и на развитии языков программирования. Появляются языки, ориентированные на

vk.com/club152685050 | vk.com/id446425943

Лекция 1

7

создание серверных приложений, такие как Java, Perl и PHP, языки описания документов – HTML и XML. Традиционные языки программирования С++ и Pascal также претерпевают изменения: под языком программирования начинает пониматься не только функциональность самого языка, а также библиотеки классов, предоставляемые средой программирования. Акцент со спецификации самих языков программирования переносится на стандартизацию механизмов взаимодействия распределенных приложений. Появляются новые технологии – COM и CORBA, специфицирующие взаимодействие распределенных объектов.

Еще один весьма важный класс языков программирования – языки поддержки параллельных вычислений.

Программы, написанные на этих языках, представляют собой совокупность описаний процессов, которые могут выполняться как в действительности одновременно, так и в псевдопараллельном режиме. В последнем случае устройство, обрабатывающее процессы, функционирует в режиме разделения времени, выделяя время на обработку данных, поступающих от процессов, по мере необходимости (а также с учетом последовательности или приоритетности выполнения операций).

Языки параллельных вычислений позволяют достичь заметного выигрыша при обработке больших массивов информации, поступающих от одновременно работающих пользователей, либо имеющих высокую интенсивность (как, например, видеоинформация или звуковые данные высокого качества).

Другой весьма значимой областью применения языков параллельных вычислений являются системы реального времени, в которых пользователю необходимо получить ответ от системы непосредственно после запроса. Такого рода системы отвечают за жизнеобеспечение и принятие ответственных решений.

Обратной стороной достоинств рассматриваемого класса языков программирования является высокая стоимость разработки программного обеспечения, следовательно, создание относительно небольших программ широкого (например, бытового) применения зачастую нерентабельно.

Примерами языков программирования с поддержкой параллельных вычислений могут служить Ada, Modula-2 и Oz.

Подводя итоги, кратко перечислим рассмотренные подходы к программированию:

ранние неструктурные (операциональные) подходы;

структурный или модульный подход (задача разбивается на подзадачи, затем на алгоритмы, составляются их структурные схемы и осуществляется реализация);

функциональный подход;

логический подход;

объектно-ориентированный подход;

смешанный подход (некоторые подходы можно комбинировать);