Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Документ'
Основные материалы Всероссийского совещания «О совместной работе государственных органов и татарских общественных объединений пот реализации национал...полностью>>
'Документ'
4. Потребность как необходимость 8 .5. Потребность как состояние 33 . . Потребность личности как системная реакция 35 .7. Вторичные потребности личнос...полностью>>
'Автореферат'
доктор педагогічних наук, професор Шиян Богдан Михайлович, Тернопільський національний педагогічний університет ім. В. Гнатюка, завідувач кафедри тео...полностью>>
'Документ'
Актуальность: в апреле 1924 года был издан первый сборник кроссвордов, что положило начало всемирному увлечению этой «крестословицей». За почти веков...полностью>>

Эволюция языков программирования

Главная > Документ
Сохрани ссылку в одной из сетей:

1

Смотреть полностью

Эволюция языков программирования

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

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

Создатели языков по-разному толкуют понятие язык программирования. К наиболее распространённым утверждениям, признаваемым большинством разработчиков, относятся следующие:

Функция: язык программирования предназначен для написания компьютерных программ, которые применяются для передачи компьютеру  по выполнению того или иного вычислительного процесса и организации управления отдельными .

Задача: язык программирования отличается от естественных языков тем, что предназначен для передачи  и данных от человека к компьютеру, в то время, как естественные языки используются для общения людей между собой. В принципе, можно обобщить определение «языков программирования» — это способ передачи команд, приказов, чёткого руководства к действию; тогда как человеческие языки служат также для обмена информацией.

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

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

Для многих широко распространённых языков программирования созданы международные стандарты. Специальные организации проводят регулярное обновление и публикацию спецификаций и формальных определений соответствующего языка. В рамках таких комитетов продолжается разработка и модернизация языков программирования и решаются вопросы о расширении или поддержке уже существующих и новых языковых конструкций.

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

Особая система, по которой данные организуются в программе, — это система типов языка программирования; разработка и изучение систем типов известна под названием теория типов. Языки могут быть классифицированы как системы со статической типизацией и языки с динамической типизацией.

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

Системы типов в языках высокого уровня позволяют определять сложные, составные типы, так называемые структуры данных. Как правило, структурные типы данных образуются как декартово произведение базовых (атомарных) типов и ранее определённых составных типов.

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

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

Наиболее широко распространены разновидности следующих трёх: операционного, денотационного (математического) и деривационного (аксиоматического).

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

Деривационная семантика описывает последствия выполнения конструкций языка с помощью языка логики и задания пред- и постусловий.

Денотационная семантика оперирует понятиями, типичными для математики — множества, соответствия, а также суждения, утверждения и др.

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

Несмотря на то, что большинство языков ориентировано на императивную модель вычислений, задаваемую фон-неймановской архитектурой ЭВМ, существуют и другие подходы. Можно упомянуть языки со стековой вычислительной моделью (, , и др.), а также  (, ,  и др.) и логическое программирование () и язык Рефал, основанный на модели вычислений, введённой советским математиком А. А. Марковым-младшим.

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

Языки программирования могут быть реализованы как  и .

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

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

Кратко говоря, компилятор переводит исходный текст программы на машинный язык сразу и целиком, создавая при этом отдельную машинно-исполняемую программу, а интерпретатор выполняет исходный текст прямо во время исполнения программы («интерпретируя» его своими средствами).

Разделение на компилируемые и интерпретируемые языки является условным. Так, для любого традиционно компилируемого языка, как, например, , можно написать интерпретатор. Кроме того, большинство современных «чистых» интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление (например, с разыменованием переменных и раскрытием макросов).

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

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

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

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

Некоторые языки, например,  и , находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, . Далее байт-код выполняетсявиртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, ). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine,), для C# — Common Language Runtime.

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

Современные языки программирования рассчитаны на использование , то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. Управляющие символы ASCII используются ограниченно: допускаются только возврат каретки CR, перевод строки LF и горизонтальная табуляция HT (иногда также вертикальная табуляция VT и переход к следующей странице FF).

Ранние языки, возникшие в эпоху 6-битных символов, использовали более ограниченный набор. Например, алфавит Фортрана включает 49 символов (включая пробел): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / () . , $ ' :

Заметным исключением является язык , в котором используется очень много специальных символов.

Использование символов за пределами ASCII (например, символов KOI8-R или символов Юникода) зависит от реализации: иногда они разрешаются только в комментариях и символьных/строковых константах, а иногда и в идентификаторах. В  существовали языки, где все ключевые слова писались русскими буквами, но большу́ю популярность подобные языки не завоевали (исключение составляет Встроенный язык программирования 1С:Предприятие).

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

Виды программирования

Игровое программирование

Типичный язык — 

Цель — для развлечения и поддержания навыков, фактически — беcцельно

Интерфейс — понятный себе

Научное программирование

Типичный язык — 

Цель — для решения конкретной задачии или очень узкого круга однотипных задач

Интерфейс — такой, чтоб можно было подойти и объяснить

Индустриальное программирование (зародилось лишь в )

Типичного языка нет

Цель — для решения чужих задач, т.е. происходит отчуждение программы

Интерфейс — поясненный обширной документацией, понятный интуитивно

Есть мнение, что ЯП — язык написания компьютерных программ. Но.

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

 — еще одна похожая нотация.

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

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

 — язык разметки текста с уклоном в последующее отображение

Язык Программирования — инструмент для планирования поведения исполнителя, в точности выполняющего предписания.

Это подразумевает однозначную трактовку текста на языке исполнителем (будь то ОС компьютера, веб-сервер Apache или миллион китайцев) с целью выполнения поставленной цели. И здесь мы встречаем важное отличие искусственных языков от естественных —однозначность.

Этапы развития ЯП

