Algol 68 это какая версия языка

Языки численных расчетов
Первый этап развития компьютерных технологий относится к периоду, который начался до Второй мировой войны и продлился до начала 40-х годов.
Во время Второй мировой войны основной задачей компьютеров, называвшихся электронными вычислительными устройствами, было определение баллистических траекторий путем решения дифференциальных уравнений движения.
В начале 50-х годов начали появляться первые языки, использовавшие символьные системы обозначений. Грейс Хопер возглавила в компании Univac группу, которая разрабатывала язык А-0, а Джон Бэкус создал язык Speedcoding для IBM 701. Оба эти языка предназначались для преобразования простых арифметических выражений в исполняемый машинный код.
Настоящий прорыв произошел в 1957 году, когда Бэкус руководил группой по созданию языка FORTRAN, или транслятора формул (FORmula TRANslator).
На ранней стадии разработки FORTRAN был ориентирован на численные вычисления, но конечной целью был вполне законченный язык программирования, включающий в себя управляющие структуры, условные операторы ввода-вывода. Поскольку немногие верили, что получится язык, способный конкурировать с языком ассемблера, в котором машинные команды кодировались вручную основной задачей было создать эффективный исполняемый код, поэтому многие операторы разрабатывались с учетом специфики ЭВМ IBM 704.
Концепции языка FORTRAN типа механизма трехветвевого перехода вытекала напрямую из аппаратной архитектуры IBM 407, а операторы типа READ INPUT TAPE сегодня выглядят весьма причудливо. Все это выглядело не очень изящно, но в то время еще не задумывались об элегантном программировании, зато разработанный язык позволял писать программы, которые выполнялись достаточно быстро на ЭВМ упомянутого типа.
FORTRAN оказался весьма удачным языком и оставался доминирующим вплоть до 70-х годов. Следующая версия FORTRAN вышла в 1958 году и стала называться FORTRAN II, а спустя несколько лет появился FORTRAN IV.
Поскольку каждый производитель ЭВМ реализовывал для своих компьютеров собственную версию языка, то, понятное дело, царил хаос. В 1966 году FORTRAN IV стал стандартом под названием FORTRAN 66 и с тех пор дважды подвергался пересмотру, в результате чего возникли стандарты FORTRAN 77 и FORTRAN 90. Наличие большого количества программ, написанных на ранних версиях языка, явилось причиной того, что создаваемые трансляторы должны были удовлетворять требованиям обратной совместимости, что препятствовало внедрению в язык новых идей и концепций программирования.
Поскольку FORTRAN оказался столь успешным языком, в Европе возникли опасения, что IBM будет доминировать в компьютерной отрасли.
Немецкое общество прикладной математики (German society of applied mathematics — GAMM) создало комитет по разработке универсального языка. В то же время Association for Computing Machinery (ACM) организовала похожий комитет в США. Несмотря на то что у европейцев было некоторое беспокойство по поводу господства американцев, оба этих комитета слились в один. Под руководством Питера Наура (Peter Naur) этот комитет разработал IAL (International Algorithmic Language). Предлагавшееся название ALGOL (ALGOrithmic Language) было вначале отвергнуто. Но поскольку оно стало общеупотребительным, официальное имя IAL пришлось впоследствии изменить на ALGOL 58. Новая версия появилась в 1960 г., и ALGOL 60 (с небольшими изменениями, сделанными в 1962 году) с 60-х и до начала 70-х годов. прошлого века был стандартом академического языка программирования.
Если FORTRAN разрабатывался для эффективного использования на IBM 704, перед разработчиками языка ALGOL стояли совершенно другие цели, а именно:
1. Сделать систему обозначений в ALGOL как можно ближе к стандартной математической.
2. ALGOL должен быть приспособлен для описания алгоритмов.
3. Программы на ALGOL должны были компилироваться в машинный язык.
4. ALGOL не должен быть привязан к конкретной машинной архитектуре.
Все эти цели оказались в 1958 году недостижимы. Чтобы обеспечить независимость от архитектуры, в этот язык не были включены возможности ввода-вывода; для таких операций следовало создавать специальные процедуры. Это и обеспечивало независимость языка от архитектуры компьютера, но в то же время приводило к тому, что каждая реализация неизбежно была несовместима с любой другой. Хотя ALGOL и имел некоторый успех в Европе, он так и не получил коммерческого успеха в Америке, тем не менее его влияние на другие языки было достаточно велико. В качестве примера приведем разработанную Шварцем (Jules Schwartz) из System Development Corporation (CDS) версию языка IAL —JOVIAL (Jules’ Own Version of IAL). Этот язык использовался военно-воздушными силами США для решения прикладных задач.
Бэкус был редактором отчета, в котором определялся язык ALGOL. Он использовал синтаксическую систему обозначений, сопоставимую с концепцией контекстно-свободного языка, разработанной Хомским. Так произошло внедрение теории формальных грамматик в область языков программирования . Поскольку Бэкус и Наур внесли огромный вклад в концепцию разработки ALGOL, эта система обозначений носит их имя — нормальная форма Бэкуса-Наура (НФБ) (Backus-Naur Form — BNF).
Можно привести еще один пример влияния ALGOL. Компания по продаже компьютеров Burroughs, которая после слияния с компанией Sperry Univac образовала компанию Unisys, обнаружила работы польского математика Лукашевича, который разработал методику, позволяющую записывать арифметические выражения без скобок, используя алгоритм вычислений с использованием стека. Эта методика оказала значительное влияние на теорию разработки компиляторов. Используя технологию, основанную на этой методике, компания Burroughs разработала компьютер В5500 со стековой архитектурой и вскоре реализовала компилятор языка ALGOL, значительно превышавший по скорости существовавшие в то время компиляторы языка FORTRAN.
С этого момента ситуация изменяется.
В 60-е годы была разработана концепция пользовательских типов данных, которая не была реализована ни в языке FORTRAN, ни в языке ALGOL.
Язык Simula-67, разработанный норвежцами Найгардом и Далом, ввел концепцию классов в ALGOL. В 80-е годы это натолкнуло Страуструпа на идею создать C++ как расширение С с добавлением понятия классов.
В середине 60-х годов Вирт разработал расширение языка ALGOL — ALGOL-W, пользовавшийся меньшим успехом. Тем не менее в 70-х годов. он же разработал Pascal, который стал языком научного программирования тех лет.
Другой комитет, ориентируясь на успех ALGOL 60, разработал язык ALGOL 68, который, однако, оказался слишком сложным для понимания и эффективной реализации.
С началом серийного выпуска в 1963 году новых компьютеров модели 360 фирма IBM в своей лаборатории Hursley, находящейся в Англии, разработала новый язык — NPL (New Programming Language). В связи с некоторым недовольством сотрудников Национальной физической лаборатории (English National Physical Laboratory) язык был переименован в MPPL (Multy-Purpose Programming Language). В дальнейшем это название было сокращено до PL/I. Язык PL/I объединил в себе вычислительные возможности языка FORTRAN и возможности бизнес-программирования (обработки деловой информации), имевшиеся в языке COBOL. В 70-е rоды PL/I пользовался некоторой популярностью (так, среди языков, описанных во втором издании этой книги, он обладал наибольшим количеством возможностей), в настоящее же время он практически забыт, поскольку вытеснен такими языками, как С, C++ и Ada. Версия PL/C этого языка в 70-е годы получила распространение как компилятор PL/I для студентов.
BASIC был разработан, чтобы удовлетворить потребность в численных расчетах людей, не имеющих отношения к науке, однако в дальнейшем его возможности были расширены и вышли далеко за рамки первоначальных целей.
Алгол (язык)
АЛГО́Л (Algol, ALGOrithmic Language — алгоритмический язык), язык программирования высокого уровня. Существуют три последовательно сменявших друг друга версии языка: Алгол-58, Алгол-60, Алгол-68. Язык предназначен для записи алгоритмов, которые строятся в виде последовательности процедур, применяемых для решения поставленной задачи. Первая версия языка, Алгол-58, была разработана в конце весны 1958, преимущественно для решения численных задач.
Алгол подразделяется на три уровня: язык описаний, определяющий основные понятия, язык публикаций, позволяющий писать и обсуждать программы, и язык аппаратного уровня, реализуемый на компьютере. Одним из недостатков языка было отсутствие процедур ввода и вывода данных. Широкого признания ни Алгол-58, ни его преемник Алгол-60 не получили, но в них были реализованы множество идей, получивших применение и развитие в других языках. Это — блочная структура, позволяющая делить программы на замкнутые, независимые единицы; рекурсия — способность программ повторно обращаться к себе; формализованное определение синтаксиса — способа размещения слов в языке; вложенные контексты; описания переменных; определения способа передачи параметров.
В 1965 К. Хоар и Никлаус Вирт модифицировали Алгол-60. Эта версия, получившая название Алгол-W в честь Вирта (Wirth), была опубликована и приобрела большую популярность в университетских городках. Но комитет по Алголу ее отверг и сам занялся модификацией языка. В декабре 1968 Международным комитетом специалистов по информатике был создан Алгол-68, работая с которым, программисты могли писать ключевые слова на родном языке. Ключевые слова содержатся в таблице трансляции, хранящейся в памяти компьютера и используемой компилятором Алгола-68 для преобразования программ в машинный код.
Сохраняя стилистическую связь со своим предшественником, Алгол-68 отличается более широкими возможностями и общностью конструкций. Его особенностями являются развитая система типов, автоматическое приведение типов, средства описания параллельных процессов и синхронизации, формальное описание языка на основе двухуровневых грамматик. Стремление к формальной строгости и последовательности сделало Алгол-68 слишком громоздким и сложным. Он использовался в ограниченных масштабах только американскими программистами.
АЛГОЛ 68 — ALGOL 68
ALGOL 68(сокращение от Algorithmic Language 1968) императивный язык программирования, который был задуман как преемник языка программирования ALGOL 60, разработан с целью расширения области применения и более строго определенного синтаксис и семантика.
Сложность определения языка, занимающего несколько сотен страниц, заполненных нестандартной терминологией, затрудняла реализацию компилятора, и было сказано, что у него «нет реализаций и нет пользователей». Это было правдой лишь отчасти; Алгол 68 действительно нашел применение на ряде нишевых рынков, особенно в Соединенном Королевстве, где он был популярен на машинах International Computers Limited (ICL), а также в качестве преподавателя. За пределами этих кругов использование было относительно ограниченным.
Тем не менее, вклад Алгола 68 в область информатики был глубоким, разносторонним и устойчивым, хотя многие из этих вкладов были публично известны только тогда, когда они снова появились в дальнейшем. развитые языки программирования. Многие языки были разработаны специально в ответ на воспринимаемую сложность языка, наиболее заметным из которых был Паскаль, или были повторными реализациями для определенных ролей, например Ада.
Многие языки 1970-х годов прослеживают свое происхождение. проектировать специально под АЛГОЛ 68, выбирая одни функции и отказываясь от других, которые считались слишком сложными или выходящими за рамки данных ролей. Среди них — язык C, на который непосредственно повлиял АЛГОЛ 68, особенно его строгая типизация и его структуры. Большинство современных языков прослеживают, по крайней мере, часть своего синтаксиса к C или Pascal, и, таким образом, прямо или косвенно к АЛГОЛу 68.
Обзор
Функции ALGOL 68 включают синтаксис на основе выражений, типы, объявленные пользователем и структуры / tagged-union, эталонная модель переменных и эталонных параметров, нарезка строк, массивов и матриц и параллелизм.
АЛГОЛ 68 был разработан Международной федерацией обработки информации (IFIP) Рабочая группа 2.1 IFIP. 20 декабря 1968 года язык был официально принят группой, а затем одобрен для публикации Генеральной ассамблеей IFIP.
АЛГОЛ 68 был определен с использованием формализма, двухуровневой формальной грамматики, изобретенной Адрианом ван Вейнгаарденом. Грамматики Ван Вейнгардена используют контекстно-свободную грамматику для создания бесконечного набора продуктов, которые распознают конкретную программу на Алголе 68; в частности, они могут выражать требования, которые во многих других языках программирования технические стандарты помечены как семантика, и должны быть выражены в тексте на естественном языке, подверженном двусмысленности, а затем реализованы в компиляторах как специальный код прикреплен к синтаксическому анализатору формального языка.
АЛГОЛ 68 был первым (и, возможно, одним из последних) основным языком, для которого было дано полное формальное определение до его реализации.
Основные цели и принципы проектирования АЛГОЛА 68:
- Полнота и ясность описания
- Ортогональность дизайна
- Безопасность
- Эффективность:
- Проверка статического режима
- Независимый от режима синтаксический анализ
- Независимая компиляция
- Оптимизация цикла
- Представления — в минимальных и больших наборах символов
Алгол 68 подвергался критике, особенно со стороны некоторых членов его проектного комитета, таких как C. AR Hoare и Edsger Dijkstra за отказ от простоты АЛГОЛА 60, за то, что они стали проводником сложных или слишком общих идей и мало сделали для создания компилятора задача писателя проще, в отличие от нарочито простых современников (и конкурентов), таких как C, S-algol и Pascal.
. В 1970 году ALGOL 68-R стал первый рабочий компилятор для АЛГОЛА 68.
Хотя европейские оборонные агентства (в Великобритании Royal Signals and Radar Establishment (RSRE)) продвигали использование Алгола 68 для достижения ожидаемых преимуществ безопасности, американская сторона альянса НАТО решили разработать другой проект, язык Ada, сделав его использование обязательным для оборонных контрактов США.
АЛГОЛ 68 также имел заметное влияние в Советском Союзе, подробности которого можно найти в статье Андрея Ершова 2014 года: «АЛГОЛ 68 и его влияние по программированию в СССР и России »и« Алгол 68 и его влияние на программирование в СССР и России ».
Стив Борн, который был в ревизионной комиссии Алгола 68, перенес некоторые из его идей в свой Оболочка Борна (и, таким образом, для потомков оболочек Unix, таких как Bash ) и до C (и, таким образом, для потомков, таких как C ++ ).
Полную историю проекта можно найти в C. История Алгола 68 Х. Линдси.
Полное описание языка см. В «Программировании Алгола 68 стало проще» доктора Сиан Маунтбаттен или «Изучение Алгола 68 Джинн». «Марселя ван дер Вира, который включает Пересмотренный отчет.
История
Истоки
АЛГОЛ 68, как следует из названия, является продолжением языка АЛГОЛ, который был впервые формализован в 1960 году. В том же году Международная федерация обработки информации (IFIP) сформировала и учредила Рабочую группу по Алголу, или WG2.1. Эта группа выпустила обновленную спецификацию ALGOL 60 в Риме в апреле 1962 года. На последующем собрании в марте 1964 года было решено, что группа должна начать работу над двумя последующими стандартами, ALGOL X, которые будут быть переопределением языка с некоторыми дополнениями, и АЛГОЛ Y, который будет иметь возможность изменять свои собственные программы в стиле LISP.
процесса определения
Первое собрание группы ALGOL X состоялось в Принстонском университете в мае 1965 года. В отчете о встрече были отмечены две широко поддержанные темы: введение строгой типизации и интерес к Эйлер концепции «деревьев» или «списков» для работы с коллекциями.
На второй встрече в октябре во Франции были представлены три официальных предложения, Никлауса Вирта ALGOL W вместе с комментариями о структурах записей от CAR (Тони) Хоар, аналогичный язык Герхарда Зигмюллера, и статья Адриана ван Вейнгаардена о «Ортогональном дизайне и описании формального языка». Последнее, написанное почти неразборчивой «W-грамматикой», оказалось решающим сдвигом в эволюции языка. Встреча завершилась соглашением о том, что ван Вейнгаарден переписывает представление Вирта / Хора, используя свою W-грамматику.
Эта, казалось бы, простая задача в конечном итоге оказалась сложнее, чем ожидалось, и последующая встреча должна была быть задерживается на полгода. Когда он собрался в апреле 1966 года в Кутвейке, черновик ван Вейнгаардена оставался неполным, и Вирт и Хоар представили версию, используя более традиционные описания. Все согласились, что их статья была «правильным языком в неправильном формализме». По мере изучения этих подходов стало ясно, что существует разница в способах описания параметров, которые будут иметь реальный эффект, и, хотя Вирт и Хоар протестовали против того, что дальнейшие задержки могут стать бесконечными, комитет решил дождаться версии ван Вийнгаардена. Затем Вирт применил свое текущее определение как ALGOL W.
На следующей встрече в Варшаве в октябре 1966 г. был предварительный отчет от Подкомитета ввода-вывода, который встретился на Национальная лаборатория Окриджа и Иллинойсский университет, но пока не добились больших успехов. Два предложения с предыдущей встречи были снова рассмотрены, и на этот раз возникла новая дискуссия об использовании указателей ; Алгол W использовал их только для ссылки на записи, в то время как версия ван Вийнгаардена могла указывать на любой объект. Чтобы добавить путаницы, Джон Маккарти представил новое предложение по перегрузке оператора и возможности связывать вместе и / или конструкции, а Клаус Самельсон хотел разрешить анонимные функции. В результате возникла путаница, и возникла дискуссия о том, чтобы отказаться от всей работы. Путаница продолжалась на том, что должно было стать встречей ALGOL Y в Зандвоорте в мае 1967 года.
Публикация
Черновой вариант отчета был наконец опубликован в феврале 1968 года. встретил «шок, ужас и несогласие», в основном из-за сотен страниц нечитаемой грамматики и странной терминологии. Чарльз Х. Линдси попытался выяснить, какой «язык был спрятан внутри него». Этот процесс потребовал шести человеко-недель усилий. Получившаяся в результате статья «Алгол 68 с меньшим количеством слез» получила широкое распространение. На более широком собрании по обработке информации в Цюрихе в мае 1968 года участники жаловались, что им навязывают язык и что ИФИП был «истинным злодеем этой необоснованной ситуации», поскольку встречи были в основном закрытыми и проводились нет формального механизма обратной связи. Вирт и Питер Наур официально отказались от своих авторских позиций в WG2.1 на этом этапе.
Следующая встреча WG2.1 состоялась в Тиррении в июне 1968 года. предполагалось обсудить выпуск компиляторов и другие вопросы, но вместо этого перешло в обсуждение самого языка. ван Вийнгаарден ответил, сказав (или пригрозив), что выпустит только еще одну версию отчета. К этому моменту Наур, Хоар и Вирт оставили усилия, и еще несколько человек угрожали сделать это. Еще несколько совещаний были проведены, Норт-Бервик в августе 1968 года, Мюнхен в декабре, который произвел выпуск официального отчета в январе 1969 года, но и в результате спорная Особое мнение писаться. Наконец, в Банфе, Альберта в сентябре 1969 года проект в целом считался завершенным, и обсуждение в основном касалось исправлений и значительно расширенного Введения к отчету.
Работа заняла пять лет, выгорело многие из величайших имен в информатике и несколько раз зашло в тупик из-за проблем как в определении, так и в группе в целом. Почти сразу Хоар выпустил «Критику Алгола 68», на которую широко ссылаются во многих работах. Вирт продолжил развитие концепции ALGOL W и в 1970 году выпустил ее как Pascal.
Реализации
ALGOL 68-R
Первая реализация стандарта, основанная на черновик Отчета конца 1968 года был представлен Royal Radar Establishment в Великобритании под названием ALGOL 68-R в июле 1970 года. Это, однако, было подмножеством полного языка, и Барри Майю, последний редактор «Доклада», пошутил, что «это вопрос морали. У нас есть Библия, а вы грешите!» Тем не менее, эта версия стала очень популярной на машинах ICL и стала широко используемым языком в военном кодировании, особенно в Великобритании.
Среди изменений в 68-R было требование для все переменные должны быть объявлены перед их первым использованием. Это имело существенное преимущество, так как позволяло компилятору быть однопроходным, поскольку пространство для переменных в записи активации было зарезервировано перед его использованием. Однако это изменение также имело побочный эффект: требовалось, чтобы procобъявлялись дважды: один раз как объявление типов, а затем снова как фактическое тело кода. Другое изменение заключалось в устранении предполагаемого режима void, выражения, которое не возвращает значения (известного как оператор на других языках) и требует добавления слова voidтам, где оно предполагалось. Кроме того, 68-R устранил явные команды параллельной обработки на основе par.
Others
Первая полная реализация языка была представлена в 1974 году CDC Нидерланды для Control Data серия мэйнфреймов. Он имел ограниченное использование, в основном преподавание в Германии и Нидерландах.
Версия, похожая на 68-R, была представлена из Университета Карнеги-Меллона в 1976 году как 68S, и снова была однопроходной. компилятор, основанный на различных упрощениях оригинала и предназначенный для использования на меньших машинах, таких как DEC PDP-11. Он также использовался в основном в учебных целях.
Версия для мэйнфреймов IBM не была доступна до 1978 года, когда она была выпущена в Кембриджском университете. Это было «почти завершено». Линдси выпустила версию для небольших машин, включая IBM PC в 1984 году.
Известны две реализации Algol 68 с открытым исходным кодом:
- a68g, GPLv3, написанный Марселем ван дер Вером;
- algol68toc, ПО с открытым исходным кодом порт ALGOL 68RS.
Временная шкала
Алгоритмический язык Алгол 68 Отчеты
- Март 1968: Черновой вариант отчета по алгоритмическому языку АЛГОЛ 68 — Под редакцией: А. ван Вейнгаарден, Б. Ж. Майю, Ж. Э. Л. Пек и К. Х. А. Костер.
- Октябрь 1968: Предпоследний проект отчета по алгоритмическому языку ALGOL 68 — Главы 1-9 Главы 10-12 — Отредактировали: A. van Wijngaarden, BJ Mailloux, JEL Peck и CHA Koster.
- Декабрь 1968 г.: Отчет об алгоритмическом языке ALGOL 68 — Offprint из Numerische Mathematik, 14, 79-218 (1969); Springer-Verlag. — Под редакцией: А. ван Вейнгаарден, Б. Дж. Майлу, Дж. Э. Л. Пек и К. Х. А. Костер.
- Члены WG 2.1, активно участвовавшие в первоначальной разработке Алгола 68: Фридрих Л. Бауэр • • Эдсгер Дейкстра ※ • ※ • ※ • Герхард Гус • Тони Хоар ※ • • Киз Костер • Питер Лэндин • Чарльз Линдси • Барри Майю • Джон Маккарти • • Питер Наур ‡ • • Джон Пек • Виллем ван дер Поэл • Брайан Рэнделл ※ • Дуг Росс • Клаус Самельсон • ※ • Мишель Синцов • ※ • Аад ван Вейнгаарден • Никлаус Вирт ‡ • Майк Вудгер ※ • Нобуо Йонеда ; Ключ: ※ Стороны, подписавшие отчет меньшинства. ‡ Ушел в отставку после [MR 93].
Хронология стандартизации
1968: 20 декабря 1968 года «Окончательный отчет» (MR 101) был принят Рабочей группой, а затем одобрен Генеральной Ассамблеей ЮНЕСКО IFIP для публикации. Перевод стандарта был сделан на русский, немецкий, французский и болгарский, а затем на японский и Китайский. Стандарт был также доступен в Брайле.
1984: TC97 рассматривал Алгол 68 для стандартизации как «Новый рабочий элемент» TC97 / N1642 [2pting [ 3]. Западная Германия, Бельгия, Нидерланды, СССР и Чехословакия были готовы участвовать в разработке стандарта, но СССР и Чехословакия «не были подходящими членами правильных комитетов ISO» [4] и стандартизации ISO в Algol 68 [5]
1988: Впоследствии АЛГОЛ 68 стал одним из стандартов ГОСТ в России.
- ГОСТ 27974-88 Язык программирования АЛГОЛ 68 — Язык программирования АЛГОЛ 68
- ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный — Язык программирования АЛГОЛ 68 расширенный
Важные элементы языка
Жирный символы и зарезервированные слова
Стандартный язык содержит около шестидесяти зарезервированных слов, обычно выделенных жирным шрифтом, а некоторые с эквивалентами «краткого символа»:
mode, op, prio, proc, flex, heap, loc, long, ref, short, биты, bool, байты, char, comp, int, реальный, sema, строка, void, канал, файл, format, struct, union, at"@", либо, is": =:", isntне": / =:" ": ≠:", из"→", истина, ложь, пусто, nil"○", skip"~", co"¢", комментарий"", pr, pragmat, case~ in~ ouse~ in~ out~ esac"(~ | ~ |: ~ | ~ | ~) ", для~ из~ to~ by~ в то время как~ do~ od, if~ затем~ elif~ затем~ else~ fi"(~ | ~ |: ~ | ~ | ~)", parbegin~ end"(~)", перейти к, goto, exit".".
Единицы: Выражения
Базовая языковая конструкция — это единица. Единица может быть формула, заключенное предложение, обычный текст или одна из нескольких технически необходимых конструкций (присваивание, переход, пропуск, nihil). Технический термин вложенное предложение объединяет некоторые из конструктивно заключенных в скобки конструкций, известных как блок, оператор do, оператор переключения в других современных Языки. Когда используются ключевые слова, обычно для завершения вложения используется обратная последовательность символов вводящего ключевого слова, например (if~ затем~ else~ fi, case~ in~ out~ esac, для~ , а~ do~ od). Этот синтаксис защищенной команды был повторно использован Стивеном Борном в общем Unix Bourne shell. Выражение также может давать mu ltiple значение, которое строится из других значений дополнительным условием. Эта конструкция выглядит как пакет параметров вызова процедуры.
режим: объявления
Основные типы данных (называемые режимомна языке Algol 68) являются реальными, int, comp(комплексное число ), bool, char, битыи байт. Например:
intn = 2; con фиксируется как константа 2. cointm: = 3; com - вновь созданная локальная переменная, значение которой изначально установлено равным 3. cocoЭто сокращение от ref int m = loc int: = 3; coреальныйavogadro = 6,0221415⏨23; coчисло Авогадро coдлинное длинное вещественное числодлинное длинное pi = 3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510; комплквадратный корень из минус единицы = 0 1;
Однако объявление realx;просто синтаксический сахар для refrealx = locвещественное;. То есть xна самом деле является постоянным идентификатором для ссылки на вновь созданную локальную переменную real.
Кроме того, вместо определения и float , и double , или int и long и short и т. Д., АЛГОЛ 68 предоставляет модификаторы, так что распространенный в настоящее время double будет записан как longrealили longlongreal, например. Константы prelude max real и min long int предусмотрены для адаптации программ к различным реализациям.
Все переменные должны быть объявлены, объявление не должно появляться до первого использования.
примитив-декларатор: int, real, comp, complex, bool, char, строка, биты, байты, формат, файл, pipe, channel, sema
- биты— «упакованный вектор» bool.
- bytes— «упакованный вектор» char.
- string— flexible массив из char.
- sema— semaphore который может быть инициализирован с помощью operator level.
Сложные типы могут быть созданы из более простых с использованием различных конструкторов типов:
- refmode — ссылка на значение типа режим, аналогичный &в C / C ++ и refв Pascal
- struct— используется для построения структур, таких как structв C / C ++ и записьв Pascal
- union— используется для построения объединений, как в C / C ++ и Pascal
- proc— используется для указания процедур, таких как функции в C / C ++ и процедуры / функции на Паскале
Другие символы объявления включают: flex, heap, loc, ref, long, short, event
- flex— объявляем массив гибким, т.е. он может увеличиваться в длину по запросу.
- heap— выделять переменную некоторую свободное пространство из глобальной кучи.
- loc— выделить переменной некоторое свободное пространство в локальном стеке.
- long— объявить int, realили Compиметь размер longer.
- short— объявить int, realили Complдолжен иметь размер shorter.
Имя режима (типа) может быть объявлено с помощью объявления mode, аналогичного typedefв C / C ++ и typeв Pascal:
intmax = 99; режимnewmode = [0: 9] [0: max] struct(longreala, b, c, shortinti, j, k, refrealr);
Это похоже на следующий код C:
const int max = 99; typedef struct новый режим [9 + 1] [макс + 1];
Для АЛГОЛА 68 только индикация режима newmodeпоявляется слева от символа равенства, и, в первую очередь, конструкция выполняется и может быть прочитана слева направо без учета приоритетов. Кроме того, нижняя граница массивов Algol 68 по умолчанию равна единице, но может быть любым целым числом от -max int до max int.
Объявления режима позволяют типам быть рекурсивными: определяться прямо или косвенно в терминах самих себя. Это связано с некоторыми ограничениями — например, эти объявления недопустимы:
modeA = refA modeA = struct(A a, B b) modeA = proc(A a) A
, если они действительны:
modeA = struct(refA a, B b) modeA = proc(refA a) refA
Принуждение: приведение
принуждение производит принуждение из принуждения в соответствии с тремя критериями: априорный режим принуждения перед применением любого принуждения, апостериорный способ принуждения требуется после этих принуждений, а также синтаксическая позиция или «вид» принуждения. Принуждение может быть каскадным.
Шесть возможных принуждений называются «депроцедурация», «разыменование», «объединение», «расширение», «гребля» и «мочеиспускание». Каждое принуждение, кроме «объединения», предписывает соответствующее динамическое воздействие на ассоциированные значения. Следовательно, ряд примитивных действий можно запрограммировать неявно с помощью принуждения.
Сила контекста — разрешенное приведение:
- мягкое — депроцедура
- слабое — разыменование или депроцедура, дающее имя
- кроткий — разыменование или депроцедура
- Фирма — кротость, за которой следует объединение
- сильная — фирма, за которой следует расширение, гребля или аннулирование
Иерархия принуждения с примерами
АЛГОЛ 68 имеет иерархию контекстов, определяющих вид принуждения доступно в определенном месте программы. Это следующие контексты:
- Фактические параметры вызовов, как «~» в: PROC: sin (~)
- Заключенные предложения приведения типов, как «~» в: REAL (~)
- Единицы рутинных текстов
- Утверждения, дающие VOID
- Все части (кроме одной) сбалансированного предложения
- Одна сторона идентичности отношение, как «~» в: ~ IS ~
Расширение происходит, если нет потери точности. Например: INT будет преобразовано в REAL, а REAL будет преобразовано в LONG REAL. Но не наоборот. Примеры:
INT в LONG INT INT в REAL REAL в COMPL BITS в BOOL BYTES в STRING
Переменная также может быть приведена (выровнена) к массиву длины 1.
INT до [1] INT REAL до [1] REAL
- Операнды формул как «~» в: OP: ~ * ~
- Параметры вызовов передачи
UNION (INT, REAL) var: = 1
- Тримскрипты (дающие INT)
- Запросы: например, как «~» в следующем
IF ~ THEN. FI и FROM ~ BY ~ TO ~ WHILE ~ DO. OD и т.д.
- Первичные вызовы (например, sin in sin ( x))
REF REF BOOL в BOOL REF REF REF INT в INT
- Первичные элементы срезов, как в «~» в: ~ [1:99]
- Вторичные элементы выбора, как «~» в: значение OF ~
REF BOOL to REF BOOL REF REF INT на REF INT REF REF REF REAL на REF REAL REF REF REF REF STRUCT на REF STRUCT
- депроцедура: PROC REAL random: например random
pr & co: Pragmats and Comments
Pragmats — это директивы в программе , обычно указывает компилятору; в новых языках они называются «прагмами» (нет). например
pragmatheap = 32 pragmatprheap = 32 pr
Комментарии могут быть вставлены разными способами:
original Исходный способ добавления ваших 2 центов к программа ¢ комментарий"жирный" комментарий комментарийcoКомментарий к стилю i co# Комментарий к стилю ii # £ Это комментарий хеша / фунта для британской клавиатуры £
Обычно комментарии не могут быть вложены в АЛГОЛ 68. Это ограничение можно обойти, используя различные разделители комментариев (например, использовать хэш только для временного удаления кода).
Выражения и составные операторы
АЛГОЛ 68, являющийся языком программирования, ориентированным на выражения, значение, возвращаемое оператором присваивания, является ссылкой на место назначения. Таким образом, следующий допустимый код АЛГОЛА 68:
вещественныйполовина пи, один пи; one pi: = 2 * (half pi: = 2 * arc tan (1))
Это понятие присутствует, среди прочего, в C и Perl. Обратите внимание, что, как и в более ранних языках, таких как Algol 60 и FORTRAN, в идентификаторах разрешены пробелы, так что половина пи является единственным идентификатором (что позволяет избежать подчеркивания по сравнению с верблюжьим регистром по сравнению со всеми строчными буквами).
В качестве другого примера, чтобы выразить математическую идею суммы f (i) от i = 1 до n, достаточно следующего целочисленного выражения АЛГОЛА 68:
(intсумма: = 0; дляi ton doсумма +: = f (i) od; sum)
Обратите внимание, что, будучи целочисленным выражением, предыдущий блок кода может использоваться в любом контексте, где может использоваться целочисленное значение. Блок кода возвращает значение последнего вычисленного им выражения; эта идея присутствует в Lisp, среди других языков.
Все составные операторы оканчиваются характерными закрывающими скобками:
ifусловие затемоператоры [elseоператоры] fi"краткая" форма: (условие | операторы | операторы)
ifусловие1 затемоператоры elifусловие2 затемоператоры [elseоператоры ] fi"краткая" форма: (условие1 | операторы |: условие2 | операторы | операторы)
Эта схема не только позволяет избежать проблемы висячих else, но также позволяет избежать использовать begin и end во встроенных последовательностях операторов .
caseпереключить воператоры, операторы. [outоператоры] esac" краткая форма: (переключатель | операторы, операторы. | операторы)
caseswitch1 воператоры, операторы. ouseswitch2 instatements, statements. [ outstatements ] esac"brief" form of casestatement: ( switch1 | statements,statements. |: switch2 | statements,statements. | statements )
Choice clause example with Brief symbols:
procdays in month = (intyear, month)int: (month| 31, (year÷×4=0 ∧ year÷×100≠0 ∨ year÷×400=0 | 29 | 28 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
Choice clause example with Bold symbols:
procdays in month = (intyear, month)int: casemonth in31, ifyear mod4 eq0 andyear mod100 ne0 oryear mod400 eq0 then29 else28 fi, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 esac;
Choice clause example mixing Bold and Brief symbols:
procdays in month = (intyear, month)int: casemonth in¢Jan¢ 31, ¢Feb¢ ( year mod4 = 0 andyear mod100 ≠ 0 oryear mod400 = 0 | 29 | 28 ), ¢Mar¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ to Dec. ¢ esac;
[ forindex ] [ fromfirst ] [ byincrement ] [ tolast ] [ whilecondition ] dostatements odThe minimum form of a "loop clause" is thus: dostatements od
This was considered the «universal» loop, the full syntax is:
fori from1 by-22 to-333 whilei×i≠4444 do~ od
The construct have several unusual aspects:
- only the do~ odportion was compulsory, in which case the loop will iterate indefinitely.
- thus the clause to100 do~ od, will iterate only 100 times.
- the while«syntactic element» allowed a programmer to break from a forloop early. e.g.
intsum sq:=0; fori whileprint(("So far:",i,newline)); sum sq≠70↑2 dosum sq+:=i↑2 odSubsequent «extensions» to the standard Algol68 allowed the tosyntactic element to be replaced with uptoand downtoto achieve небольшая оптимизация. В те же компиляторы также включены:
- до— для позднего завершения цикла.
- foreach— для работы с массивами в параллельном.
Дополнительные примеры можно найти в примерах кода ниже.
структура, объединение & [:]: структуры, объединения и массивы
АЛГОЛ 68 поддерживает массивы с любым количеством измерений и позволяет нарезать целые или неполные строки или столбцы.
режимвектор= [1: 3] реальный; # вектор режимобъявление (typedef) # режимматрица= [1: 3,1: 3] вещественное; # матрица режимобъявление (typedef) # векторv1: = (1,2,3); # переменная массива изначально (1,2,3) # realv2 = (4,5,6); # постоянный массив, тип эквивалентный vector, подразумеваются границы # op+ = (vectora, b) vector: # binary operator definition # (vectorout; дляi от⌊a до⌈a doout [i]: = a [i] + b [i] od; out); матрицаm: = (v1, v2, v1 + v2); печать ((м [, 2:])); # фрагмент 2-го и 3-го столбцов #
Матрицы могут быть нарезаны любым способом, например:
refvectorrow = m [2,]; # определить ref(указатель) на 2-ю строку # refvectorcol = m [, 2]; # определить ref(указатель) на второй столбец #
АЛГОЛ 68 поддерживает несколько структур полей (struct) и объединенные режимы . Ссылочные переменные могут указывать на любой режим , включая срезы массива и поля структуры.
В качестве примера всего этого, вот традиционное объявление связанного списка:
modenode= union(real, int, comp, string), list= struct(nodeval, refсписокследующий);
Пример использования для unioncaseиз узла:
noden: = «1234»; реальныйr; inti; комплc; строкаs caser, i, c, s :: = n inprint (("real:", r)), print (("int : ", i)), print (("comp:", c)), print (("string:", s)) outprint (("?:", n)) esacузелn: = "1234"; casen in(realr): print (("real:", r)), (inti): print (("int:", i)), ( compc): print (("comp:", c)), (strings): print (("string:", s)) outprint (("?:", n)) esacproc: Процедуры
Объявления процедур (proc) требуют спецификации типа как для параметров, так и для результата ( voidесли нет):
procmax of real = (reala, b) real: ifa>b затемa elseb fi;
или, используя «краткую» форму условного оператора:
procmax of real = (reala, b) real: (а>б | а | б);
Возвращаемое значение proc — это значение последнего выражения, вычисленного в процедуре. Ссылки на процедуры (ref proc) также разрешены. Параметры вызова по ссылке предоставляются путем указания ссылок (например, ref real ) в списке формальных аргументов. В следующем примере определяется процедура, которая применяет функцию (указанную в качестве параметра) к каждому элементу массива:
procapply = (refreala, proc(real) realf): дляi изlwba toupba doa [ i]: = f (a [i]) od
Эта простота кода была недостижима в предшественнике ALGOL 68 ALGOL 60.
op: Operators
Программист может определить новые операторы , и те, и предопределенные, могут быть перегружены, и их приоритеты могут быть изменены кодером. В следующем примере оператор max определяется как с диадической, так и с монадической версиями (сканирование по элементам массива).
priomax= 9; opмакс= (inta, b) int: (a>b | a | b); opмакс= (реальныйa, b) реальный: (a>b | a | b); opмакс= (соответствиеa, b) соответствие: (абсa>абсb | a | b ); opmax= (reala) real: (realout: = a [lwba]; дляi отlwba + 1 toupba do(a [i]>out | out: = a [i]) od; out)
Массив, процедура, операции разыменования и принуждения
priority Operation +Algol68 + Algol68 Фактически 12
(Primary)разыменование, депроцедура (~, ~), подпись [~], гребля [~,], нарезка [~: ~], обозначения размеров длинный& короткий процедура currying (~ . ), diag, trnsp, row, col Фактически 11
(вторичный)of(выбор), loc& куча(генераторы) → ( selection) new(генераторы) Это технически не операторы, а скорее они считаются «модулями, связанными с именами «
Монадические операторы
priority
( Третичный)Algol68 «Достойные символы» + Algol68 + Algol68 + Algol68 10 не~, up, вниз, lwb, upb, -, abs, arg, bin, entier, длина, уровень, нечетный, повтор, округление, сокращение
Диадические операторы со связанными приоритетами
priority
(Tertiary)Algol68 «Достойные символы» + Algol68 + Algol68 + Algol68 9 + *, i + ×, ⊥ ! 8 shl, shr, **, up, вниз, lwb, upb ↑, ↓, ⌊, ⌈ ××, ^, lws, ups, ⎩, ⎧ 7 *, /,%, сверх,% *, mod, elem ×, ÷, ÷ ×, ÷ *,% ×, □ ÷: 6 -, + 5 =, ge,>, gt ≤, ≥ 4 eq=, ne~ = / = ≠, ¬ = 3 &, и ∧ / \ 2 or ∨ \ / 1 minusab, plusab, timesab, divab, overab, modab, plusto, Примечание. Третичные категории включают имена nilи ○.
Отношения присвоения и идентичности и т. Д.
Это технически не операторы, а скорее они считаются «единицами, связанными с именами «
priority
(четвертичные)Algol68 «Достойные персонажи» + Algol68 + Algol68 + Algol68 Фактически 0 : =, равно: = :, isnt: / =:: ~ = :, at@, «:», «;» : ≠: : ¬ =: : =: =, =: = .. =,. =, ct, . ctab, :: =. не является, «..», «.,» Примечание. Четвертичные числа включают имена skipи ~.
» : =: «(альтернативно» равно«) проверяет, равны ли два указателя;»: / =: «(альтернативно» isnt«) проверяет, не равны ли они.
Зачем нужны: =: и: / =::Попробуйте сравнить два значения указателя, например следующие переменные, объявленные как указатели на целое число:
refintip, jp
Теперь подумайте, как решить, указывают ли эти двое на одно и то же место или одно из них является точечным. до ноль. Следующее выражение
Специальные символы
IBM 2741 клавиатура с символами APL
Большая часть «Специальные» символы Алгола (⊂, ≡, ␣, ×, ÷, ≤, ≥, ≠, ¬, ⊃, ≡, ∨, ∧, →, ↓, ↑, ⌊, ⌈, ⎩, ⎧, ⊥, ⏨, ¢, ○ и □) можно найти на клавиатуре IBM 2741 со вставленной печатающей головкой APL «мяч для гольфа»; они стали доступны в середине 1960-х годов, когда существовал ALGOL 68. Эти символы также являются частью стандарта Unicode, и большинство из них доступно в нескольких популярных шрифтах .
transput: ввод и вывод
Transput— используемый термин для ссылки на средства ввода и вывода АЛГОЛА 68. Он включает предопределенные процедуры dures для неформатированной, форматированной и двоичной передачи. Файлы и другие устройства передачи обрабатываются согласованным и машинно-независимым образом. В следующем примере на устройство стандартного выводавыводится неформатированный вывод:
print ((новая страница, «Заголовок», новая строка, «Значение i равно», i, »и x [ i] is ", x [i], новая строка))
Обратите внимание на предопределенные процедуры newpage и newline , переданные в качестве аргументов.
Книги, каналы и файлы
передачарассматривается как книги, каналыи файлы:
- Книгисостоят из страниц, строк и символов и могут иметь резервные копии файлов.
- Определенную книгу можно найти по имени с помощью вызова match .
- Различают три стандартных канала: стандартный канал, выделенный канал, резервный канал.
- настройфайла может быть прочитан, записан, char, bin и открыт.
- процедуры передачи включают: установить, создать, открыть, связать , блокировка, закрытие, царапина .
- позиция запрашивает: номер символа, номер строки, номер страницы .
- процедуры макета включают:
- пробел , backspace , новая строка , newpage .
- получить хорошую строку, получить хорошую страницу, получить хорошую книгу и procset=(reffilef, intpage, line, char) void:
форматированный перенос
«Форматированный перенос» в АЛГОЛ 68 transput имеет собственный синтаксис и шаблоны (функции) с форматом, вставленным между двумя символами $.
printf (($ 2l "Сумма: "x, g (0) $, m + n)); ¢ печатает так же, как: ¢ print ((новая строка, новая строка, «Сумма:», пробел, целое (m + n, 0))
par: Параллельная обработка
АЛГОЛ 68 поддерживает программирование параллельной обработки. Используя ключевое слово par, вспомогательное предложение преобразуется в параллельное предложение, где синхронизация действий управляется с помощью семафоров. В A68G параллельные действия отображаются на потоки, если они доступны на хостинге операционной системы. В A68S была реализована другая парадигма параллельной обработки (см. ниже).
intначальная ширина стопы = 5; режимfoot= struct(строкаимя, semaширина, битыtoe ¢ упакованный вектор BOOL ¢); футлевая ступня: = фут(«Левая», уровеньисходная ширина ступни, 2r11111), правая ступня: = фут("Правый", уровеньначальная ширина стопы, 2r11111); 10 круглых обойм в 1968 Colt Python.357 Magnum ¢ semaраундов = уровень10; ¢ Магнум нужен s больше стволов, чтобы в полной мере использовать параллелизм ¢ semaполучить цель = уровень1; приоритет∧: = = 1; op∧: = = (refбитlhs, bitsrhs)refбит: lhs: = lhs ∧ rhs; procстрелять = (refфутфут) void: (↓ захватить цель; ↓ раунды; печать («БАХ!»); ↓ ширина → ступня; носок → ступня ∧: = ¬ (bin1 shllevelwidth → foot); printf (($ g ": Ой !! - «5 (g) l $, name → foot, bool(toe → foot) [ширина в битах - начальная ширина стопы + 1:])); ↑ получить цель); ¢ производите стрельбу параллельно, чтобы угодить тем, кто надеется стоять на одной ноге ¢ пар(от дляноска доисходная ширина стопы делатьстрелять (левая нога) od, ¢ длязацепа доисходная ширина стопы делатьстрелять (правая нога ) od)Примеры использования
Пример кода
Этот пример программы реализует Сито Эратосфена для поиска всех простых чисел, которые меньше чем 100. nilявляется аналогом нулевого указателя в Алголе 68 в других языках. Обозначение x изy обращается к члену x структуры structy.
begin# Сито простых чисел Алгола-68, функциональный стиль # procerror = (strings) void: (print ((newline, "error:", s, newline)); gotostop); procone to = (intn) list: ( procf = (intm, n) list: (m>n | nil| cons (m, f (m + 1, n))); f (1, n)); modelist= refузел; modeузел= struct(inth, listt); proccons = (intn, listl) list: heapnode: = (n, l); prochd = (listl) int: (l isnil| error ("hd nil") ; пропустить| h изl); proctl = (listl) list: (l isnil| error ("tl nil") ; пропустить| t изl); procshow = (listl) void: (l isntnil| print(("", целое (hd (l), 0))); показать (tl (l))); procfilter = (proc(int) boolp, listl) list: ifl isnilзатемnilelifp (hd (l)) затемcons (hd (l), filter (p , tl (l))) elsefilter (p, tl (l)) fi; procsieve = (listl) list: ifl isnil, затемnilelseprocnot multiple = (intn) bool: n modhd (l) ≠ 0; cons (hd (l), sieve (filter (not multiple, tl (l)))) fi; procprimes = (intn) list: sieve ( tl (от одного до (n))); show (primes (100)) endОперационные системы, написанные на АЛГОЛЕ 68
- компьютер Cambridge CAP — Все процедуры, составляющие операционную систему, были написаны на АЛГОЛе 68C, хотя число других тесно связанных защищенных процедур, таких как пагинатор, записано в BCPL.
- — Разработано в Университете Лидса для ICL 1900 было написано в ALGOL 68-R.
- Flex machine — Аппаратное обеспечение было настраиваемым и микропрограммируемым, с операционной системой, (модульным) компилятором, редактором, сборщиком мусора и файловой системой, написанными на ALGOL 68RS. Командная оболочка Curt была разработана для доступа к типизированным данным, аналогичным режимам Algol-68.
- VME – S3 был языком реализации операционной системы VME. S3 был основан на Алголе 68, но с типами данных и операторами, согласованными с теми, которые предлагаются в ICL 2900 Series.
Примечание: компьютеры советской эпохи Эльбрус-1 (Эльбрус-1) и Эльбрус- 2 были созданы на языке высокого уровня Эль-76 (АЛ-76), а не на традиционной сборке. Эль-76 похож на Алгол-68, главное отличие — это типы динамической привязки в Эль-76, поддерживаемые на аппаратном уровне. Эль-76 используется для приложений, управления заданиями, системного программирования.
Приложения
Оба АЛГОЛ 68C и АЛГОЛ 68-R написаны на АЛГОЛ 68, фактически превращающий АЛГОЛ 68 в приложение. Другие приложения включают:
- ELLA — язык описания оборудования и набор инструментов поддержки. Разработана Royal Signals and Radar Establishment в течение 1980-х и 1990-х годов.
- Система командования RAF Strike — «. 400K безошибочных ALGOL 68-RT код был создан с тремя человеко-годами работы. «
Библиотеки и API
- NAG Numerical Libraries — программная библиотекаподпрограмм численного анализа. Поставляется на АЛГОЛе 68 в течение 1980-х.
- TORRIX — система программирования для операций над векторами и матрицами над произвольными полями и переменного размера, разработанная С.Г. ван дер Мейлен и М. Велдхорст.
Представление программы
Особенностью АЛГОЛА 68, унаследованной от традиции АЛГОЛА, является его различные представления. Существует язык представления, используемый для описания алгоритмов в печатной работе, строгий язык (строго определенный в Отчете) и официальный справочный язык, предназначенный для использования в фактических входных данных компилятора. В примерах вы увидите полужирныйшрифт, это язык строгий. Зарезервированные слова АЛГОЛА 68 фактически находятся в пространстве имен , отличном от идентификаторов, и в идентификаторах разрешены пробелы, поэтому следующий фрагмент является допустимым:
inta real int = 3;
У программиста, который на самом деле пишет код, не всегда есть опция жирного шрифтаили подчеркивания в коде, так как это может зависеть от оборудования и культурных особенностей. Были разработаны различные методы обозначения этих идентификаторов. Это называется режимом доработки. Например, все или некоторые из следующих могут быть доступными программными представлениями:
inta real int = 3; # строгийязык # 'INT'A REAL INT = 3; # ЦИТАТНЫЙ стиль коррекции #.INT A REAL INT = 3; # Стиль обводки ТОЧКИ # INT a real int = 3; # ВЕРХНИЙ стиль обводки # int a_real_int = 3; # Стиль обновления RES, имеется 61 допустимое зарезервированное слово #
Все реализации должны распознавать как минимум POINT, UPPER и RES внутри разделов PRAGMAT. Из них строчка ТОЧКА и ВЕРХНИЙ довольно распространены, в то время как строчка RES противоречит спецификации (так как нет зарезервированных слов). ЦИТАТА (одиночное цитирование апострофа) было исходной рекомендацией, в то время как совпадающие кавычки апострофа, распространенные в АЛГОЛе 60, нечасто используются в АЛГОЛЕ 68.
Следующие символы были рекомендованы для переносимости и назывались «достойными символами» в Отчет о стандартном аппаратном представлении Algol 68 :
- ^Достойные символы: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 «# $% ‘() * +, -. / :; @ [] _ |
Это отражает проблему в 1960-х годах, когда некоторое оборудование не поддерживало строчные буквы или некоторые другие символы, отличные от ASCII, действительно в отчете за 1973 год было написано: «Четыре достойных символа -« | »,« _ », «[» и «]» — часто кодируются по-разному, даже в установках, которые номинально используют один и тот же набор символов. «
- Базовые символы:« Достойные символы »- это подмножество« основных символов ».
Пример различные представления программ
¢ подчеркивание или жирный шрифт ¢ modexint= int; xintсумма sq: = 0; дляi whilesum sq ≠ 70 × 70 dosum sq +: = i ↑ 2 od
'pr' quote 'pr' 'mode' 'xint' = 'int'; 'xint' sum sq: = 0; 'for' i 'while' sum sq ≠ 70 × 70 'do' sum sq +: = i ↑ 2 'od'
.PR UPPER.PR MODE XINT = INT; XINT сумма sq: = 0; FOR i WHILE sum sq / = 70 * 70 DO sum sq +: = i ** 2 OD
.PR POINT.PR.MODE.XINT =.INT;.XINT SUM SQ: = 0;.FOR I.WHILE SUM SQ.NE 70 * 70.DO SUM SQ.PLUSAB I.UP 2.OD
.PR RES.PR mode.xint = int;.xint sum sq: = 0; for i while sum sq ≠ 70 × 70 do sum sq +: = i ↑ 2 od
АЛГОЛ 68 позволяет каждому естественному языку определять свои собственный набор ключевых слов Algol-68. В результате программисты могут писать программы, используя ключевые слова на своем родном языке. Ниже приведен пример простой процедуры, которая вычисляет «следующий день», код находится на двух языках: английском и Немецкий.
# Дата следующего дня - вариант на английском языке # modedate= struct(intday, строкамесяц, intгод); procследующий день = (датаx) дата: ifдень ofx < length of month (month ofx, год изx) затем(день изx + 1, месяц изx, год изx) elifмесяц изx = "Декабрь" , затем(1, "январь", год изx + 1) else(1, преемник месяца (месяц изx), год изx) fi;
# Nachfolgetag - Deutsche Variante # mengedatum= tupel(тег ganz, wortmonat, ganzjahr); funktionnaechster tag nach = (datumx) datum: wenntag фонx < monatslaenge(monat фонx, jahr vonx) dann(tag vonx + 1, monat vonx, jahr vonx) wennabermonat vonx = "Dezember" dann(1, "Januar", jahr vonx + 1) ansonsten(1, nachfolgemonat (monat vonx), jahr vonx) endewenn;
Русский / советский пример: на английском языке оператор case в Algol68 читается как case~ in~ out~ esac, в кириллице это читается как выб~ в~ либо~ быв.
Some Vanitas
Из-за технических сложностей АЛГОЛ 68 нуждается в изобилии методов, чтобы отрицать существование чего-либо:
skip, «~» или «?» - неопределенное значение всегда синтаксически корректно, пусто- единственное значение, допустимое для void, необходимое для выбора voidв union, void- синтаксически как mode, но не один, nilили "○" - имя, ничего не обозначающее, неопределенного ссылочного режима, () или конкретно [1: 0] int- вакуум - это пустой массив (здесь, в частности, modeint). undefined - стандартная процедура отчетов, вызывающая исключение в системе времени выполнения. ℵ - Используется в стандартном отчете для предотвращения самоанализа определенных типов. например sema
ср. ниже другие примеры ℵ.
Пока реализована только частичная параметризация в Algol 68 Genie.
Истинная спецификация и сроки реализации ALGOL 68s
Имя Год Цель Состояние Описание Целевой ЦП Лицензирование Язык реализации 1962 Scientific NL АЛГОЛ для обобщенных грамматик АЛГОЛ Y 1966 Проект предложения Intl Первая версия Algol 68 Спецификация ACM ALGOL 68 1968 Проект предложения Intl IFIP WG 2.1 Проект отчета Спецификация — март ACM АЛГОЛ 68 1968 Стандарт Intl IFIP WG 2.1 Final Report Технические характеристики — август ACM АЛГОЛ 68-R 1970 Military UK ICL 1900 ALGOL 60 1971 Scientific ALGOL 68RS 1972 Military UK Портативная система компиляции ICL 2900 / Series 39, Multics, генератор VMS & C (1993) Авторские права Crown ALGOL 68RS Алгол 68 с областями 1972 Experi mental & other UK Добавление областей в Algol 68 Mini ALGOL 68 1973 Research NL «Интерпретатор для простых программ на Algol 68» Портативный интерпретатор Mathematisch Centrum АЛГОЛ 60 1973 Исследование US «Важность моделей реализации». UCLA АЛГОЛ 68C 1975 Scientific UK Cambridge Algol 68 ICL, IBM 360, PDP 10 и Unix, Telefunken, Tesla & Z80 (1980) Cambridge ALGOL 68C ALGOL 68 Revised Report 1975 Standard Intl IFIP WG 2.1 Revised Report Спецификация ACM 1975 Экспериментальные и другие UK Предлагаемые расширения системы режимов Algol 68 Спецификация ALGOL W Odra Алгол 68 1976 Практическое использование СССР / Польша Одра 1204 / Иллинойс Советский АЛГОЛ 60 Оклахома АЛГОЛ 68 1976 programming instruction USA Oklahoma State University implement ation IBM 1130 and System/370 /158 Unknown ANSI Fortran 66. Berlin ALGOL 68 1977 Research DE «The Berlin ALGOL 68 implementation» & An Abstract ALGOL 68 Machine – machine independent Compiler Technical University of Berlin CDL 2 FLACC 1977 Multi-purpose CA Revised Report complete implementation with debug features System/370 lease, Chion Corporation Assembler ALGOL 68-RT 1979 Scientific UK Parallel ALGOL 68-R 1979 Scientific UK ALGOL 68+ 1980 Scientific NL Proposed superlanguage of ALGOL 68 M-220 ALGOL 68 USSR M-220 Soviet EPSILON 1980 Telecommunications USSR Full language + modules IBM, DEC, CAMCOH, PS 1001 & PC Soviet Interactive ALGOL 68 1983 UK Incremental compilation PC Noncommercial shareware | ALGOL 68S 1985 Scientific Intl Sun version of ALGOL 68 Sun-3, Sun SPARC (under SunOS 4.1 & Solaris 2), Atari ST (under GEMDOS ), Acorn Archimedes (under RISC OS ), VAX-11 under Ultrix-32 Algol68toC (ctrans) 1985 Electronics UK ctrans from ELLA ALGOL 68RS Portable C generator Open-source software 1995 ALGOL 68RS MK2 Interactive ALGOL 68 1992 UK Incremental compilation PC Noncommercial shareware Algol 68 Genie 2001 Full language NL Includes standard collateral clause Portable interpreter GPL C Algol 68 Genie version 2.0.0 2010 Full language NL Portable interpreter; optional compilation of selected units GPL C The S3 language that was used to write the ICL VME operating system and much other system software on the ICL 2900 Series was a direct derivative of Algol 68. However, it omitted many of the more complex features, and replaced the basic modes with a set of data types that mapped directly to the 2900 Series hardware architecture.
Implementation specific extensions
ALGOL 68R from RRE was the first ALGOL 68 subset implementation, running on the ICL 1900. Основываясь на исходном языке, основными ограничениями подмножества были определение перед использованием и отсутствие параллельной обработки. This compiler was popular in UK universities in the 1970s, where many computer science students learnt ALGOL 68 as their first programming language; компилятор был известен хорошими сообщениями об ошибках.
ALGOL 68RS from RSRE was a portable compiler system written in ALGOL 68RS (bootstrapped from ALGOL 68R), and implemented on a variety of systems including the ICL 2900 /Series 39, Multics and DEC VAX/VMS. Язык был основан на Пересмотренном отчете, но с теми же ограничениями подмножества, что и АЛГОЛ 68R. Этот компилятор сохранился в виде компилятора с Algol68 на C.
In ALGOL 68S from Carnegie Mellon University the power of parallel processing was improved добавив ортогональное расширение, событие. Любое объявление переменной, содержащее ключевое слово event, сделало присвоения этой переменной подходящей для параллельной оценки, т.е. правая часть была преобразована в процедуру, которая была перемещена на один из процессоров C.mmp многопроцессорная система. Доступ к таким переменным задерживался после завершения присваивания.
Cambridge АЛГОЛ 68C был переносимым компилятором, который реализовал подмножество АЛГОЛА 68, ограничивая определения операторов и исключая сборку мусора, гибкие строки и форматированный перенос.
Algol 68 Genie М. ван дер Вира — это реализация Алгола 68 для современных компьютеров и операционных систем.
«Несмотря на благие намерения, программист может нарушить переносимость, непреднамеренно используя локальное расширение. Чтобы предотвратить это, каждая реализация должна предоставлять параметр прагматики PORTCHECK. Пока этот параметр действует, компилятор выводит сообщение для каждая конструкция, которую он распознает как нарушающую какое-то ограничение переносимости. «
Цитаты
- . Схема композиции типов, принятая C, в значительной степени обязана Алголу 68, хотя, возможно, она не возникла в форма, которую одобрили бы приверженцы Алгола. Центральным понятием, которое я уловил из Algol, была структура типов, основанная на атомарных типах (включая структуры), составленных в массивы, указатели (ссылки) и функции (процедуры). Концепция объединений и преобразований в Алголе 68 также оказала влияние, появившееся позже. Деннис Ричи апрель 1993 года.
- . C не происходит от Алгола 68, это правда, но влияние было, по большей части настолько тонкое, что его трудно восстановить, даже когда я думаю жесткий. В частности, тип объединения (позднее добавление к C) действительно обязан A68 не в каких-либо деталях, а в идее наличия такого типа вообще. Если говорить более глубоко, то структура типов в целом и даже, как ни странно, синтаксис объявления (часть конструктора типа) были вдохновлены A68. И да, конечно, «долго». Деннис Ричи, 18 июня 1988 г.
- «Поздравляю, ваш Учитель сделал это» — Никлаус Вирт
- Чем больше я это вижу, тем более несчастным я становлюсь — EW Dijkstra, 1968
- [. ] было сказано, что популярность A68 обратно [. ] пропорциональна расстоянию от Амстердама — Гвидо ван Россум
- [. ] Лучший мы могли отправить вместе с ним отчет меньшинства, в котором излагалось бы наше взвешенное мнение о том, что «. как инструмент для надежного создания сложных программ язык потерпел неудачу». [. ] — С. А. Р. Хоар в своем отчете за октябрь 1980 г.
- Цитата из фактического отчета меньшинства 1970 г.: «[. ] Более чем когда-либо потребуется адекватный инструмент программирования, который по своей структуре помогает программисту в самых сложных аспектах его работы, а именно в надежном создании сложных программ. В этом отношении мы не видим, как предлагаемый здесь язык [Algol68] является значительным шагом вперед: напротив, мы чувствуем, что его неявное представление Задача программиста почти такая же, как, скажем, десять лет назад. Это заставляет нас сделать вывод, что, рассматриваемый как инструмент программирования, язык должен считаться устаревшим. [. ] «Подписано: Дейкстра, Хоар, Рэнделл, Вудгер. С 23 декабря 1968 года.
См. Также
Ссылки
Цитаты
Цитированные работы
Внешние ссылки
- Пересмотренный отчет по алгоритмическому языку ALGOL 68 Официальный справочник для пользователей и разработчиков языка (большой файл pdf, сканированный из бюллетеня Algol)
- Пересмотренный отчет по алгоритмическому языку ALGOL 68 Гиперссылка HTML-версия Revised Report
- A Tutorial on Algol 68, автор Эндрю С. Таненбаум, в Computing Surveys, Vol. 8, № 2, июнь 1976 г., с исправлениями (том 9, № 3, сентябрь 1977 г.)
- Algol 68 Genie — компилятор-интерпретатор Algol 68 GNU GPL
- Алгол с открытым исходным кодом 68 реализаций на SourceForge
- Стандартное аппаратное представление Algol68 (.pdf)
- Из истории создания компилятора с Алгол 68
- Algol 68 — 25 лет в СССР
- Система программной динамической поддержки для транслятора с Алгол 68
- История C с наследием Algol68
- МакДжонс, Пол, «Реализации и диалекты Algol 68», Группа сохранения программного обеспечения, Музей истории компьютеров, 05.07.2011
- Веб-компилятор ALGOL 68 для небольших экспериментов
Алгол 68 и его влияние на программирование в СССР и России (часть 1)
В начале 60-х годов XX века сложилась следующая ситуация с языками программирования: в Америке — безраздельно царствовал Фортран, в Европе все большую популярность получал язык Алгол 60 [1], кстати, в его разработке принимали участие и американские учёные. Этот язык был довольно стройный, имел более- менее точное описание синтаксиса, в нём были некоторые новые интересные языковые черты (прежде всего, — рекурсия, чего не было в Фортране). В то же время язык обладал массой недостатков, как технических (например, использование целых числе в качестве меток) так и, собственно, языковых (например, никак не был стандартизован ввод/вывод, не была поддержана обработка литер и строк, а это уже в то время было довольно важной частью программирования, не было сложных структур данных). Поэтому авторы языка продолжили работу и в 1964 году выпустили Пересмотренное сообщение [2]. Чтобы организационно оформить эти работы, международная федерация IFIP (International Federation for Information Processing) в 1962 г. создала Рабочую группу Working Group 2.1 по алголоподобным языкам. После выпуска Пересмотренного сообщения об Алголе 60 эта группа приступила к разработке планов следующих языков программирования — наследников Алгола 60. Была выпущена так называемая Белая книга, которая содержала несколько очень интересных статей. Например, статья Ральфа Лондона, одного из создателей языка Alphard — в котором были некоторые предпосылки для доказательств корректности программ. В статье Барбары Дисков «Язык CLU» впервые были сформулировано понятие абстрактных типов данных. Была статья голландского ученого ван Вейнгаардена о двухуровневых грамматиках. Дело в том, что контекстно-свободные грамматики, которыми традиционно пользовались в то время, обычно в нормальной форме Бэкуса-Наура (Бэкус — разработчик Фортрана, а Наур — главный редактор сообщения об Алголе 60), были удобными и используются, кстати, до сих пор, но все-таки недостаточно сильными и выразительными, например, нельзя было описать контекст использования конструкции. Грамматики ван Вейнгаардена имеют двухуровневую структуру и по выразительной мощности эквивалентны машине Тьюринга, т.е. в принципе, с помощью такой грамматики можно описать любой алгоритм. На основе Белой книги, а именно, на основе предложения ван Вейнгаардена, было предложено создавать новый язык, существенно более точный, с более формализованный описанием не только синтаксиса, но и семантики. В результате, после многолетних дискуссий Рабочей группы (РГ) 2.1, в работе которой приняли участие множество известных ученых из Америки и Европы, в декабре 1968 года ПЧР приняла сообщение о языке Алгол 68 [3]. Надо сказать, что этот язык в ту пору был очень тяжельгм и трудным в понимании, поэтому РГ 2.1 продолжила свою работу, расширила состав авторов языка, и к 1973 году было подготовлено Пересмотренное сообщение об Алголе 68 [4], в котором на основе всех базовых идей исходного языка и грамматик ван Вейнгаардена был определен существенно более приемлемый язык, более простой в реализации.
Начало работ по Алголу 68 в СССР
В СССР первую информацию о работах по Алголу 68 привез член РГ 2.1, будущий академик, а тогда еще член-корреспондент АН СССР — Андрей Петрович Ершов из Академгородка (Новосибирск). Через него эта информация распространилась по стране, в том числе её получил мой научный руководитель доктор физ-мат наук Григорий Самуилович Цейтин, который в то время руководил лабораторией математической лингвистики НИИММ ЛГУ. Он принял активное участие в обсуждение языка, писал весьма дельные замечания авторам и удостоился благодарности в предисловии к публикации по Алголу 68. Понятно, что язык с новыми выразительными возможностями, с новым способом описания синтаксиса и семантики вызвал большой интерес среди программирующей общественности, стали формироваться группы, готовящиеся к его реализации. В первые годы, правда собственно до реализации дело не доходило. Например, группа математиков из Академгородка всерьез занялась переводом сообщения об Алголе 68 на русский язык. Понятно, что русское описание языка в стране, где много миллионов людей говорят по-русски, вещь важная. Я за этой работой только наблюдал и, первое время, не принимал участия. Честно скажу, мне казалось, что они слишком много времени тратят на выбор терминов, даже на обсуждение того, каким шрифтом какие термины должны быть опубликованы, а типографские возможности того времени были совсем не такими богатыми, как сейчас. Всё это вызывало массу трудностей, но это было как-то не интересно для меня. Из обсуждений того времени запомнился тот факт, что в русскоязычной литературе не было укоренившегося слова, обозначающего файл. Предлагались различные варианты переводы этого важного понятия: «тека» (от слова библиотека), «фонд» и так далее. Я помню, как шутил на эту тему Андрей Берс из Академогородка, что в русском языке есть только два слова, заканчивающихся на «-айл» — кайло и хайло, потом он всегда немножко молчал и с улыбкой добавлял: «ну, конечно, есть еще и Задыхайло». Задыхайло был очень известным советским программистом, не знаю, обижался ли он на эту шутку или нет, но я запомнил, что «-айл» это не очень русское окончание. Тем не менее, после долгих обсуждений был принят термин файл, которым мы пользуемся до сих пор. Кстати говоря, таких терминов в то время было принято довольно много, именно в связи с Алголом 68. Например, «сборка мусора». Первоначально казалось, что это совершенно не технический, не научный термин. Но, с другой стороны, это прямой перевод англоязычного термина garbage collection, довольно точно отражающего суть дела (в процессе динамического распределения памяти возникают участки памяти, на которые уже никто не ссылается, т.е. реальный мусор). Поэтому механизм, который уплотняет память, оставляет в памяти только те участки, на которые есть реальные ссылки это, действительно, сборка мусора. В основном перевод был работой Александра Федоровича Papa. Когда оригинальное сообщение об Алголе 68 было опубликовано (в 1969 г., так как официальное принятие осуществилось только в декабре 1968 г.), важно отметить, что уже в том же 1969 году в журнале «Кибернетика» вышел перевод сообщения об Алголе 68 [5], т е. все признавали, насколько важно иметь описание такого нового языка на русском языке.
Первые реализации Алгола 68 в СССР
У нас в Ленинграде Г.С. Цейтин собрал группу, состоящую из нескольких кандидатов наук и довольно большого количества студентов, которой предложил заниматься реализацией Алгола 68. Дело было новое, опыта программирования трансляторов не было ни у кого из нас. Борис Константинович Мартыненко, который в то время был руководителем лаборатории системного программирования, провел 10 месяцев в Дании на стажировке у Наура и принял участие в реализации транслятора с Алгола 60 GIER — одного из самых известных трансляторов на тот период. Насколько я знаю, он занимался лексическим анализатором (сканером, говоря в современных терминах). Конечно, он знал и общее устройство транслятора и даже читал курс в Университете на мат-мехе, который я на третьем курсе посещал. Итак, группа была сформирована, мы активно изучали язык. Язык был действительно довольно трудным для понимания, но мы были молодыми, мы были математиками и нам казалось, что это вполне естественно разбираться в сложных вещах. Разобрались, причем разобрались настолько, что находили ошибки в описании, писали авторам языка, получали ответы и продумывали реализацию. Первые полтора-два года эта работа носила чисто исследовательский характер, даже без возможностей для выхода на практическую реализацию транслятора. Так совпало, что примерно в то же самое время в СССР были развернуты работы по созданию системы ЕС ЭВМ. Это была полная копия серии ШМ/360, руководство страны надеялось совершить такой «китайский скачок», разом догнав американцев по номенклатуре вычислительных машин и, особенно, по набору прикладных программ для них. Я не хочу сейчас вдаваться в обсуждение. хорошо это были или плохо. Лично я считаю, что это было ошибкой — у нас была довольно сильная школа советских создателей ЭВМ, были довольно интересные программы, в том числе и трансляторы с языков высокого уровня, например, для ЭВМ «Минск». Были, как минимум, три транслятора с Алгола 60, выполненные по руководством С.С. Лаврова в Подлипках (ТА-1М), А.П. Ершова в Академгородке (Альфа-транслятор) и М.Р. Шура-Буры в Москве (ТА-2). Но решение было принято, машины серии ЕС начали проектировать, под это были отпущены определенные, довольно крупные финансовые ресурсы. В рамках процесса создания новых ЭВМ нам удалось получить финансирование для работ по отладочному транслятору с Алгола 68 для будущей ЕС ЭВМ (повторюсь, что ЕС ЭВМ в то время еще не было, она только проектировалась и разрабатывалась). Будучи студентом 5-го курса мат-меха я поехал в Москву для подписания договора с НИЦЭВТом. Так получилось, что старшие товарищи по разным причинам не смогли поехать, поэтому послали меня. Там я в первый раз встретился с А.П. Ершовым, который приехал ровно с той же целью — подписывать договор на создание транслятора с Алгола 68 для ЕС ЭВМ (проект Бета). На самом деле идея Ершова была существенно более глобальной — он хотел разработать семейство трансляторов с языков Алгол 68, PL/I, Симула 67 для разных машин, то есть реализовать идею UnCoL. Кстати, я только недавно узнал, что первые публикации по UnCoL (Universal Common Language) появились в Communications of ACM еще в 1958 году — идея при создании трансляторов с m языков на п ЭВМ изменить число компиляторов с m*n на m+n (сначала программы со всех входных языков переводятся на некий универсальный промежуточный язык, а потом из него делаются генераторы в коды разных ЭВМ). Эта идея довольно старая, но, насколько я знаю, в полном виде она до сих пор не была осуществлена. Ершов хотел заняться именно такой глобальной темой, и была достигнута договоренность между Ершовым и Цейтиным, что мы будем делать трансляторы со строго одинакового стандарта входного языка, но наш ленинградский транслятор будет играть роль отладочного, более-менее быстрого транслятора, а новосибирская система Бета будет глубоко оптимизирующим транслятором. Понятно, что наши коллеги из Академгородка хотели использовать опыт, который они накопили при проектировании и разработке транслятора Альфа с Алгола 60. Итак, работа из чисто научно-исследовательской превратилась в хозяйственно-договорную со строгими этапами и сроками. Не всем участникам нашей группы это понравилось. Одно дело, когда ты спокойно работаешь, пишешь статьи, выступаешь на конференциях, и никто на тебя не давит, никто не напоминает, что завтра приедут заказчики и им надо предъявить такой-то отчет. Совсем другое дело — производственная работа. Однако, в те годы мы все это понимали не слишком сильно. Вольница была довольно большая, в Университете каждый занимался, чем хотел, и, кстати, научные результаты от этого не только не страдали, но, может быть, даже и выигрывали. Но даже само слово «плановость» было для нас чуждым в то время. Так началась наша работа в тесном контакте с новосибирской группой. Эта работа приобрела и организационные формы.
Рабочая группа по Алголу 68
В рамках ГКНТ — Государственного комитета по науке и технике — была создана Рабочая группа, которую возглавил А.П. Ершов. Первое время его заместителем был Г.С. Цейтин. Примерно к 1975 году Цейтин во многом потерял интерес к этой сугубо практической работе, увлекся языками искусственного интеллекта, семантическими сетями и другими интересными вещами (например, языками проектирования поведения роботов) и постепенно стал отходить от работ по Алголу 68. Тогда Ершов назначил меня заместителем председателя Рабочей группы. Не скрою, это было очень лестно для меня, но это была не синекура — приходилось довольно много работать, и Ершов следил за тем, чтобы мы занимались существенно более широким кругом вопросов. Алгол 68 был в некоторой степени только поводом для встреч специалистов из разных городов, которые проходили 5-6 раз в год (чаще в Ленинграде и Академгородке, но и в других городах тоже, в Москве, Ростове, иногда в курортных местах, чтобы участникам был и дополнительный интерес отвлечься от основной работы и посетить заседание Рабочей группы). После выхода в 1973 году Пересмотренного сообщения об Алголе-68 в Рабочей группе началась интенсивная работа по подготовке его официального перевода на русский язык. В этом работе принимали участие практически все члены Рабочей группы, но основную роль играл Андрей Александрович Берс. Эта титаническая работа завершилась публикацией в 1979 году толстой книги — билистинга [6]. Слева был оригинальный текст, а справа — перевод. Еще раз повторю, что многие русские термины вводились практически впервые, поэтому было решено оставить английский текст для справок. Довольно часто Ершов давал членам Рабочей группы различные статьи на реферирование. Дело в том, что Ершов был одним из немногих советских специалистов, который реально мог выезжать за границу, посещать капиталистические страны — в те годы это было довольно трудно. Я помню, каким событием было, когда Цейтина отпустили на конференцию то ли в Румынию, то ли в Венгрию — даже такие поездки были в то время редкостью. А Ершов ездил, причем довольно свободно, у него были широкие связи в среде научной общественности, многие присылали ему свои статьи как уважаемому человеку. Ершов стремился, чтобы эти статьи не просто лежали на полке, раздавал их членам рабочей группы, мы их читали, а потом делали доклады на заседаниях рабочей группы и, главное, обсуждали эти статьи. Например, мне как-то раз Ершов поручил прочитать (и выступить с докладом по прочитанному материалу) статью С. Джонсона «Yet another compiler compiler» [7]. Сейчас все знают, что такое Yacc, то есть компилятор компиляторов — компилятор, который на входе получает грамматику языка, а на выходе — компилятор (на самом деле, только анализатор) с этого языка. Но в те годы это все было в новинку, и мне было очень интересно это прочитать. Или, например, статья Вулфа про оптимизации [8]. Он сделал оптимизирующий транслятор: вначале был придуман некий универсальный промежуточный язык (ПЯ), и любая оптимизация не меняла структуры текста на ПЯ, только добавлялись параметры в узлы графов, представляющих операторы программы. Была выполнена серия забавных экспериментов: было задано несколько оптимизаций, которые выполнялись в разной последовательности. Оказалось, что некоторые оптимизации надо выполнять несколько раз, так как применение одной оптимизации дает материал для других. Последовательность оптимизаций также влияет на качество кода — это была интересная статья, я ее изучил и потом рассказал о ней на заседании Рабочей группы. Также на заседаниях обсуждались различные учебные материалы по Алголу 68, сравнивались различные реализации. В СССР появилось довольно много групп, реализующих Алгол 68. Попробую перечислить эти группы (работа шла в 70-е годы XX века). Очень интересная группа работала в Киеве (научный руководитель — Екатерина Логвиновна Ющенко, среди авторов были Штетельмен, Штейнбук, Макогон). Эта группа реализовывала не столько транслятор, сколько некоторую базу данных, их интересовали Persistent Data (сохраняемые данные). Если пользователь заканчивал работу, он мог нажать специальную кнопку, и все данные, созданные в процессе сеанса, запоминались в некоторой базе данных, а в следующий раз можно было начать с прерванного места. Тогда это была довольно большая новинка и интересная работа, но для нас, для Рабочей группы по Алголу 68 это было отчасти посторонней работой. Например, группа в Киеве даже не перешла на Пересмотренное сообщение об Алголе 68, а продолжала работать в соответствии с первым Сообщением, которым позже уже никто не пользовался. Тем не менее, эта работа была интересна. Мне всегда очень нравилась работа московского ЦЭМИ (Центральный экономико-математический институт) под руководством Михаила Рувимовича Левинсона. Они разрабатывали транслятор с Алгола 68 для DEC-вской архитектуры PDP11 — тогда были советские копии СМ3, СМ4, СМ1420, и для этих машин москвичи сделали транслятор. Они предложили интересную идею отказаться от ограничений на область действия объектов, все данные размещать в куче, это давало возможность перейти к функциональным языкам (частичная параметризация, функции, выдаваемые в качестве результата вызовов других функций, и так далее). Тогда на первый план выходит, конечно, сборка мусора, и она занимает довольно большой процент времени счета, но, тем не менее, Левинсону и его коллегам удалось преодолеть эти трудности, и транслятор заработал. Очень интересная пионерская работа! Одной из наиболее удачных реализаций являлась работа другой московской группы под руководством Александра Николаевича Маслова, куда входили Валерий Броль, Владимир Гущин и Владимир Яковлев. Эти молодые люди реализовали транслятор с Алгола 68 для новой советской машины Эльбрус. Эльбрус мы все очень любили, поскольку это была одна из немногих в то время оригинальных советских машин. Злые языки, конечно, говорили, что Эльбрус чем-то похож на Burroughs, но, поскольку я хорошо знаю архитектуру этих двух машин, то считаю, что это именно злые языки — так как многие идеи Эльбруса были абсолютно оригинальными. Для этой хорошей машины был сделан транслятор с более-менее полного языка Алгол 68, и я даже участвовал в некой комиссии по приемке этого транслятора на Эльбрусе. Надо сказать, что этой группе было легче работать, так как Эльбрус — это high-level language (HLL)-computer, то есть компьютер, ориентированный на языки высокого уровня, и поэтому многие вещи, которые, например, нам на ЕС ЭВМ приходилось реализовывать многими командами (вырезки, циклы, вызовы процедур), в Эльбрусе реализовывались существенно проще — для всех этих конструкций были специальные машинные команды. Еще пару слов про Академгородок и группу Ершова. Первоначально входными языками в проекте Бета были Алгол 68, Симула 67 и PL/1, а целевыми машинами были ЕС ЭВМ и БЭСМ 6. Эта группа вела огромное количество исследований, были очень интересные публикации, интересные результаты, но до практического воплощения дошли только трансляторы для БЭСМ-6 с Симульг 67 и Паскаля (Георгий Степанов и Сергей Покровский) и транслятор с Модулы 2, который выполнил Леонид Захаров. Называлось еще подмножество языка Ада, который реализовал Сергей Тен, но у меня об этом трансляторе мало информации.
Транслятор А68 ЛГУ
Итак, мы реализовали транслятор с Алгола 68 на ЕС ЭВМ. Поскольку ЕС ЭВМ появилась только в 1974, а реально работающей машиной стала в 1975, то нам пришлось некоторое время работать на других машинах. Начали мы с польской ЭВМ Одра 1204, там был довольно хороший транслятор с Алгола 60, поэтому анализирующую часть транслятора с Алгола 68 мы написали на Алголе 60 и отлаживали на Одре 1204. Попутно пришлось решать довольно много новых задач в технике трансляции, например, даже структура компилятора оказалась нестандартной, нетрадиционной. В Алголе 68 можно описывать новые типы и операции над ними. Так вот, если написано m а;, то это может быть описанием переменой а, если m — тип, а может быть унарной операцией, если m — операция. Мы этого не поймем, пока не идентифицируем m. Но, чтобы идентифицировать m, нам надо составить таблицу всех описаний с учетом блочной структуры, а это невозможно сделать без синтаксического анализа. Получается некий замкнутый круг. У нас сразу было принято разделение труда — все конструкции были поделены между участниками группы (например, Цейтин взял себе вызов процедур и работал с параллельными предложениями. Это, действительно, самые трудные куски Алгола 68). Структурой компилятора в целом никто не занимался. Этим стал заниматься я и придумал некую схему из шести просмотров, которые чередуются (прямой, обратный) и в каждой прямой фазе собирается некоторая информация к концу конструкции, а на обратном просмотре эта информация передается к началу конструкции. Я предложил выполнить сначала некий первичный, более-менее примитивный синтаксический анализ только с целью проидентифицировать индикаторы видов и операций. Потом выполняется полный видовой анализ и генерация кода. В те годы даже опубликовать эти работы было практически негде — не было журналов по программированию. В 1975 году был образован академический журнал «Программирование», который издается до сих пор. Эго один из немногих отечественных журналов по нашей специальности, который индексируется в Web of Science и Scopus. Буквально во втором номере этого журнала опубликована моя статья «Процессы идентификации и структура компилятора с языка Алгол 68» [9]. Еще раз повторю, что на Одре работал только анализатор, генератор кода мы стали писать на языке макрогенератора ассемблера будущей ЕС ЭВМ, поскольку мы получили доступ к ее прообразу — к оригинальной американской машине IBM/360 — уж не знаю, какими путями удалось купить эти две машины (тогда были жесткие ограничения на поставку в СССР высокотехнологичной продукции), я даже помню их названия — Озон и Лотос. Они были установлены в НИЦЭВТЕ, головной организации, занимающейся разработкой ЕС ЭВМ, в Москве на Варшавском шоссе. Мы ездили туда еженедельно на 2-3 ночи. Конечно, днем на машинах работали москвичи, а ночное время давали нам, приезжим. Вначале это были чисто американские машины, затем рядом с каждым устройством стали ставить его аналог (рядом с оригинальным дисководом — немецкий, рядом с оригинальным устройством печати — болгарский аналог, что-то было из Чехословакии). В первое время эти аналоги работали довольно плохо, а так как мы работали ночами, за нами особенно не присматривали, мы научились быстро передергивать кабельные разъемы и работали только на оригинальных американских устройствах, чтобы особо не страдать. Конечно, это не приветствовалось, зато мы быстрее работали. То же можно сказать и про операционную систему. Пока коллеги из НИЦЭВТа прочитают версию программы операционной системы, пока разберутся, пока найдутся какие-то описания, уже выходила другая версия. В конце концов, в одном из американских университетов была разработана вообще другая операционная система VM (Virtual Machine). IBM купила эту систему у университета, доработала, сделала ее существенно более широкой по функциональности, но во много раз хуже по эффективности. Поэтому все передавали друг другу магнитную ленту с оригинальной операционной системой от университета, а не официальную IBM-овскую версию, которая была рекомендована компанией и НИЦЭВТом. Это было тяжелое время, на протяжении многих и многих недель надо было каждую неделю ночами работать на компьютере, это было очень непросто, и все мои старшие товарищи отошли от этой работы: еженедельные поездки в Москву с тяжелейшими чемоданами, набитыми колодами перфокарт (магнитные ленты появились и стали реально использоваться намного позже), проживание в гостинице, ночная работа отнимали много сил. Работать на новой технике, когда и спросить было не у кого при возникновении проблем, было и трудно, и интересно. В результате такой тяжелой работы мы сделали генерирующую часть из промежуточного языка в коды ЕС ЭВМ, всё как-то заработало. К этому времени у нас на мат-мехе уже появилась ЕС ЭВМ, причем это была первая машина такого класса (ЕС1030), поставленная в открытой, а не в военной организации — об этом даже писали ленинградские газеты. Наконец, мы решили перенести весь транслятор на ЕС ЭВМ, применив метод раскрутки — переписали генеририрующую часть на Алголе 68 и транслировали каждую из нескольких сот процедур сначала на Одре 1204, получали текст на ПЯ в виде перфоленты, которую потом несли на ЕС ЭВМ, вводили (это был текст на макроязыке) и транслировали с макроассемблера в коды ЭВМ. Эта работа заняла около года, в это время было найдено много ошибок в трансляторе — ведь это же шикарный, огромный тест на Алголе 68. Попутно выяснилось, что многие конструкции мы реализовали не слишком удачно. Например, мне запомнилась борьба за эффективность вызова. Первая реализация требовала 6 команд в порождении кода и 23 команды в подпрограмме. Работало это довольно медленно, мы предприняли большое количество усилий, чтобы ускорить процесс. Главный прорыв произошел тогда, когда мы, зная уже устройство UNIX, пустили динамическое распределение памяти справа налево, так что базовый регистр стал указывать и на вершину стека, и на статику текущей процедуры. В этих условиях нам удалось сделать так, чтобы на вызов приходилось полторы команды — одна четырехбайтовая и одна двухбайтовая команда и всего 11 команд в подпрограмме. В те годы, когда аналогичный транслятор с PL/I F занимал порядка 150 команд на каждый вызов, наш результат я оцениваю довольно высоко. Как только закончилась первая раскрутка, мы тут же приступили ко второй раскрутке, продолжая улучшать качество кода, уменьшая время трансляции и так далее. В результате, после трех раскруток, получился довольно приемлемый транслятор, которым начали пользоваться программисты, в первую очередь, из военных организаций, потому что именно там требовалась особо высокая надежность.
Влияние Алгола 68 на другие языки
Как известно, Алгол 68 мирового признания не получил. В академических кругах им пользовались, было реализовано несколько трансляторов в разных странах. Возможно, это связано с тем, что Алгол 68 действительно был тяжеловат для широкой публики, он был рафинированным языком для Академии (так на Западе называют сотрудников университетов и исследовательских центров). Возможно, тому есть и другие причины. Появился Паскаль, который занял нишу простых языков. Никлаус Вирт на симпозиуме, посвященном его собственному восьмидесятилетию, который я недавно посетил (кстати, сам Никлаус жив-здоров и до сих пор активно работает, его и сейчас весьма интересно слушать, его идеи до сих пор продуктивны), рассказал историю языков, как он её видит. Он был членом Рабочей группы 2.1 и только позже он вышел из нее вместе с Хоаром и Дейкстрой, подписав так называемый Minority Report (Мнение меньшинства). Позже он создал язык Паскаль как ответ на вызов Алгола 68 — как сделать выразительный, но простой язык. Как обычно, эта простота не далась даром. В нашей ленинградской группе, как только Паскаль появился, мы параллельно с нашими работами по Алголу 68 приступили к работам по созданию и транслятора с Паскаля (руководил этими работами Аркадий Попов). Мы сразу же наткнулись на кучу несоответствий. В стремлении упростить язык Вирт не обратил внимания на очень многие вещи. Например, Паскаль — язык с более-менее строгой типизацией. Целой переменной присвоить вещественное значение нельзя. Но, если процедура передается параметром другой процедуре, то корректность ее параметров уже никак не проверяется. Эго такая дырка в описании. Еще один пример — было опубликовано описание Паскаля на русском языке под редакцией известного программиста Д.Б. Подшивалова из Москвы. На слова: «Паскаль существенно превосходит по мощности Алгол 60» была сноска редактора: «С этим утверждением трудно согласиться, например, на Паскале трудно написать универсальную программу умножения матриц», так как в Паскале границы массива входят в его тип, так что, формально говоря, нужна своя процедура умножения матриц для массивов разных размеров [10]. Тем не менее, влияние Алгола 68, конечно же, очевидно, если смотреть на набор конструкций Паскаля. На мой взгляд, еще более ярким примером преемственности к Алголу 68 является язык С, опубликованный в 1972 году. В С, как и в Алголе 68, возможна выдача значения условным выражением, присваиванием, последовательностью операторов, а операция с накоплением а+=Ь — это же явно из Алгола 68 взято. Последовательные предложения, когда (а=ор1, Ь=ор2, выражение)+1 — это же чистая калька последовательного предложения из Алгола 68, только вместо «;» ставится «,». Эта конструкция очень удобна и используется, скажем, для передачи параметров когда в сложном выражении нужно попутно запомнить какие-то промежуточные результаты. Не могу закончить эту часть доклада, не вспомнив, что мне было довольно трудно внедрять Алгол 68 в СССР. Времена были такие, что, если не было какого-то западного аналога, то никто и говорить не хотел. Когда в США появился язык Ада, быстро ставший стандартом Министерства Обороны США, этот язык был очень далек от Фортрана и PL/I, но очень похож на Алгол 68 по мощи, по выразительной силе, по полной типизации и так далее. Появление языка Ада в Америке помогло мне с внедрением Алгола 68 в СССР. Я стал говорить: «Смотрите, а Америке появился язык с полной типизацией, вопросы надежности ПО выходят на первый план», и этот аргумент мне очень помогал при внедрении Алгола 68, особенно, в военных организациях СССР. Об авторе: Санкт-Петербургский государственный университет
Санкт-Петербург, Россия
а.terekhov@spbu.ru
Материалы международной конференции Sorucom 2014 (13-17 октября 2014)
Помещена в музей с разрешения авторов 13 ноября 2015