50
Искусство программирования
Алгол·68
Алгол Алгол-60
Алгол-кобол Алиас
Алмо Алтран Альфарб
Амбит Амтран АП АПЛ
АПТ АТФ АЭД Бэисик Блисс
Бояз Бцпл 2ам ГПЛ ГПС ГПСС Граф
ГСЛ Джовиал Джасс Диалог Диамаг
Диана Динамо Дис-68 Евклид ИПС
ИПЛ ЦЕЛ Кобол Когенит Комфорт
Комит Корал
ЛДТ Лип Лис
Лого Лолита Лотис
Милитран Мирфак
Мэри Нелиак ОСС
ПЛ/360 ПЛ-516
РПГ Сайдел Сейл
Симскрилт
Паскаль ПЛ/1
ПЛ/11 Рапира
Симула-1
Сирнус
Сибобол
ФАКТ
ФЛАК
формак
фортран
фсл
цдл цпс
чили
Эзол
Эйлер
Эпсиilon
Ярмс
Яхонт
Корк Клу
Лисп
Мамлаб
Мода Мэд
ПС-440
Рефал
Сетл
агма
-67
А. Рар
Какие бывают языки программирования
От редакции. Публикуемая ниже статья доступна и тем читателем, которые не занимаются в Заочной школе программирования.
Свой третий и заключительный курс Заочная школа начинает в следующем номере.
Хотя первые ЭВМ были созданы только в сороковых годах, в настоящее время языков программирования развилось видимо-невидимо (неполный список языков изображен на заставке к этой статье).
Учашиеся ЗШП хорошего значения Рапира, мы будет ссылаться на него в сносах. Остальные читатели могут эти сноски игнорировать.
Наш расссказ мы начнем с того дальнейго времени, когда языков программирования еще не было, а были только
51
Машинные языки
Машинный язык ЭВМ — это не что иное, как система ее машинных команд (см. «Квант», 1981, № 4 — «Трехадресные, одноадресные и… безадресные машины»). Правила «понимания» машиной этих команд заложены в самом конструкцию ЭВМ так же, как, например, в конструкцию автоматизации заложено «понимание» того, что «означает» поворот руля.
Приведем пример работы программы, используемого языком Допустим, что этот программист должен по ходу решения своей задачи вычислить, на какой высоте находится свободно подающая матриальная точка через секунд после начала падения, если начальная высота точки — , начальная скорость — . Соответствующая физическая формула хорошо известна:
но программисту удобнее переписать ее в другом виде:
В самом начале работы над программием программист должен выполнить для нее «распределение памяти», то есть определить адрес ячеек, которые будут служить для хранения тех или иных величин.
Пусть, например, он распределил память следующим образом:
| Величина | Адрес ячейки |
| :— | :— |
| Константа 9,81 | 1001 |
| Константа 2 | 1002 |
| Переменная | 1101 |
| Переменная | 1102 |
| Переменная | 1103 |
| Переменная | 1104 |
Пусть, далее, в нашей машине (это, кстати, заслуженный ветер отечественный вычислительный техника — машина М-220, использует еще коe-где и в наши дни) операция сложения имеет код 01, деления — 04, умножения — 05. Тогда в соответствии всеме своей программы, например начная с ячейки 0101, программист пишет:
(C — сложение, Y — умножение, D — деление; с помощью конструкции = E’…’ изображается числовая константа).
52
Уже на этом примере видны как удобства авторка, так и неодостатки. С одной стороны, программа не заботится больше ни о каких адресах. Изменя программа или соединяя несколько программ в одному, чтобы различны не имели одного и того же имени, и может не обращать внимание на их перемещение по памяти. Но, с другой стороны, тексты на автороке еще слишком близки к текстам на машинном языке, действия на нем слишком мелки, непrivычны для математica.
Как бы ни был низок уровень авторка, написанные на нем программы машиной уже неосредственно не воспринятая, и их, как и программы, написанные на любом другом языке программирования, надо перед использованием переводить на машинный язык. Для такого перевода (трансляции) разработаны специальные программы — трансляторы. Трансляторы с автороков называются ассемблерами. Близость авторка к машинному языку обеспечивает сравнительную простоту ассемблера.
Фортран и Алгол
Первым языком, не зависящим от машинны, стал язык Фортран, предназначенный для программирования вычислительных задач. Он был создан в 1956 г. в США. В 1958—1960 гг. группой математиков из разных стран был разработан для тех же целей языок Алгол-60. Эти два языка и сейчас еще широко распространяется во всем мире. На них написано огромное количество программ из различных областей применения вычислительной математики. Языки эти во многом отличятся друг от друга, но мы не будем здесь касаться их различий. вместо этого вернемся к нашему примеру. Нам приятно будет узнать, что для вычисления исходной величины теперь достаточно всего лишь одного оператора:
(пример записан на Фортран).
Наряду с обычными переменными объектами рассматриваемых языков могут быть также массивы — одномерные, двумерные и т. д. Оdnомерный массив — это числовая последовательность определенной длины*. Двумерный массив — это последовательность, состоящая из одномерных массивов одной и той же длины, и т. д. Массив должен описан в программе; такое описание должно полностью определять его размеры. Пусть, например, в программе на Фортран описан некоторый двумерный массив с именем ТАБЛИЦА и в описании этого массива указаны его размеры: 3 — по первому измерению и 4 — по второму**. Удобно представлять этот массив как таблицу (матрицу) из 3 строк и 4 столбцов, заполненную числами (элементами массива). В некоторых моментах использования программы эта матрица может быть, например, такой:
Элемент на пересечении I-й строки и J-го столбца задается переменной с индексами ТАБЛИЦА (I, J). Над переменной с индексами можно произвольить такие же действия, как и над обычными переменными, так что пара операторов
ТАБЛИЦА (1,1)-ТАБЛИЦА (K+1,4)+ТАБЛИЦА (K,K)
заменит верхний левый элемент матрицы на число 9.
В языках Алгол-60 и Фортран существует условия операторов, позволяющие определить дальнейший ход использования программы в зависимости от текущих значений тех или иных переменных, а также операторы цикла, осуществляющие многоократное использование некоторых частей программы***. В Алголе-60 существует процедуры, позволяющие
*) На Раппире одномерные массивы называются кортежами (см. «Квант», 1980, № 3, 3ШП, урок 8).
**) На Раппире — 3 составляющих кортежа, каждой из которых имеет по 4 элемента.
***) О подобных средств в Раппире см. «Квант», 1980, № 9, 3ШП, урок 9.
53
шие вызывать в разных местах программы исполнение одной и той же группы операторов*); сходные средства (подпрограммы) есть в Фортеране.
Еще одно варианское столпотворение
Вслед за созданием Фортера в разных странах начали возникать все новые и новые языки программирования. Сейчас, пожалей, счет их надо вести на сотни. По поводу этого обилия языков часто вспоминают библиейское сказание о Вавилонском столпотворении. Согласно этому сказанию, жители Вавилона решили построить башню (столп) до самого неба. Но из этого ничего не получилось. Бог, не желая допустить людей на небо, разделил единый целое целоеческий язык на языки разных народов, и строители перестали понять друг друга. На заставке к статье изображена новая Вавилонская башня.
Есть две причины для такого усеerdного языковворчества. Во-первых, ЭВМ — это универсальные вычислительные устройства, предназначенные для решения произвольных задач, возникающих в самых различных сферах человека деятельности. Конечно, все эти задачи можно решить при помощи машинных языков, но мы видели, что это весыма трудно. Языки же Фортеран и Алгол-60, сильно облегчая программирование общих вычислительных задач, для других задач подходят плохо. Поэтому и стали появляться специальизированные языки для все новых и новых классов задач, порой весыма узких и специфичных. Во-вторых, существенно то, что программирование — очень молодая область человека деятельности. Многое в нем еще не устоялось, и поэтому программы творят, выдумывают, пробуют, подбирая наиболее подходящие для тех или иных целей языковые средства. И эти проблемы в конечном смете по-
*) О проедурах в Рапире см. «Квант», 1980, № 2, 3ШП, урок 6.
лезны, так как дают возможность оценивать и сравнивать разные подходы в расчете на использование их в будущих, более совершенных языках. А языки, которые не пользовются, естественным образом отмирают.
Пригладимся теперь внимательно к отдельным кириллам новой Вавилонской башни и рассмотрим сначала
Специальизированные языки
Вычислительные задачи тоже бывают разными. Это могут быть инженерные и научно-технические задачи, в которых надо произвольить большее количество вычислений над сравнительно небольшим количеством данных. Для этих целей как раз хорошо подходят Алгол-60 и Фортеран. Есть также бухгалтерско-экономические и учетные задачи, где произвольные операции несложны, но должны переработаться большая и сложно организованная информация, например ведомости расчета заработной платы. Для таких задач еще в 1960 г. был разработан язык Кобол. Программы на Коболе задают формат (способ расположения) информации на входных и выходных документах и определяют с помощью фраз, близких к фразам английского (или русского) языка, какие действия надо выполнять над числовыми величиными и над текстами, входящими в эту информацию.
Распространены в то же время и такие задачи, в которых обработка текстов или другой нечисловой (символной) информации занимает центральное место. Таким задачам был посвящен один из уроков Заочной школи программырования («Квант», 1980, № 11), но мы несколько расширим тематку этого урока, упомянув еще два круга задач.
Получут можно сказать, что Алгол-60, Фортеран и Кобол знают арфметику, но не знают алгебры: они в состоянии вычислить значение выражения при конкретизации значения и , но им не под силу преобразовать это выражение в . Мы столкнулись
54
здесь с одной из важных задач обработки символной информации — формальных преобразований.
Другой круг задач — это применение программирования к самому программированию. Программы, написанные на каком-либо языке, нуждаются в редактировании разного рода и, самое важное, в трансплиции, переводе на машинный язык. Но программы — это тексты, и все эти задачи относятся к области текстовой обработки, зачастую сложной и специфичной. Существует много языков, предназначенных для работы с текстами. Наноболее известен из них Снобол.
Некоторые языки программирования характеризуют не столько области применения, сколько структурой обработываемых данных. Таков Лисс — язык, специально предназначенный для работы с информацией, организованной в списке. Список отличается от одномерного массива большей гибкости. Длина его не фиксируется заранее, его можно пополнять в любом месте новых элементов и из любого его места можно удалять элементы. Практические это означает, что элементы списка не располагаются в памяти вплотную друг к другу (как это обычно имеет место для массивов), но за то каждый элемент снабжен ссылкой, указавшей, где находится следующий элемент. Ясно, что местные изменения в списке не приводят к сdwгу списка по памяти — меняются всего лишь отдельные ссылки.
Универсальные языки
С середины 60-х годов наряду со стремлением к созданию специализированных языков программирования возникло и противоположное стремление: стали появляться универсальные языки, пригодные для любых задач — инженерных или бухгалтерских, редакторских или трансляторских — с производной структурой обработываемой информации.
Употребление здесь понимание выражения «универсальный язык» не общепризнанно.
Сразу можно сказать, что в современении между специальизированным и универсальным языкам не может быть победителя. И те, и другие языки хорошо в одних условиях и плохи в других. Если программисту часто приходится переходить с одного класса задач на другой или если в пределах одной и той же задачи приходится, скажем, и производить сложные вычисления, и редактировать текст, то, конечно, надо пользоваться универсальным языком. С другой стороны, ясно, что нет смысла запускать громоздкий универсальный инструмент, если имеешь дело с каким-то ограниченным видом работ. Из универсальных языков программирования упомянутся ПЛ/1, Алгол-68, Сетл и Паскаль.
Несолько огрубляя, можно сказать, что ПЛ/1 произойдет из Фортана, а предшественником Алгола-68 был Алгол-60. ПЛ/1 и Алгол-68 могут работать с данными, организованными весом сложным образом. Например, можно задать массив, элементы которого являются списками, каждый из которых состоит последовательно из целого числа, строки символов, числового массива, слова целого числа и т. д. Алгол-68 характерен также тем, что программист может в своей программе придаать операции языка (например, сложению с его обычным знаком+) новый или дополнительный смысл (например, позволенное сложение массивов), а также задать новые операции. Программист может также, определяв новый набор операций, нужных для некоторых класса задач, сделать этот набор доступным для всех программы, решающих задачи этого класса. Таким образом, Алгол-68 оказывается языком самораширением и (так как могут появляться новые операции) в то же время самонастраивающимся (на определенную область применения).
Главной особенностью языка Сетл является использование нового типа