Итак, начнем. Обратимся к истокам развития вычислительной техники. Вспомним самые первые компьютеры и программы для них. Это была эра программирования непосредственно в машинных кодах, а основным носителем информации были перфокарты и перфоленты. Программисты обязаны были знать архитектуру машины досконально. Программы были достаточно простыми, что обуславливалось, во-первых, весьма ограниченными возможностями этих машин, и, во-вторых, большой сложностью разработки и, главное, отладки программ непосредственно на машинном языке. Вместе с тем такой способ разработки давал программисту просто невероятную власть над системой. Становилось возможным использование таких хитроумных алгоритмов и способов организации программ, какие и не снились современным разработчикам. Например, могла применяться (и применялась!) такая возможность, как самомодифицирующийся код. Знание двоичного представления команд позволяло иногда не хранить некоторые данные отдельно, а встраивать их в код как команды. И это далеко не полный список приемов, владение хотя бы одним из которых сейчас сразу же продвигает вас до уровня «гуру» экстра-класса.

Первым значительным шагом представляется переход к языку ассемблера (позволим себе маленькое лирическое отступление: английское название assembly language, или assembler, на русский переводят именно тем термином, который был использован выше. При этом у новичка создается впечатление, что язык назван в честь некоего человека по имени ассемблер. Достаточно забавная ситуация, не правда ли?). Не очень заметный, казалось бы, шаг — переход к символическому кодированию машинных команд — имел на самом деле огромное значение. Программисту не надо было больше вникать в хитроумные способы кодирования команд на аппаратном уровне. Более того, зачастую одинаковые по сути команды кодировались совершенно различным образом в зависимости от своих параметров (широко известный пример из мира современных компьютеров — это кодирование инструкции mov в процессорах Intel: существует несколько совершенно по-разному кодируемых вариантов команды; выбор того или иного варианта зависит от операндов, хотя суть выполняемой операции неизменна: поместить содержимое (или значение) второго операнда в первый). Появилась также возможность использования макросов и меток, что также упрощало создание, модификацию и отладку программ. Появилось даже некое подобие переносимости — существовала возможность разработки целого семейства машин со сходной системой команд и некоего общего ассемблера для них, при этом не было нужды обеспечивать двоичную совместимость.

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

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

В 1954 году в недрах корпорации IBM группой разработчиков во главе с Джоном Бэкусом (John Backus) был создан язык программирования Fortran.

Фортра́н (Fortran) — первый язык программирования высокого уровня, имеющий . Создан в период с  по 1957 год группой программистов под руководством Джона Бэкуса в корпорации  (язык , претендующий на пальму первенства, был изобретён ещё в 1945 году, но не был реализован вплоть до 2000 года). Название Fortran является аббревиатурой от FORmula TRANslator, то есть, переводчик формул. Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм. Среди учёных, например, ходит такая присказка, что любая математическая задача уже имеет решение на Фортране, и, действительно, можно найти среди тысяч фортрановских пакетов и пакет для перемножения , и пакет для решения сложных интегральных уравнений, и многие, многие другие. Ряд таких пакетов создавался на протяжении десятилетий и популярен (главным образом в научной среде) по сей день.

Значение этого события трудно переоценить. Это первый язык программирования высокого уровня. Впервые программист мог по-настоящему абстрагироваться от особенностей машинной архитектуры. Ключевой идеей, отличающей новый язык от ассемблера, была концепция подпрограмм. Напомним, что это современные компьютеры поддерживают подпрограммы на аппаратном уровне, предоставляя соответствующие команды и структуры данных (стек) прямо на уровне ассемблера, в 1954 же году это было совершенно не так. Поэтому компиляция Fortran’а была процессом отнюдь не тривиальным. Кроме того, синтаксическая структура языка была достаточно сложна для машинной обработки в первую очередь из-за того, что пробелы как синтаксические единицы вообще не использовались. Это порождало массу возможностей для скрытых ошибок, таких, например:

В Фортране следующая конструкция описывает «цикл for до метки 10 при изменении индекса от 1 до 100»: 
DO 10 I=1,100
Если же здесь заменить запятую на точку, то получится оператор присваивания:
DO10I = 1.100
Говорят, что такая ошибка заставила ракету взорваться во время старта!

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

Появление Фортрана было встречено еще более яростной критикой, чем внедрение ассемблера. Программистов пугало снижение эффективности программ за счет использования промежуточного звена в виде компилятора. И эти опасения имели под собой основания: действительно, хороший программист, скорее всего, при решении какой-либо небольшой задачи вручную напишет код, работающий быстрее, чем код, полученный как результат компиляции. Через некоторое время пришло понимание того, что реализация больших проектов невозможна без применения языков высокого уровня. Мощность вычислительных машин росла, и с тем падением эффективности, которое раньше считалось угрожающим, стало возможным смириться. Преимущества же языков высокого уровня стали настолько очевидными, что побудили разработчиков к созданию новых языков, все более и более совершенных.

1954–1957 — появление языка , первого языка программирования высокого уровня. Через 10 лет после выхода FORTRAN, в  в США уже использовалось более 400 языков. Тем не менее из всего многообразия языков можно выделить некоторое количество знаковых.

Научно-технические расчеты — FORTRAN

Версии FORTRAN: FORTRAN I (), FORTRAN II, FORTRAN IV (), FORTRAN 66 (), FORTRAN 77 (), FORTRAN 96 ()

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

Пример: Фортран глотает пробелы, что резко повышает число ошибок

цикл

(FORTRAN)

DO 10 I=1,3

операторы

10: CONTINUE

Здесь трижды выполняется тело цикла

он же, но с ошибкой

(FORTRAN)

DO 10 I=1.3

операторы

10: CONTINUE

Здесь переменной DO10I присваивается 1.3, затем однажды выполняется тело цикла

Надёжность программы — свойство программы, которое обратно пропорционально количеству ошибок в ней.

Аксиома. Абсолютно надёжных программ не бывает.

Форма записи языковых конструкций на FORTRAN не способствует созданию надёжных программ (пример с точкой вместо запятой), тем не менее, FORTAN — самый успешный язык программирования. Стандарты FORTRAN выпускались в , ,  годах, самой популярной версией является стандарт FORTRAN  года. Успешность FORTRAN связана с успешностью занятияэкологической ниши языка программирования.

Языки программирования подобны биологическим видам, в среде языков программирования, также, как и в биологической среде, выживание одни виды и вымиырают другие. При этом даже более приспособленным видам трудно выгнать из ниши того, кто ее ужезанял. Экологической нишей для ЯП является его проблемная область. Самой первой проблемной областью являлись научно-технические расчёты, FORTRAN же был транслятором формул, что следует из его названия (FORTRAN = Formula Translator).

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

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

Мобильность ПО — переносимость ПО с одной системы на другую.

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

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

Algol-60

В 1960 году командой во главе с Петером Науром (Peter Naur) был создан язык программирования Algol. Этот язык дал начало целому семейству Алгол-подобных языков (важнейший представитель — Pascal). В 1968 году появилась новая версия языка. Она не нашла столь широкого практического применения, как первая версия, но была весьма популярна в кругах теоретиков. Язык был достаточно интересен, так как обладал многими уникальными на так момент характеристиками.

Алго́л ( Algol от  algorithmic — алгоритмический и  language — язык) — название ряда языков программирования, применяемых при составлении программ для решения научно-технических задач на ЭВМ. Разработан комитетом по языку высокого уровня IFIP в 1958—1960 гг. (Алгол-58, Алгол-60); усовершенствован в 1964—1968 гг. (Алгол 68). Алгол относится к языкам высокого уровня и позволяет легко переводить алгебраические формулы в программные команды. Алгол был популярен в Европе, в том числе в СССР, в то время как сравнимый с ним язык  был распространён в США и Канаде. Оказал заметное влияние на все разработанные позднее императивные языки программирования — в частности, на язык .

 (Algol-58) — сделаны научной группой во главе с IFIP — язык для обменя алгоритмами между учёными различных стран и специальностей. Впервые для описания синтаксиса был применён формальный язык (БНФ). Algol получился достаточно простым и достаточно мощным. Например, программы на Algol впервые имели блочную структура, также была возможность использования рекурсии. В результате Algol стал стандартом для изучения в университетах и т. д.

Роль Algol-60 не только как учебного языка, но и как языка-предчети, например, для языка .

Основная проблема Algol-60 в том, что по своей структуре Algol-60 был похож на FORTRAN и заточен под НТР, посему они претендовали на одну нишу. FORTRAN вытеснил Algol из ниши НТР. Важным в этой нише является быстродействие и совместимость, характеризуются они простотой программ.

Быстродействие языка (эффективность) — усреднённое отношение времени выполнения программ, написанных на ЯП, к времени выполнения программам, написанных на ассемблере машины.

Эффективность = Plang / Pasm

FORTRAN достиг такого уровня, что для FORTRAN О mdash; оптимизированной версии (IBM выпускала две версии FORTRAN mdash; FORTRAN H (для отладки) и FORTRAN О) mdash этот показатель был равен 1,04. Для Algol он находился в пределах 7–10. В Algol были неэффективные способы передачи параметров в функции. Кроме того, существовавшие в то время архитектуры не были приспособлены к реализации Algol-60, например к блочной структуре программ. Для такой структуры характерно хранение данных в стеке, аппаратной реализации которого тогда не делали, и стек приходилось моделировать вручную. Язык оказался слишком неэффективный.

Коммерческие задачи — COBOL

Ещё одной нишей, появившейся чуть позднее, являются коммерческие задачи — приложения по обработке коммерческой информации. Они характерны малым объёмом простых вычислений над большим объёмом данных, и для таких приложений требовался интенсивный ввод-вывод. В результате в  году появился язык  (Common-Oriented Business Language).

В 1960 году был создан язык программирования Cobol.

Он задумывался как язык для создания коммерческих приложений, и он стал таковым. На Коболе написаны тысячи прикладных коммерческих систем. Отличительной особенностью языка является возможность эффективной работы с большими массивами данных, что характерно именно коммерческих приложений. Популярность Кобола столь высока, что даже сейчас, при всех его недостатках (по структуре и замыслу Кобол во многом напоминает Фортран) появляются новые его диалекты и реализации. Так недавно появилась реализация Кобола, совместимая с Microsoft .NET, что потребовало, вероятно, внесения в язык некоторых черт объектно-ориентированного языка.

Кобо́л (COBOL, COmmon Business Oriented Language) — язык программирования третьего поколения (первая версия в ), предназначенный, в первую очередь, для разработки бизнес-приложений.

IBM в те годы выпускала две линейки компьютеров — 709 для научных вычислений, и на которых основным языком программирования являлся FORTRAN, и 14хх для коммерческих задач, которые были ориентированы на интенсивный ввод-вывод.

Тем не менее, у COBOL тоже имелись недостатки в архитектуре. Например, в языке COBOL стандартным представлением даты была структура фиксированного вида MMDDYY, что явилось одной из основной причин проблемы  года. В настоящее время данный язык является практически мёртвым, он умер только из-за проблемы 2000. До этого момента он держал нишу довольно крепко.

Кстати, именно проблема 2000 послужила одним из стимулов к разработкам в области реверсного инженеринга (перевода программ с одного языка на другой), поскольку пользователям COBOL при миграции на другие языки хотелось сохранить и повторно использовать написанные проекты.

Символьная обработка — LISP

В 1958 году появился язык Lisp — язык для обработки списков. Получил достаточно широкое распространение в системах искусственного интеллекта. Имеет несколько потомков: Planner (1967), Scheme (1975), Common Lisp (1984). Многие его черты были унаследованы современными языками функционального программирования.

Ещё один знаковый язык —  (LISt Processing). Используется для задач символьной обработки, ИИ. Существует множество диалектов, самый популярный — Common LISP. Не применяется для индустриальных программ, т. к. низкоэффективен (использует списки и деревья, основная операция — применение функции, чем он и силён).

Лисп (LISP, от  LISt Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования,  и данные в которых представляются системами линейных списков . Лисп является вторым в истории (после ) высокоуровневым языком программирования, который используется по сей день. Создатель Лиспа Джон Маккарти занимался исследованиями в области искусственного интеллекта и созданный им язык по сию пору является одним из основных средств моделирования различных аспектов ИИ.

Ниши разобраны

 год. Уже тогда были разобраны все ниши: для системного программирования применялся ассемблер, для прикладного программирования — LISP, COBOL, для научного примененеия — FORTRAN, для обучения — Algol-60.

1960–1980: Поиски Священного Грааля

До  года происходил экстенсивный рост количества языков программирования. Джон Саммит в  году наcчитал 400 языков, применяемых в США.

Тем не менее, в то время появилось много известных языков. То время характеризовалось поиском Священного Грааля — единого универсального языка программирования, который применялся бы во всех областях. Первой с этой проблемой столкнулась IBM, которая поняла, что поддерживать две линейки накладно, посему в  году они начали работу над проектом IBM 360 (360 градусов — полный круг решаемых задач), им хотелось иметь единый ЯП.

Первая попытка создания единого языка программирования — PL/1

В 1964 году все та же корпорация IBM создала язык PL/1, который был призван заменить Cobol и Fortran в большинстве приложений. Язык обладал исключительным богатством синтаксических конструкций. В нем впервые появилась обработка исключительных ситуаций и поддержка параллелизма. Надо заметить, что синтаксическая структура языка была крайне сложной. Пробелы уже использовались как синтаксические разделители, но ключевые слова не были зарезервированы. В частности, следующая строка — это вполне нормальный оператор на PL/1:

IF ELSE=THEN THEN THEN; ELSE ELSE 

В силу таких особенностей разработка компилятора для PL/1 была исключительно сложным делом. Язык так и не стал популярен вне мира IBM.

 — появление  (New Programming Language), позднее переименованного в . Создавался комитетом. В нём были смешаны основные ЯП. Конструкции из FORTRAN, Блочная структура из Algol, понятие записи из Кобола. Майерс сказал — «PL/1 был бы хорошим языком программирования, если из него выкинуть 80 процентов возможностей».

ПЛ/1 (PL/I, Programming Language I — «Язык программирования номер один», в русском языке произносится «пиэ́ль оди́н») — разработанный в 1964 году язык программирования, созданный для научных, инженерных и бизнес-ориентированных вычислений. Он содержит такой широкий набор синтаксических конструкций и встроенных функций, что, вероятно, не существует ни одного компилятора, поддерживающего все возможности языка ПЛ/1. ПЛ/1 поддерживает  и структурное программирование, и его основная область применения — обработка данных.

В PL/1 могло быть до 30 атрибутов у типов данных — это слишком много. Все запомнить невозможно, поэтому вводились правила-умолчания. IBM выпускала две версии трансляторов (по аналогии с FORTRAN) — PL O (отладочный) и PL F (быстрый), но они были немного разными — программа, работающая после трансляции отладочной версией, могла вылетать во время работы после трансляции быстрой. Да и спецификации языка чуть отличались.

Только IBM сложила в PL/1 несколько миллиардов, но как язык для промышленных приложений PL/1 провалился из-за своей большой сложности.

Анекдот:

— Что такое верблюд?

— Это лошадь, созданная комитетом.

Вторая попытка — Algol-68

 — вторая попытка создания универсального языка, создан IFIP, состав которой отличался от группы, создавшей Algol-60. Специально для описания языка были придуманы W-грамматики (W от Вирт), которые позволяли описываать и синтаксис, и семантику языка. Язык являлся технически совершенным. В частности, в Algol-68 была попытка создать ортогональный язык.

Алго́л 68 ( Algol 68 от  algorithmic — алгоритмический и  language — язык) — процедурный императивныйвысокоуровневый язык программирования, потомок языка , существенно доработанный. Разрабатывался в период -годов. Позиционировался как универсальный язык для описания произвольных алгоритмов обработки данных высокой сложности. Отличается большим объёмом, богатством возможностей и сложностью синтаксиса.

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

Например, в  конструкция

(Pascal)

for i := i1 to i2 do

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

Выражения и операторы не являются ортогональными.

В Algol-68 выражение, после которого стоит «;» (точка с запятой) превращается в оператор. И у операторов есть значения. Везде, где может стоять выражение, может стоять оператор, и наоборот. Таким образом, Algol-68, в отличие от даже , практически полностью ортогональный язык.

Пересмотренное сообщение об Algol-68 вышло через 11 лет. В нём были эпиграфы из Винни-Пуха. Больше ничего там читать невозможно. Algol-68 — первый и последний язык, в котором формально описана семантика.

Algol-68 оказался слишком сложным. Был сделан транслятор, скорость которого была нескеолько операторов в минуту, а эффективность получаемого кода на уровне Algol-60. В результате Algol-68 никакую нишу не занял.

Аналогичная история произошла с UNIX. Изначально разрабатывался MULTIX, но из него вышли некоторые люди и начали писать UNIX (MULTIX — много, UNIX — одиночка).

 — PL/1

 — Algol-68

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

В 1958 году на языке  запрограммировали первые противоракетные сооружения. Так они и работали десятки лет. Но для сопровождения все время нужно было обучать новых программистов. И так дела обстояли со всеми мало-мальски крупными проектами.

В 1963 году в Дартмурском колледже (Dartmouth College) был создан язык программирования BASIC (Beginners’ All-Purpose Symbolic Instruction Code — многоцелевой язык символических инструкций для начинающих). Язык задумывался в первую очередь как средство обучения и как первый изучаемый язык программирования. Он предполагался легко интерпретируемым и компилируемым. Надо сказать, что BASIC действительно стал языком, на котором учатся программировать (по крайней мере, так было еще несколько лет назад; сейчас эта роль отходит к Pascal). Было создано несколько мощных реализаций BASIC, поддерживающих самые современные концепции программирования (ярчайший пример — Microsoft Visual Basic).

Бе́йсик (от BASIC, сокращение от  Beginner’s All-purpose Symbolic Instruction Code — универсальный код символических инструкций для начинающих;  basic — основной, базовый) — семейство высокоуровневых языков программирования.

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

Одной из «визитных карточек» Эдсгера Дейкстры стало высказывание: «Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации». Однако, это высказывание цитируется вне контекста, в котором Дейкстра подверг критике и многие другие популярные в то время языки.

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

Появление С и Pascal. Простота против сложности

Этимология названия языка : CPL (Cambribge Programming Language) — BCPL — B — C

 — появление языка С — «машинонезависимого ассемблера» (). В нём впервые ввод-вывод был выведен из языка. Язык оказался достаточно мощным, чтобы на нём написать системные библиотеки, в т. ч. библиотеку ввода-вывода. Чёткая экологическая ниша — cистемное программирование замена — языка ассемблер.

Си ( C) —   язык программирования, разработанный в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как развитие языка . Си был создан для использования в операционной системе . С тех пор он был  на многие другие операционные системы и стал одним из самых используемых языков программирования. Си ценят за его эффективность. Он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ. Несмотря на то, что Си не разрабатывался для новичков, он активно используется для обучения . В дальнейшем  языка Си стал основой для многих других языков

В 1972 году Керниганом и Ритчи был создан язык программирования C. Он создавался как язык для разработки операционной системы UNIX. C часто называют «переносимым ассемблером», имея в виду то, что он позволяет работать с данными практически так же эффективно, как на ассемблере, предоставляя при этом структурированные управляющие конструкции и абстракции высокого уровня (структуры и массивы). Именно с этим связана его огромная популярность и поныне. И именно это является его ахиллесовой пятой. Компилятор C очень слабо контролирует типы, поэтому очень легко написать внешне совершенно правильную, но логически ошибочную программу.

В 1986 году Бьярн Страуструп создал первую версию языка C++, добавив в язык C объектно-ориентированные черты, взятые из Simula (см. ниже), и исправив некоторые ошибки и неудачные решения языка. C++ продолжает совершенствоваться и в настоящее время, так в 1998 году вышла новая (третья) версия стандарта, содержащая в себе некоторые довольно существенные изменения. Язык стал основой для разработки современных больших и сложных проектов. У него имеются, однако же, и слабые стороны, вытекающие из требований эффективности.

В 1995 году в корпорации Sun Microsystems Кеном Арнольдом и Джеймсом Гослингом был создан язык Java. Он наследовал синтаксис C и C++ и был избавлен от некоторых неприятных черт последнего. Отличительной особенностью языка является компиляция в код некоей абстрактной машины, для которой затем пишется эмулятор (Java Virtual Machine) для реальных систем. Кроме того, в Java нет указателей и множественного наследования, что сильно повышает надежность программирования.

В 1999–2000 годах в корпорации Microsoft был создан язык C#. Он в достаточной степени схож с Java (и задумывался как альтернатива последнему), но имеет и отличительные особенности. Ориентирован, в основном, на разработку многокомпонентных Интернет-приложений.

В  году  написал . «Мне надоело» — сказал Вирт о том, что раньше он просто не мог объяснять студентам язык, который нельзя объяснить логично. Pascal очень быстро занял образовательную нишу. Дейкстра: «Языки типа FORTRAN и COBOL калечат мозги и поэтому их преподавание должно приравниваться к преступлению». На основе Pascal создано множество более современных и удачных ЯП (Turbo Pascal, ), используемых в индустриальном программировании.

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

Отрицательной чертой языка было отсутствие в нем средств для разбиения программы на модули. Вирт осознавал это и разработал язык Modula-2 (1978), в котором идея модуля стала одной из ключевых концепций языка. В 1988 году появилась Modula-3, в которую были добавлены объектно-ориентированные черты. Логическим продолжением Pascal и Modula являются язык Oberon и Oberon-2. Они характеризуются движением в сторону объектно- и компонентно- ориентированности.

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

В результате, простота оказалась лучше сложности.

Третья попытка — Язык Ada

В Пентагоне поняли, что денег на программистов уходит много. Проанализировали расходы на ПРО систем реального времени. И получилось:

50% — вложено в систему после того, как её приняли в разработку — сопровождение (maintenance)

25% — тестирование и исправление ошибок

15% — составление документации и спецификаций

10% — написание кода

При первом запуске системы ПРО она стреляла по Луне — явная ошибка, которую трудно выявить на этапе проектирования.

Отсюда следует острая необходимость сопровождения.

Дорогое сопровождение за счёт отсутствия стандартизации языка.

Как оказалось, в Пентагоне (Минобороны) использовалось 350 языков, из них 10 популярных, остальные крайне редки, поэтому и так дорого сопровождение. Так почему же оружие стандартизированно, а ЯП нет?

Как следствие, было принято решение в унифицировать ЯП — в результате которого должны были быть выбраны порядка трёх ЯП. Вначале был создан Комитет и первый список требований, потом второй список требований и т. д. В ходе анализа требований выяснилось, что достаточно одного ЯП, «Стальные требования». Изначально было выделено три языка, на которые должен быть похож кандидат:

Pascal

Algol-68

PL/1

Был объявлен тендер, и из 12 языков были выбраны 4, все на основе Pascal, на втором этапе был выбран один, который назвали языком  (). Окончательный стандарт языка вышел в  году. Стандарт запрещал как создание над-, так и подмножеств. К тому же планировалось, что Пентагон будет закупать программы только на языке Ada. Также был создан верификатор программ. Также предполагалось использовать только сертифицированные компиляторы.

В 1983 году под эгидой Министерства Обороны США был создан язык Ada. Язык замечателен тем, что очень много ошибок может быть выявлено на этапе компиляции. Кроме того, поддерживаются многие аспекты программирования, которые часто отдаются на откуп операционной системе (параллелизм, обработка исключений). В 1995 году был принят стандарт языка Ada 95, который развивает предыдущую версию, добавляя в нее объекно- ориентированность и исправляя некоторые неточности. Оба этих языка не получили широкого распространения вне военных и прочих крупномасштабных проектов (авиация, железнодорожные перевозки). Основной причиной является сложность освоения языка и достаточно громоздкий синтаксис (значительно более громоздкий, чем Pascal).

А́да (Ada) — язык программирования, созданный в — в результате проекта, предпринятого Министерством обороны США с целью разработать единый язык программирования для встраиваемых систем (то есть систем управления автоматизированными комплексами, работающими в реальном времени). Имелись в виду, прежде всего, бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.). Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области. Язык назван в честь Ады Лавлэйс.

Создатели Ada — французская группа. Кроме того, она написала обоснование проекта, в котором были указаны основные особенности дизайна языка:

Надёжность

Статический контроль — проверки при трансляции (например, выход за границы массива для a[10])

Квазистатический контроль — проверки при выполнении (выход за границы массива для a[i])

Эффективность

Все, что летает, стреляет и падает в реальном времени, должно реагировать быстро. Ada не была столь быстра.

Читабельность

Обязательное требование для maintance

Механизм обработки исключений впервые появился в языке Ada.

Главным понятием в Ada было понятие АТД (Абстрактный Тип Данных).

Тем не менее, язык Ada оказался чересчур сложным. Сложный язык — сложный компилятор. Скорость трансляции — 3 строки в минуту.

Объектно-ориентированные языки программирования

Появилась новая парадигма — ООП. Она довольно быстро завоевала популярность, посему не объектно-ориентированные языки или погибли, или в них добавили ООП (Pascal, C)

 — SmallTalk V

 — 

и другие объектные ЯП.

 —  (описание на 40 страниц)

Ada вымерла, т. к. не поддерживала объектно-ориентированную парадигму, была очень сложна и очень медленна.

 — Ada 95, включившая в себя еще и объектно-ориентированную парадигму. Стало еще сложнее и неподъемнее. Больше грааль не искали.

Неоднозначности в языках программирования

Например, в Algol-60: Условие записывается в двух формах:

(Algol-60)

if b then

S1

(Algol-60)

if b then

S1

else

S2

Если записать

(Algol-60)

if B then

S

if B then

S1

else

S2

то возникает неоднозначность: непонятно, куда относится S2 — ко внутреннему условию или ко внешнему. Эта неоднозначность была найдена .

Этапы развития ЯП

Все основные идеи появились в первые 15–20 лет, всё новое — хорошо забытое старое.

Второй этап развития языков программирования

Второй этап развития языков программирования (20–25) лет. Знаменовался экспоненциальным ростом ЯП и тремя попытками создания универсальных языков программирования: , , . Все три проекта были обречены на неудачу. Все три языка провалились из-за повышенной сложности.  и  отличает предельная простота.

Два основных принципа дизайна ЯП

Создание ЯП аналогично собиранию вещей в путь.

принцип сундучка — брать все то, что в принципе может понадобиться

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

Ключевое понятие — технологическая потребность.

Какие свойства критичны с точки зрения индустриального программирования:

Технологические потребности

Особенно — раздельная компиляция

Объектная ориентация

Производительность кода

Недостаток Ada и  — они не являются объектно-ориентированными языками. Но Modula-2 все равно лучше, так как проще.

1967 — Simula-2

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

Первым объектно-ориентрованным языком был язык Simula (1967). Этот язык был предназначен для моделирования различных объектов и процессов, и объектно-ориентированные черты появились в нем именно для описания свойств модельных объектов.

Си́мула-67 (Simula 67) — первый в мире язык программирования. Разработан в конце 60-х сотрудниками Норвежского Вычислительного Центра () Кристеном Нюгором и Уле-Йоханом Далем для моделирования сложных систем.

1980 — Smalltalk V

Apple писала на , фактически это было основой систем LISA. Первая версия Windows также поддерживала вызов процедур как на Pascal, так и на  (отличаются передачей параметров).

ООП языки должны поддерживать все эти вещи ( поддерживал):

Наличие понятие объекта, типа данных, инкапсуляции

Наследование

Полиморфизм

Переопределение стандартных операций, например, операции «+» (в  такого нет)

Переопределение методов. По-разному для разных объектов

Smalltalk погубила его неэффективность.

Популярность объектно-ориентированному программированию принес язык Smalltalk, созданный в 1972 году. Язык предназначался для проектирования сложных графических интерфейсов и был первым по-настоящему объектно-ориентированным языком. В нем классы и объекты — это единственные конструкции программирования. Большим недостатком Smalltalk являются большие требования к памяти и низкая производительность полученных программ. Это связано с не очень удачной реализацией объектно-ориентированных особенностей. Популярность языков C++ и Ada 95 связана именно с тем, что объектно- ориентированность реализована без существенного снижения производительности.

Smalltalk (произносится [смо́лток]) — язык программирования с динамической типизацией, разработанный в Xerox PARC Аланом Кэйем, Дэном Ингаллсом, Тедом Кэглером, Адель Голдберг, и другими в 1970-х годах. Язык был представлен как Smalltalk-80 и с тех пор широко используется. Smalltalk продолжает активно развиваться и собирает вокруг себя сообщество пользователей.

1979–… — C++

  нравилась всем, кроме эффективности.

Страуструп хотел разработать язык, который был бы так же строен и красив, как Simula, и эффективен, как ассемблер. А так как он работал в Bell Labs для AT&T, то в качестве основы был выбран С, в результате язык получил название «С с классами» ("C with classes"). Основным критерием при создании С с классами была совместимость, в частности, с UNIX и её системными библиотеками.

 — язык получил имя . Этот язык не имел никаких квазистатических проверок, что существенно ускоряло работу.

В Kernigan&Ritchie C при отсутствии поля выдавалось только предупреждение, а не ошибка. P->fld при отсутствии поля fld заменялся просто на P

В последних версиях появился квазистатический контроль — dynamic_cast.

С++ добавил к С две мощные концепции:

Концепция класса

Аппарат наследования (в т. ч. множественного) и полиморфизма

Все перечисленные преимущества позволили языку получить статус профессионального.

C++ (произносится «си плюс плюс») — статически типизированный язык программирования общего назначения. Поддерживая разные парадигмы программирования, сочетает свойства как , так и языков. В сравнении с его предшественником — языком , — наибольшее внимание уделено поддержке и обобщённого программирования. Название «C++» происходит от языка C, в котором унарный оператор ++ обозначает переменной.

1988 — Oberon и Eiffel

 получил премию Тьюринга за изобретение совокупности языков программирования (Algol W, , , , ,, , ).

Из Modula было выкинуто определённое количество конструкций и добавлено наследование. Сообщение об Обероне занимало 10 страниц. Компилятор составлял 4000 строк.

Оберон — язык программирования высокого уровня, разработанный Никлаусом Виртом, для исполнения программ на котором предназначена операционная система, авторами которой являются Н. Вирт и Юрг Гуткнехт (Jurg Gutknecht).

Eiffel — широко известен в узких кругах.

Существует язык с очень хорошей реализацией объектно- ориентированности, не являющийся надстройкой ни над каким другим языком. Это язык Eiffel (1986). Являясь чистым языком объектно-ориентированного программирования, он, кроме того, повышает надежность программы путем использования «контрольных утверждений».

Eiffel (Эйфель) — объектно-ориентированный язык программирования с алголоподобным синтаксисом, разработанный Бертраном Мейером. В этом языке впервые был реализован метод контрактного программирования.

Современные объектно-ориентированные языки программирования

 — наследник языка Turbo Pascal. В Turbo Pascal 6 можно вызывать функцию как процедуру.

В этих языках объекты заводятся только в динамической памяти.

 —  (Borland)

 —  (Sun)

 —  (Microsoft)

В этих языках реализованы схожие идеи и модные нынче тенденции.

Java — основной язык для создания программ в гетерогенной среде (Сети).

Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems. Приложения Java обычно в специальный , поэтому они могут работать на любой виртуальной Java-машине (JVM) независимо от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.

Одним из принципов Java является принцип WORA — Write Once, Run Anywhere. Это достигнуто с помощью Java Virtual Machine (JVM). Был разработан байт-код, который эта машина интерпретирует уже на конкретной архитектуре. Корни: UCSD Pascal. Для разных версий Pascal писался интерпретатор P-кода, который получался при компиляции в него.

В Microsoft решили, что определяющим является не язык, а библиотека, и сделали .NET и CLR (Common Language Runtime). Был создан MIL — Microsoft Intermediate Language, в который транслируется код на разных языках.

С#, VC++.NET, , => MIL (байт-код)

Различия между JVM и MIL: JVM интерпретируется, MIL компилируется JIT-компилятором (Just In Time).

MS JVM была быстрее Sun JVM из-за того, что у MS опыта больше в создании JIT-компиляторов (полученного ещё во времена разработки Visual Basic).

Microsoft Visual Basic — средство разработки программного обеспечения, разрабатываемое корпорацией и включающее язык программирования и среду разработки. Язык Visual Basic унаследовал дух, стиль и отчасти синтаксис своего предка — языка , у которого есть немало диалектов. В то же время Visual Basic сочетает в себе и элементы и языков программирования. Среда разработки VB включает инструменты для визуального конструирования пользовательского интерфейса.

Delphi — компромисс между VB и С++.

Delphi (Де́лфи, произносится ) — среда программирования, в которой используется язык программирования Object Pascal. Начиная со среды разработки Delphi 7.0, в официальных документах стала использовать название Delphi для обозначения языка Object Pascal.

C# — замена от MS, вытеснившая Delphi из своей ниши.

C# (произносится си-шарп) — язык программирования. Разработан в —2001 годах группой инженеров под руководством Андерса Хейлсберга в компании как основной язык разработки приложений для платформы Microsoft .NET и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270. с C# входит в стандартную установку самой .NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств, вроде Visual Studio.

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

В 1957 году была предпринята попытка создания языка для описания математической обработки данных. Язык был назван APL (Application Programming Language). Его отличительной особенностью было использование математических символов (что затрудняло применение на текстовых терминалах; появление графических интерфейсов сняло эту проблему) и очень мощный синтаксис, который позволял производить множество нетривиальных операций прямо над сложными объектами, не прибегая к разбиению их на компоненты. Широкому применению помешало, как уже отмечалось, использование нестандартных символов как элементов синтаксиса.

APL (A Programming Language или, возможно, Array Programming Language) — язык программирования, оптимизированный для работы с , предшественник современных научных вычислительных сред, таких как , использует функциональную парадигму программирования.

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

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

Icon — язык программирования, унаследовавший идеологию более раннего языка того же автора . Название языка не имеет ничего общего с «иконками», а является сокращением от слова  iconoclastic (иконоборческий), используемом в смысле борьбы с конформизмом в разработке языков программирования.

В 1969 году был создан язык SETL — язык для описания операций над множествами. Основной структурой данных в языке является множество, а операции аналогичны математическим операциям над множествами. Полезен при написании программ, имеющих дело со сложными абстрактными объектами.

Сетл (SETL) — язык программирования, ориентированный на работу со , разработанный в конце годов группой профессора Нью-йоркского университета Джекобом Шварцем. Наименование языка SETL — сокращение от SET Language  (англ.), где SET переводится как «множество», то есть дословно «Язык множеств».

В последнее время в связи развитием Интернет-технологий, широким распространением высокопроизводительных компьютеров и рядом других факторов получили распространение так называемые скриптовые языки. Эта языки первоначально ориентировались на использование в качестве внутренних управляющих языков во всякого рода сложных системах. Многие из них, однако же, вышли за пределы сферы своего изначального применения и используются ныне в совсем иных областях. Характерными особенностями данных языков являются, во-первых, их интерпретируемость (компиляция либо невозможна, либо нежелательна), во-вторых, простота синтаксиса, а в-третьих, легкая расширяемость. Таким образом, они идеально подходят для использования в часто изменяемых программах, очень небольших программах или в случаях, когда для выполнения операторов языка затрачивается время, несопоставимое со временем их разбора. Было создано достаточно большое количество таких языков, перечислим лишь основные и наиболее часто используемые.

JavaScript — язык программирования. Является языка

Язык был создан в компании Netscape Communications в качестве языка для описания сложного поведения веб-страниц. Первоначально назывался LiveScript, причиной смены названия получили маркетинговые соображения. Интерпретируется браузером во время отображения веб-страницы. По синтаксису схож с Java и (отдаленно) с C/C++. Имеет возможность использовать встроенную в браузер объектную функциональность, однако подлинно объектно-ориентированным языком не является.

Visual Basic Scripting Edition (обычно просто VBScript) — язык программирования, интерпретируемый компонентом Windows Script Host. Он широко используется при создании скриптов в операционных системах семейства Microsoft Windows.

Язык был создан в корпорации Microsoft во многом в качестве альтернативы JavaScript. Имеет схожую область применения. Синтаксически схож с языком Visual Basic (и является усеченной версией последнего). Так же, как и JacaScript, исполняется браузером при отображении веб-страниц и имеет ту же степень объектно- ориентированности.

Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой , которая расшифровывается как Practical Extraction and Report Language «практический язык для извлечения данных и составления отчётов». Первоначально аббревиатура состояла из пяти символов и в таком виде в точности совпадала с английским словом pearl, жемчужина. Но затем стало известно, что такой язык существует (см. ) и букву «а» убрали. Талисманом языка Perl является  — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

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

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

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

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

Язык программирования Оккам ( Occam) — это язык параллельного программирования высокого уровня, разработанный в начале 1980-х годов группой учёных из Оксфорда под руководством Дэвида Мэя ( David May) по заданию английской компании INMOS Ltd. в рамках работ по созданию . Назван в честь английского философа XIV века Уильма Оккамского, а его сентенция, известная как бритва Оккама, является девизом проекта.

Язык Оccam был создан в 1982 году и предназначен для программирования транспьютеров — многопроцессорных систем распределенной обработки данных. Он описывает взаимодействие параллельных процессов в виде каналов — способов передачи информации от одного процесса к другому. Отметим особенность синтаксиса языка Щccam — в нем последовательный и параллельный порядки выполнение операторов равноправны, и их необходимо явно указывать ключевыми словами PAR и SEQ.

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

В 1985 году была предложена модель параллельных вычислений Linda. Основной ее задачей является организация взаимодействия между параллельно выполняющимися процессами. Это достигается за счет использования глобальной кортежной области (tuple space). Процесс может поместить туда кортеж с данными (то есть совокупность нескольких, возможно разнородных, данных), а другой процесс может ожидать появления в кортежной области некоторого кортежа и, после его появления, прочитать кортеж с возможным последующим его удалением. Заметим, что процесс может, например, поместить кортеж в область и завершиться, а другой процесс может через некоторое время воспользоваться этим кортежем. Таким образом обеспечивается возможность асинхронного взаимодействия. Очевидно, что при помощи такой модели может быть сэмулировано и синхронное взаимодействие. Linda — это модель параллельных вычислений, она может быть добавлена в любой язык программирования. Существуют достаточно эффективные реализации Linda, обходящие проблему существования глобальной кортежной области с потенциально неограниченным объемом памяти.

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

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

Из языков с энергичной семантикой упомянем ML и два его современных диалекта — Standard ML (SML) и CaML. Последний имеет объектно-ориентированного потомка — Objective CaML (O’CaML).

Среди языков с ленивой семантикой наиболее распространены два: Haskell и его более простой диалект Clean.

Более подробные сведения о функциональных языках приведены ЗДЕСЬ:

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

Родоначальником большинства языков логического программирования является язык Prolog (1971). У него есть ряд потомков — Parlog (1983, ориентирован на параллельные вычисления), Delta Prolog и др. Логическое программирование, как и функциональное, — это отдельная область программирования, и за более подробными сведениями мы отсылаем читателя к специальной литературе.

Пролог ( Programmation en Logique) — язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.

Позволю себе выделить некоторую общую тенденцию в развитии языков программирования. Проницательный читатель, наверное, уже давно догадался, о чем я собираюсь сказать. Языки развиваются в сторону все большей и большей абстракции. И это сопровождается падением эффективности. Вопрос: а стоит ли этого абстракция? Ответ: стоит. Стоит, так как повышение уровня абстракции влечет за собой повышение уровня надежности программирования. С низкой эффективностью можно бороться путем создания более быстрых компьютеров. Если требования к памяти слишком высоки, можно увеличить ее объем. Это, конечно, требует времени и средств, но это решаемо. А вот с ошибками в программах можно бороться только одним способом: их надо исправлять. А еще лучше — не совершать. А еще лучше максимально затруднить их совершение. И именно на это направлены все исследования в области языков программирования. А с потерей эффективности придется смириться.

Целью данного обзора была попытка дать читателю представление о всем многообразии существующих языков программирования. Среди программистов часто бытует мнение о «всеобщей применимости» того или иного языка (C, C++, Pascal и т.п.). Это мнение возникает по нескольким причинам: недостаток информации, привычка, инертность мышления. Я попытался слегка компенсировать первый фактор. По поводу остальных могу лишь сказать, что настоящий профессионал должен постоянно стремиться повышать свои профессиональную квалификацию. А для этого нужно не бояться экспериментировать. Ну и что, что все вокруг пишут на C/С++/VB/Pascal/Perl/Java/… (нужное подчеркнуть)? А почему бы не попробовать что-нибудь новенькое? А вдруг это окажется эффективнее? Разумеется, прежде чем приниматься использовать новый язык, нужно внимательно изучить все его особенности, включая наличии эффективной реализации, возможности взаимодействия с существующими модулями и т.п., и только после этого принимать решение. Разумеется, всегда есть риск пойти не тем путем, но… Не ошибается лишь тот, кто ничего не делает.

И еще. Мне доводилось слышать, а порой и участвовать в дискуссиях вида «язык A лучше, чем язык B». Я надеюсь, что, прочитав этот обзор, многие убедятся в бессмысленности таких споров. Максимум, о чем может идти речь — это о преимуществах одного языка над другим при решении той или иной задачи в тех или иных условиях. Вот здесь действительно иногда есть о чем поспорить. И решение подчас отнюдь не очевидно. Однако же спорить «вообще» — очевидная глупость.

Эта статья задумывалась как ответ тем, кто кричит «язык X MUSTYLE="DIE». Надеюсь, что ответ получился достаточно адекватным и убедительным. Надеюсь также, что статья имеет, помимо полемической, и познавательную ценность.

1

Смотреть полностью


Скачать документ

Похожие документы:

  1. Роль и значение языка паскаль в эволюции языков программирования

    Документ
    Языки программирования претерпели большие изменения с тех пор, как началось их использование. Машинные языки были первыми языками программирования. Программирование на них затруднительно ввиду того, что, во-первых, эти языки различны
  2. Существуют различные классификации языков программирования

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

    Учебно-методический комплекс
    В курсе рассматриваются фундаментальные вопросы, связанные с современными технологиями программирования, эволюцией программного обеспечения, парадигмами процедурного, модульного и объектно-ориентированного программирования.
  4. Учебно-методический комплекс «Высокоуровневые методы информатики и программирования» (для студентов отделения высшего профессионального образования специальности «Прикладная информатика (в экономике)») Рубцовск

    Учебно-методический комплекс
    Рабочая программа учебной дисциплины «Высокоуровневые методы информатики и программирования» предназначена для реализации государственных требований к минимуму содержания и уровню подготовки выпускников по специальности: 351400 «Прикладная
  5. Ые системы", "Операционные системы, среды и оболочки" и "Операционные системы и системное программирование" для студентов специальнос­тей факультета Кибернетики

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

Другие похожие документы..