АЛГОЛ 68

Язык программирования

АЛГОЛ 68
Пересмотренный отчет об алгоритмическом языке - Алгол 68 под редакцией: А. ван Вейнгаарден и др., сентябрь 1973 г. [1]
ПарадигмыМультипарадигма : одновременная , императивная
СемьяАЛГОЛ
РазработаноА. ван Вейнгаарден , Б. Дж. Майу , Дж. Э. Пек и ЧА Костер и др.
Впервые появилсяОкончательный отчет: 1968 ; 56 лет назад r0 ( 1968 )
Стабильный релиз
Алгол 68/RR/Пересмотренный отчет: 1973 г .; 51 год назад r1 ( 1973 )
Дисциплина набора текстастатичный , прочный , безопасный , структурный
ОбъемЛексический
Основные внедрения
АЛГОЛ 68C , Алгол 68 Джинн (недавний), АЛГОЛ 68-R , АЛГОЛ 68RS , АЛГОЛ 68S , FLACC , Алгол 68 Ленинград/Ленинградский отряд, Одра АЛГОЛ 68
Диалекты
АЛГОЛ 68/FR (Окончательный отчет r0 )
Под влиянием
АЛГОЛ 60 , АЛГОЛ Y
Под влиянием
C , [3] [5] C++ , [6] Bourne shell , KornShell , Bash , Steelman , Ada , Python , [7] Seed7 , Mary , S3

ALGOL 68 (сокращение от Algorithmic Language 1968 ) — императивный язык программирования , задуманный как преемник языка программирования ALGOL 60 , разработанный с целью гораздо более широкой сферы применения и более строго определенного синтаксиса и семантики.

Сложность определения языка, которое достигает нескольких сотен страниц, заполненных нестандартной терминологией, затрудняла реализацию компилятора , и было сказано, что у него «нет реализаций и нет пользователей». Это было правдой лишь отчасти; ALGOL 68 нашел применение на нескольких нишевых рынках, в частности в Соединенном Королевстве , где он был популярен на машинах International Computers Limited (ICL) и в учебных целях. За пределами этих областей применение было относительно ограниченным.

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

Многие языки 1970-х годов прослеживают свой дизайн именно к ALGOL 68, выбирая некоторые функции и отказываясь от других, которые считались слишком сложными или выходящими за рамки определенных ролей. Среди них — язык C , на который ALGOL 68 оказал непосредственное влияние, особенно его строгая типизация и структуры. Большинство современных языков прослеживают по крайней мере часть своего синтаксиса либо к C, либо к Pascal, и, таким образом, напрямую или косвенно к ALGOL 68.

Обзор

Возможности ALGOL 68 включают синтаксис на основе выражений, объявляемые пользователем типы и структуры/тегированные объединения, справочную модель переменных и справочных параметров, нарезку строк, массивов и матриц, а также параллелизм.

ALGOL 68 был разработан Рабочей группой IFIP 2.1 по алгоритмическим языкам и исчислениям Международной федерации по обработке информации (IFIP) . 20 декабря 1968 года язык был официально принят группой, а затем одобрен для публикации Генеральной ассамблеей IFIP.

ALGOL 68 был определен с использованием формализма , двухуровневой формальной грамматики , изобретенной Адрианом ван Вейнгарденом . Грамматики ван Вейнгардена используют контекстно-свободную грамматику для генерации бесконечного набора производных, которые распознают конкретную программу ALGOL 68; в частности, они способны выражать тип требований, которые во многих других технических стандартах языков программирования называются семантикой и должны быть выражены в подверженной неоднозначности естественно-языковой прозе, а затем реализованы в компиляторах как специальный код, прикрепленный к формальному синтаксическому анализатору языка.

АЛГОЛ 68 был первым (и, возможно, одним из последних) крупным языком, для которого было дано полное формальное определение до его реализации.

CHA Костер [8]

Основные цели и принципы построения АЛГОЛа 68:

  1. Полнота и ясность описания [9]
  2. Ортогональность дизайна [10]
  3. Безопасность [11]
  4. Эффективность: [12]
    • Проверка статического режима
    • Независимый от режима синтаксический анализ
    • Независимая компиляция
    • Оптимизация цикла
    • Представления – в минимальных и больших наборах символов

ALGOL 68 подвергался критике, особенно со стороны некоторых членов его проектного комитета, таких как К. А. Хоар и Эдсгер Дейкстра , за отказ от простоты ALGOL 60 , превращение в средство для сложных или слишком общих идей и незначительную работу по облегчению задачи разработчика компилятора в отличие от намеренно простых современников (и конкурентов), таких как C , S-algol и Pascal .

В 1970 году ALGOL 68-R стал первым рабочим компилятором для ALGOL 68.

В редакции 1973 года некоторые особенности, такие как процедуры , гоммы [13] и формальные границы , были опущены. [14] Ср. Язык непересмотренного отчета.r0

Хотя европейские оборонные агентства (в Великобритании — Королевское управление радиолокации и связи (RSRE)) продвигали использование языка ALGOL 68 из-за его предполагаемых преимуществ в плане безопасности, американская сторона альянса НАТО решила разработать другой проект — язык Ada , сделав его использование обязательным для оборонных контрактов США.

АЛГОЛ 68 также имел заметное влияние в Советском Союзе , подробности о котором можно найти в статье Андрея Терехова 2014 года: «АЛГОЛ 68 и его влияние на СССР и российское программирование», [15] и «Алгол 68 и его влияние». по программированию в СССР и России». [16]

Стив Борн , входивший в комитет по пересмотру ALGOL 68, перенес некоторые из его идей в свою оболочку Bourne (и, следовательно, в дочерние оболочки Unix, такие как Bash ) и в C (и, следовательно, в дочерние оболочки, такие как C++ ).

Полную историю проекта можно найти в книге CH Lindsey «История ALGOL 68» . [17] [18]

Полное описание языка см. в книге «Программирование ALGOL 68 Made Easy» [19] д-ра Сиан Маунтбеттен или в книге «Изучение ALGOL 68 Genie» [20] Марселя ван дер Вира, которая включает в себя пересмотренный отчет.

История

Происхождение

ALGOL 68, как следует из названия, является продолжением языка ALGOL , который был впервые формализован в 1960 году. В том же году Международная федерация по обработке информации (IFIP) сформировала и начала работу Рабочую группу по ALGOL, или WG2.1. Эта группа выпустила обновленную спецификацию ALGOL 60 в Риме в апреле 1962 года. На последующем заседании в марте 1964 года было решено, что группа должна начать работу над двумя последующими стандартами, ALGOL X , который будет переопределением языка с некоторыми дополнениями, и ALGOL Y , который будет иметь возможность изменять свои собственные программы в стиле языка LISP . [21]

Процесс определения

Первая встреча группы ALGOL X состоялась в Принстонском университете в мае 1965 года. В отчете о встрече были отмечены две широко поддерживаемые темы: введение строгой типизации и интерес к концепциям Эйлера «деревьев» или «списков» для обработки коллекций. [22]

На второй встрече в октябре во Франции были представлены три формальных предложения: ALGOL W Никлауса Вирта вместе с комментариями о структурах записей CAR (Tony) Hoare , похожий язык Герхарда Зеегмюллера и статья Адриана ван Вейнгаардена на тему «Ортогональное проектирование и описание формального языка». Последняя, ​​написанная на почти неразборчивой «W-грамматике», оказалась решающим сдвигом в развитии языка. Встреча завершилась соглашением о том, что ван Вейнгаарден перепишет предложение Вирта/Хора, используя свою W-грамматику. [22]

Эта, казалось бы, простая задача в конечном итоге оказалась сложнее, чем ожидалось, и последующую встречу пришлось отложить на шесть месяцев. Когда она состоялась в апреле 1966 года в Котвейке , черновик ван Вейнгаардена остался незавершенным, и Вирт и Хоар представили версию, использующую более традиционные описания. Было в целом решено, что их статья была «правильным языком в неправильном формализме». [23] По мере изучения этих подходов стало ясно, что существует разница в способе описания параметров, которая будет иметь реальные эффекты, и хотя Вирт и Хоар протестовали, что дальнейшие задержки могут стать бесконечными, комитет решил дождаться версии ван Вейнгаардена. Затем Вирт реализовал свое текущее определение как ALGOL W. [24]

На следующей встрече в Варшаве в октябре 1966 года [25] был представлен первоначальный отчет Подкомитета по вводу/выводу, который встречался в Национальной лаборатории Оук-Ридж и Иллинойсском университете , но еще не достиг большого прогресса. Два предложения с предыдущей встречи были снова изучены, и на этот раз возник новый спор об использовании указателей ; ALGOL W использовал их только для ссылки на записи, в то время как версия ван Вейнгаардена могла указывать на любой объект. Чтобы добавить путаницы, Джон Маккарти представил новое предложение по перегрузке операторов и возможности связывать вместе конструкции и или , а Клаус Самельсон хотел разрешить анонимные функции . В результате путаницы было некоторое обсуждение отказа от всех усилий. [24] Путаница продолжалась до того, что должно было стать встречей ALGOL Y в Зандвоорте в мае 1967 года. [22]

Публикация

Проект отчета был наконец опубликован в феврале 1968 года. Это было встречено «шоком, ужасом и несогласием» [22] , в основном из-за сотен страниц нечитаемой грамматики и странной терминологии. Чарльз Х. Линдси попытался выяснить, какой «язык был скрыт внутри него» [26] , процесс, который занял шесть человеко-недель усилий. Получившаяся в результате статья «АЛГОЛ 68 с меньшим количеством слез» [27] была широко распространена. На более широком совещании по обработке информации в Цюрихе в мае 1968 года участники жаловались, что язык был навязан им и что IFIP был «истинным злодеем этой неразумной ситуации», поскольку совещания в основном были закрытыми и не было никакого формального механизма обратной связи. Вирт и Петер Наур официально отказались от своих авторских должностей в WG2.1 в то время. [26]

Следующая встреча WG2.1 состоялась в Тиррении в июне 1968 года. На ней предполагалось обсудить выпуск компиляторов и другие вопросы, но вместо этого она переросла в обсуждение языка. Ван Вейнгаарден ответил, заявив (или пригрозив), что он выпустит только еще одну версию отчета. К этому моменту Наур, Хоар и Вирт оставили работу, и еще несколько человек угрожали сделать это. [28] Последовало еще несколько встреч: в Норт-Бервике в августе 1968 года, в Мюнхене в декабре, которые привели к выпуску официального отчета в январе 1969 года, но также привели к написанию спорного отчета меньшинства. Наконец, в Банфе, Альберта , в сентябре 1969 года проект был в целом признан завершенным, и обсуждение в основном касалось исправлений и значительно расширенного введения к отчету. [29]

Усилия заняли пять лет, выжгли многие из величайших имен в компьютерной науке и несколько раз заходили в тупик из-за проблем как в определении, так и в группе в целом. Хоар почти сразу же выпустил «Критику ALGOL 68», [30] на которую широко ссылались во многих работах. Вирт продолжил развивать концепцию ALGOL W и выпустил ее как Pascal в 1970 году.

Реализации

АЛГОЛ 68-Р

Первая реализация стандарта, основанная на черновике Отчета конца 1968 года, была представлена ​​Королевским радиолокационным учреждением в Великобритании как ALGOL 68-R в июле 1970 года. Однако это было подмножество полного языка, и Барри Майу , последний редактор Отчета, пошутил, что «Это вопрос морали. У нас есть Библия, а вы грешите!» [31] Тем не менее эта версия стала очень популярной на машинах ICL и стала широко используемым языком в военном кодировании, особенно в Великобритании. [32]

Среди изменений в 68-R было требование, чтобы все переменные были объявлены до их первого использования. Это имело существенное преимущество, поскольку позволяло компилятору быть однопроходным, поскольку место для переменных в записи активации отводилось до ее использования. Однако это изменение также имело побочный эффект, требуя, чтобы PROC были объявлены дважды, один раз как объявление типов, а затем еще раз как тело кода. Другое изменение заключалось в устранении предполагаемого режима VOID , выражения, которое не возвращает никакого значения (называемого оператором в других языках), и требуя добавления слова VOID там, где оно предполагалось. Кроме того, 68-R устранил явные команды параллельной обработки, основанные на PAR . [31]

Другие

Первая полная реализация языка была представлена ​​в 1974 году CDC Netherlands для серии мэйнфреймов Control Data . Она имела ограниченное применение, в основном в преподавании в Германии и Нидерландах. [32]

Версия, похожая на 68-R, была представлена ​​в Университете Карнеги-Меллона в 1976 году как 68S и снова представляла собой однопроходный компилятор, основанный на различных упрощениях оригинала и предназначенный для использования на меньших машинах, таких как DEC PDP-11 . Она также использовалась в основном в учебных целях. [32]

Версия для мэйнфреймов IBM не была доступна до 1978 года, когда ее выпустил Кембриджский университет . Она была «почти завершена». Линдси выпустила версию для небольших машин, включая IBM PC, в 1984 году. [32]

Известны три реализации Algol 68 с открытым исходным кодом: [33]

Хронология

ГодСобытиеУчастник
Март 1959 г.Бюллетень ALGOL, выпуск 1 (первый)Питер Наур / ACM
Февраль 1968 г.Опубликован проект отчета (DR) [35]Рабочая группа ИФИП 2.1
Март 1968 г.Заключительный отчет Algol 68 r0 представлен на Мюнхенской встречеРабочая группа ИФИП 2.1
Июнь 1968 г.Встреча в Тиррении, ИталияРабочая группа ИФИП 2.1
август 1968 г.Встреча в Норт-Бервике, ШотландияРабочая группа ИФИП 2.1
Декабрь 1968 г.Заключительный отчет ALGOL 68 r0 представлен на Мюнхенской конференцииРабочая группа ИФИП 2.1
Апрель 1970 г.ALGOL 68-R под GEORGE 3 на ICL 1907FКоролевские сигналы и радары.
Июль 1970 г.ALGOL 68 для системы разделения времени Дартмута [36] [37]Сидни Маршалл
Сентябрь 1973 г.Пересмотренный отчет Algol 68 [38] r1 ОпубликованРабочая группа ИФИП 2.1
1975ALGOL 68C (C) – переносимый компилятор (zcode VM )С. Борн , Эндрю Биррелл и Майкл Гай
Июнь 1975 г.GE Hedrick и Alan Robertson. Oklahoma State ALGOL 68 Subset Compiler. Международная конференция по ALGOL 68 1975 года.
Июнь 1977 г.Конференция Strathclyde ALGOL 68, ШотландияАКМ
Май 1978 г.Предложения по ALGOL H – суперязыку ALGOL 68 [39]AP Black, VJ Rayward-Smith
1984Полный компилятор ALGOL 68S (S) для Sun, SPARC и ПКCH Lindsey и др., Манчестер
Август 1988 г.ALGOL Bulletin Выпуск 52 (последний)Ред. CH Lindsey / ACM
Май 1997 г.Algol68 S (S) опубликован в Интернете [40]Чарльз Х. Линдси
Ноябрь 2001 г.Algol 68 Genie (G) опубликован в Интернете [41] (лицензия с открытым исходным кодом GNU GPL)Марсель ван дер Веер
  • «Краткая история Алгола 68»
  • АЛГОЛ 68 – АЛГОЛ 3-го поколения

Отчеты и члены рабочей группы по алгоритмическому языку АЛГОЛ 68

«Ван Вейнгаарден однажды охарактеризовал четырех авторов, несколько иронично, как: Костер: транспьютер, Пек: синтаксис, Майу: исполнитель, Ван Вейнгаарден: партийный идеолог». – Костер.

Хронология стандартизации

1968: 20 декабря 1968 года «Заключительный отчет» (MR 101) был принят рабочей группой, а затем впоследствии одобрен Генеральной ассамблеей IFIP ЮНЕСКО для публикации. Переводы стандарта были сделаны на русский, немецкий , французский и болгарский языки , а затем на японский и китайский языки . [47] Стандарт также был доступен на языке Брайля .

1984: TC 97 рассматривал ALGOL 68 для стандартизации как «Новый рабочий элемент» TC97/N1642 [2][3]. Западная Германия, Бельгия, Нидерланды, СССР и Чехословакия были готовы участвовать в подготовке стандарта, но СССР и Чехословакия «не были нужными членами нужных комитетов ISO»[4], и стандартизация ISO Algol 68 застопорилась.[5]

1988: Впоследствии АЛГОЛ 68 стал одним из стандартов ГОСТ в России.

  • ГОСТ 27974-88 Язык программирования АЛГОЛ 68 — Язык программирования АЛГОЛ 68 [48]
  • ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный — Язык программирования АЛГОЛ 68 расширенный [49]

Известные элементы языка

Выделенные жирным шрифтом символы и зарезервированные слова

Стандартный язык содержит около шестидесяти зарезервированных слов, которые обычно выделяются жирным шрифтом при печати, а некоторые имеют эквиваленты в виде «кратких символов»:

MODE , OP , PRIO , PROC , FLEX , HEAP , LOC , LONG , REF , SHORT , BITS , BOOL , BYTES , CHAR , COMPL , INT , REAL , SEMA , STRING , VOID , CHANNEL , FILE , FORMAT , STRUCT , UNION , AT "@", ЛИБО r0 , IS ":=:", ISNT  IS NOT r0 ":/=:" ":≠:", OF "→" r0 , TRUE , FALSE , EMPTY , NIL "○", SKIP "~", CO "¢", COMMENT "¢", PR , PRAGMAT , CASE ~ IN ~ OUSE ~ IN ~ OUT ~ ESAC "( ~ | ~ |: ~ | ~ | ~ )", ДЛЯ ~ ОТ ~ ДО ~ ПО ~ ПОКА ~ ДО ~ ОД , ЕСЛИ ~ ТО ~ ELIF ~ ТО ~ ИНАЧЕ ~ ФИ "( ~ | ~ |: ~ | ~ | ~ )", ПАР  НАЧАЛО ~ КОНЕЦ "( ~ )", ПЕРЕЙТИ К , ПЕРЕЙТИ К , ВЫЙТИ "□" r0 .

Единицы: Выражения

Базовая языковая конструкция — это unit . Unit может быть формулой , вложенным предложением , обычным текстом или одной из нескольких технически необходимых конструкций (assignation, jump, skip, nihil). Технический термин вложенное предложение объединяет некоторые из изначально скобочных конструкций, известных как block , do statement , switch в других современных языках. Когда используются ключевые слова, обычно для завершения вложения используется обратная последовательность символов вводного ключевого слова, например ( IF ~ THEN ~ ELSE ~ FI , CASE ~ IN ~ OUT ~ ESAC , FOR ~ WHILE ~ DO ~ OD ). Этот синтаксис защищенных команд был повторно использован Стивеном Борном в общей оболочке Unix Bourne . Выражение также может выдавать множественное значение , которое создается из других значений с помощью сопутствующего предложения . Эта конструкция выглядит просто как пакет параметров вызова процедуры.

режим: Декларации

Базовыми типами данных (называемых modes в жаргоне Algol 68) являются real, int, compl( комплексное число ), bool, char, bitsи bytes. Например:

INT n = 2; CO n фиксировано как константа 2. CO INT m := 3; CO m — это вновь созданная локальная переменная , значение которой изначально установлено равным 3. CO CO Это сокращение от ref  int m = loc  int  := 3; CO REAL авогадро = 6,0221415⏨23; CO Число Авогадро CO long long real long long pi = 3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510; COMPL квадратный корень из минус единицы = 0 ⊥ 1;

Однако это объявление REAL x;— всего лишь синтаксический сахар для . То есть, на самом деле это постоянный идентификатор для ссылки на недавно сгенерированную локальную переменную REAL .REF REAL x = LOC REAL;x

Более того, вместо определения floatи double, или intи longи shortи т. д., ALGOL 68 предоставляет модификаторы , так что в настоящее время общепринятое doubleбудет записано как LONG REAL или LONG LONG REAL вместо этого, например. Константы прелюдии max real и min long intпредоставляются для адаптации программ к различным реализациям.

Все переменные должны быть объявлены, но объявление не обязательно должно предшествовать первому использованию.

примитивный декларатор: INT , REAL , COMPL , COMPLEX G , BOOL , CHAR , STRING , BITS , BYTES , FORMAT , FILE , PIPE G , CHANNEL , SEMA

  • BITS – «упакованный вектор» BOOL .
  • BYTES – «упакованный вектор» CHAR .
  • STRINGгибкий массив CHAR .
  • SEMAфор SEMA , который можно инициализировать с помощью оператора LEVEL .

Сложные типы можно создавать из более простых с помощью различных конструкторов типов:

  • REF mode – ссылка на значение типа mode , аналогично & в C/C++ и REF в Pascal
  • STRUCT – используется для создания структур, таких как STRUCT в C/C++ и RECORD в Pascal.
  • UNION – используется для создания объединений, как в C/C++ и Pascal.
  • PROC – используется для указания процедур, таких как функции в C/C++ и процедуры/функции в Pascal.

Некоторые примеры см. в разделе Сравнение ALGOL 68 и C++ .

Другие символы объявления включают: FLEX , HEAP , LOC , REF , LONG , SHORT , EVENT S.

  • FLEX – объявляет массив гибким, т.е. он может увеличиваться в длине по мере необходимости.
  • HEAP – выделить переменной немного свободного пространства из глобальной кучи.
  • LOC – выделить переменной некоторое свободное пространство локального стека.
  • LONG – объявляет INT , REAL или COMPL имеющими размер LONG er.
  • SHORT – объявляет INT , REAL или COMPL размером SHORT er.

Имя режима (типа) можно объявить с помощью объявления MODE , которое аналогично TYPEDEF в C/C++ и TYPE в Pascal:

 INT max=99; MODE newmode = [0:9][0:max] STRUCT ( LONG  REAL a, b, c, SHORT  INT i, j, k, REF  REAL r );

Это похоже на следующий код на языке C:

 const int max = 99 ; typedef struct { double a , b , c ; short i , j , k ; float * r ; } newmode [ 9 + 1 ][ max + 1 ];                 

Для ALGOL 68 слева от символа равенства появляется только режим-индикация NEWMODE , и, что самое примечательное, конструкция выполняется и может быть прочитана слева направо без учета приоритетов. Кроме того, нижняя граница массивов Algol 68 по умолчанию равна единице, но может быть любым целым числом от - max int до max int .

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

 РЕЖИМ  A = REF  A  РЕЖИМ  A = STRUCT ( A a, B b) РЕЖИМ  A = PROC ( A a) A

пока они действительны:

 РЕЖИМ  A = СТРУКТУРА ( ССЫЛКА  A a, B b) РЕЖИМ  A = ПРОЦЕСС ( ССЫЛКА  A a) ССЫЛКА  A

Принуждения: литье

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

Шесть возможных принуждений называются deproceduring , dereferencing , uniting , widening , rowing и voiding . Каждое принуждение, за исключением uniting , предписывает соответствующий динамический эффект на ассоциированные значения. Следовательно, многие примитивные действия могут быть запрограммированы неявно с помощью принуждений.

Сила контекста – разрешенные принуждения:

  • мягкий – депроцедурирование
  • слабый – разыменование или депроцедурирование, получение имени
  • кроткий – разыменование или депроцедурирование
  • твердый – кроткий, за которым следует объединяющий
  • сильный – твердый, с последующим расширением, тяжестью или опорожнением

Иерархия принуждения с примерами

ALGOL 68 имеет иерархию контекстов, которые определяют вид приведения, доступного в определенной точке программы. Эти контексты:

Контекст
Контекстное местоположениеПринуждения доступныПримеры принуждения в контексте
Мягкий
Слабый
Кроткий
Твердый
Сильный
Сильный
Правая сторона:
  • Декларации идентичности, как "~" в:REAL x = ~
  • Инициализации, как "~" в:REAL x := ~

Также:

  • Фактические параметры вызовов, как "~" в:PROC: sin(~)
  • Заключенные предложения приведения, как «~» в:REAL(~)
  • Единицы рутинных текстов
  • Заявления, дающие VOID
  • Все части (кроме одной) сбалансированного положения
  • Одна сторона тождественного отношения, как «~» в: ~ IS ~
депроцедуринг
Все SOFT , затем слабое разыменование (разыменование или депроцедурирование, возвращающее имя)
Все СЛАБЫЕ затем разыменовывание (разыменование или депроцедурирование)
Все МИК затем объединяются
Все ТВЕРДОЕ затем расширение, гребля или опорожнение

Расширение происходит, если нет потери точности. Например: INT будет приведен к REAL , а REAL будет приведен к LONG REAL . Но не наоборот. Примеры:

  • в LONG INT из INT
  • в РЕАЛЬНЫЙ из INT
  • в COMPL из РЕАЛЬНОГО
  • в [] BOOL из BITS
  • в СТРОКУ из БАЙТОВ

Переменную также можно привести (привести к строке) к массиву длиной 1.

Например:

  • в [1] ИНТ из ИНТ
  • в [1] REAL из REAL и т.д.
Твердый
  • Операнды формул в виде «~» в:~ OP ~
  • Параметры транспутных вызовов
Пример:

UNION(INT,REAL) var := 1

Кроткий
  • Trimscripts (выдает INT )
  • Запросы: например, как «~» в следующем

IF ~ THEN ... FIи FROM ~ BY ~ TO ~ WHILE ~ DO ... OD etc

  • Первичные вызовы (например, sin в sin(x))
Примеры:
  • в BOOL из REF REF BOOL
  • в INT из REF REF REF INT
Слабый
  • Первичные части срезов, как в "~" в:~[1:99]
  • Вторичные элементы выбора, такие как «~» в:value OF ~
Примеры:
  • в REF INT из REF REF INT
  • в REF REAL из REF REF REF REAL
  • в REF STRUCT из REF REF REF REF STRUCT
Мягкий
Левая часть заданий, как «~» в:~ := ...Пример:
  • депроцедура:PROC REAL random: e.g. random

Более подробную информацию о первичных, вторичных, третичных и четвертичных операторах см. в разделе Приоритет операторов.

pr & co: Прагматы и комментарии

Прагматы — это директивы в программе, обычно подсказки для компилятора; в новых языках они называются «прагмами» (без «t»). Например:

PRAGMAT куча=32 PRAGMAT PR куча=32 PR

Комментарии можно вставлять разными способами:

¢ Оригинальный способ добавить свои 2 цента в программу ¢ КОММЕНТАРИЙ "жирный" комментарий КОММЕНТАРИЙ CO Стиль i комментарий CO# Стиль ii комментарий #£ Это комментарий с решеткой для британской клавиатуры £

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

Выражения и составные операторы

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

 REAL половина пи, одно пи; одно пи := 2 * ( половина пи := 2 * arctan(1) )

Это понятие присутствует в C и Perl , среди прочих. Обратите внимание, что как и в более ранних языках, таких как Algol 60 и FORTRAN , в идентификаторах разрешены пробелы, так что half piэто один идентификатор (таким образом избегая подчеркиваний , camel case и всех проблем со строчными буквами ).

В качестве другого примера, чтобы выразить математическую идею суммы от i= 1 f(i)до n, достаточно следующего целочисленного выражения АЛГОЛа 68 :

( INT сумма := 0; ДЛЯ i ДЛЯ n DO сумма +:= f(i) OD ; сумма)

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

Все составные операторы завершаются характерными закрывающимися скобками:

  • Условия выбора ЕСЛИ :
 IF условие THEN операторы [ ELSE операторы ] FI «краткая» форма: ( условие | утверждения | утверждения )
 IF условие1 THEN операторы ELIF условие2 THEN операторы [ ELSE операторы ] FI «краткая» форма: ( условие1 | утверждения |: условие2 | утверждения | утверждения )

Эта схема не только позволяет избежать проблемы висячего else , но и позволяет избежать необходимости использования BEGINand ENDво встроенных последовательностях операторов .

  • Условия выбора CASE :
 Операторы переключения CASE IN , операторы,... [ операторы OUT ] ESAC «краткая» форма: (переключатель | утверждения,утверждения,... | утверждения)
 CASE switch1 IN операторы, операторы,... OUSE switch2 IN операторы, операторы,... [ OUT операторы ] «Краткая» форма ESAC оператора CASE : ( switch1 | операторы, операторы,... |: switch2 | операторы, операторы,... | операторы )

Пример придаточного предложения с краткими символами:

PROC дней в месяце = ( INT год, месяц) INT : (месяц| 31, (год÷×4=0 ∧ год÷×100≠0 ∨ год÷×400=0 | 29 | 28 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

Пример предложения выбора с жирным шрифтом:

PROC дней в месяце = ( INT год, месяц) INT : CASE месяц IN 31, ЕСЛИ год MOD 4 EQ 0 И год MOD 100 NE 0 ИЛИ год MOD 400 EQ 0 ТО 29 ИНАЧЕ 28 FI , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ЕСАК ;

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

PROC дней в месяце = ( INT год, месяц) INT : CASE месяц IN¢Янв¢ 31,¢Фев¢ (год MOD 4 = 0 И год MOD 100 ≠ 0 ИЛИ год MOD 400 = 0 | 29 | 28 ),¢Мар¢ 31, 30, 31, 30, 31, 30, 31, 30, 31 ¢ по дек. ¢ ЕСАК ;

Algol68 допускает использование переключателя типа INT или (уникально) UNION . Последний вариант позволяет применять строгую типизацию к переменным UNION . Например, см. union ниже.

[ FOR index ] [ FROM first ] [ BY increment ] [ TO last ] [ WHILE condition ] Операторы DO OD Минимальная форма «предложения цикла» выглядит следующим образом: операторы DO OD

Это считалось «универсальным» циклом , полный синтаксис которого следующий:

ДЛЯ i ОТ 1 НА -22 ДО -333 ПОКА i×i≠4444 ДЕЛАТЬ ~ OD

Конструкция имеет несколько необычных аспектов:

  • Только часть DO ~ OD была обязательной, в этом случае цикл будет повторяться бесконечно.
  • Таким образом, предложение TO 100 DO ~ OD будет повторяться только 100 раз.
  • «Синтаксический элемент» WHILE позволял программисту преждевременно выйти из цикла FOR . Например :
INT сумма sq:=0; ДЛЯ i ПОКА print(("Пока что:",i,newline)); сумма кв≠70↑2ДЕЛАТЬ сумма кв+:=i↑2ОД

Последующие "расширения" стандартного Algol68 позволили заменить синтаксический элемент TO на UPTO и DOWNTO для достижения небольшой оптимизации. Те же компиляторы также включили:

  • UNTIL (C) – для позднего завершения цикла.
  • FOREACH (S) – для параллельной работы с массивами .

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

struct, union & [:]: Структуры, объединения и массивы

ALGOL 68 поддерживает массивы с любым количеством измерений и позволяет разбивать на части целые или частичные строки и столбцы.

 MODE  VECTOR = [1:3] REAL ; # объявление MODE вектора (typedef) #  MODE  MATRIX = [1:3,1:3] REAL ; # объявление MODE матрицы (typedef) #  VECTOR v1 := (1,2,3); # переменная массива изначально (1,2,3) # [] REAL v2 = (4,5,6); # массив констант, тип эквивалентен VECTOR , границы подразумеваются #  OP + = ( VECTOR a,b) VECTOR : # определение бинарного оператора # ( VECTOR out; FOR i FROM ⌊a TO ⌈a DO out[i] := a[i]+b[i] OD ; out); MATRIX m := (v1, v2, v1+v2); print ((m[,2:])); # срез 2-го и 3-го столбцов #

Матрицы можно разрезать любым способом, например:

 REF  VECTOR row = m[2,]; # определить REF (указатель) на 2-ю строку #  REF  VECTOR col = m[,2]; # определить REF (указатель) на 2-й столбец #

ALGOL 68 поддерживает множественные структуры полей ( STRUCT ) и объединенные режимы . Ссылочные переменные могут указывать на любой MODE , включая срезы массива и поля структуры.

В качестве примера приведем традиционное объявление связанного списка:

 MODE  NODE = UNION ( VOID , REAL , INT , COMPL , STRING ), LIST = STRUCT ( NODE val, REF  LIST next);

Пример использования UNION CASE для NODE :

Algol68 r0 как в Заключительном отчете 1968 годаAlgol68 r1 как в пересмотренном отчете 1973 г.
 УЗЕЛ n := "1234"; REAL r; INT i; COMPL c; СТРОКА s КЕЙС r,i,c,s::=n IN print(("действительный:", r)), print(("int:", i)), print(("compl:", c)), print(("строка:", s)) OUT print(("?:", n)) ESAC
 УЗЕЛ n := "1234"; # или n := ПУСТО; # CASE n IN ( VOID ): print(("void:", "EMPTY")), ( REAL r): print(("real:", r)), ( INT i): печать(("int:", i)), ( КОМПЛ c): print(("компл:", c)), ( СТРОКА s): печать(("строка:", s)) ВЫХОД печать(("?:", n)) ESAC

proc: Процедуры

Для объявлений процедур ( PROC ) требуются спецификации типов как для параметров, так и для результата ( VOID , если нет):

 PROC max of real = ( REAL a, b) REAL : IF a > b THEN a ELSE b FI ;

или, используя «краткую» форму условного предложения:

 PROC max of real = ( REAL a, b) REAL : (a>b | a | b);

Возвращаемое значение a proc— это значение последнего выражения, вычисленного в процедуре. Ссылки на процедуры ( ref proc ) также разрешены. Параметры вызова по ссылке предоставляются путем указания ссылок (например, ref real) в списке формальных аргументов. В следующем примере определяется процедура, которая применяет функцию (указанную как параметр) к каждому элементу массива:

 PROC применить = ( REF [] REAL a, PROC ( REAL ) REAL f):   ДЛЯ i ОТ  LWB a ДО  UPB a ДО a[i] := f(a[i]) OD

Такая простота кода была недостижима в предшественнике ALGOL 68 — ALGOL 60 .

op: Операторы

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

 ПРИО  МАКС = 9;   OP  MAX = ( INT a,b) INT : ( a>b | a | b ); OP  MAX = ( REAL a,b) REAL : ( a>b | a | b ); OP  MAX = ( COMPL a,b) COMPL : ( ABS a > ABS b | a | b );   OP  MAX = ([] РЕАЛЬНЫЙ а) РЕАЛЬНЫЙ : ( REAL out := a[ LWB a]; ДЛЯ i ОТ  LWB a + 1 ДО  UPB a ДО ( a[i]>out | out:=a[i] ) OD ; вне)

Массив, процедура, разыменование и операции приведения

ПРИОРИТЕТОперация r0&r1+Алгол68 р0+Алгол68 Г
Эффективно 12
(начальная школа)
разыменование, депроцедурирование(~,~), индексация[~], выравнивание[~,], нарезка[~:~], обозначения размера LONG и SHORTпроцедуракаррирование(~,,,), DIAG , TRNSP , ROW , COL
Эффективно 11
(среднее)
OF (выбор), LOC и HEAP (генераторы)→ (выбор)НОВЫЕ (генераторы)

Технически они не являются операторами, а скорее считаются «единицами, связанными с именами».

Монадические операторы

ПРИОРИТЕТ
(Третичный )
Algol68 "Достойные персонажи [6] " r0&r1+Алгол68 r0&r1+Алгол68 C,G+Алгол68 р0
10НЕ ~, ВВЕРХ , ВНИЗ , ЛБП , ВВЕРХБП ,

-, ABS , ARG , BIN , ENTIER , LENG , LEVEL , ODD , REPR , ROUND , SHORTEN

¬, ↑, ↓, ⌊, ⌈НОРМА , СЛЕД , Т , ДЕТ , ИНВLWS , UPS , ⎩, ⎧, BTB , CTB

Двойные операторы с соответствующими приоритетами

ПРИОРИТЕТ
(Третичный )
Algol68 "Достойные персонажи" r0&r1+Алгол68 r0&r1+Алгол68 C,G+Алгол68 р0
9+*, я+×, ⊥!
8SHL , SHR , **, ВВЕРХ , ВНИЗ , LWB , UPB↑, ↓, ⌊, ⌈××, ^, LWS , UPS , ⎩, ⎧
7*, /, %, OVER , %*, MOD , ЭЛЕМ×, ÷, ÷×, ÷*, %×, □÷:
6-, +
5<, LT , <=, LE , >=, GE , >, GT≤, ≥
4ЭКВ =, СВ ~= /=≠, ¬=
3&, И/\
2ИЛИ\/
1МИНУСАБ , ПЛЮСАБ , TIMESAB , ДИВАБ , ОВЕРАБ , МОДАБ , ПЛЮСТО ,

-:=, +:=, *:=, /:=, %:=, %*:=, +=:

×:=, ÷:=, ÷×:=, ÷*:=, %×:=МИНУС , ПЛЮС , ДЕЛ , ПЕРЕБЕР , MODB , ÷::=, ПРУС

Конкретные детали:

  • К третичным относятся имена NIL и ○.
  • LWS : В Algol68 r0 операторы LWS и ⎩ ... оба возвращают значение ИСТИНА , если нижнее состояние размерности массива фиксировано.
  • Операторы UPS и ⎧ на верхнем уровне аналогичны .
  • Операторы LWB и UPB автоматически доступны для UNION различных порядков (и MODE ) массивов. Например , UPBunion([]int, [,]real, flex[,,,]char)

Отношения присвоения и тождественности и т.д.

Технически они не являются операторами, а скорее считаются «единицами, связанными с именами».

ПРИОРИТЕТ
(четвертичные периоды )
Algol68 "Достойные персонажи" r0&r1+Алгол68 r0&r1+Алгол68 C,G,R+Алгол68 р0
Эффективно 0:=, ЕСТЬ  :=:, НЕТ  :/=: :~=:, AT @, ":", ";":≠: :¬=::=:= С , =:= Р..=, .=, CT , ::, CTAB , ::=, .., не является , "..", ".,"

Примечание: четвертичные периоды включают названия SKIP и ~.

:=:(альтернативно IS ) проверяет, равны ли два указателя; (альтернативно ISNT ) проверяет, не равны ли они.:/=:

Зачем :=:и :/=:нужны

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

REF INT ip, jp

Теперь рассмотрим, как решить, указывают ли эти два на одно и то же место или один из них указывает на NIL . Следующее выражение

ip = jp

разыменует оба указателя вниз на значения типа INT и сравнит их, поскольку оператор = определен для INT , но не REF INT . Недопустимо определять = для операндов типа REF INT и INT одновременно, поскольку тогда вызовы становятся неоднозначными из-за неявных приведения, которые могут быть применены: следует ли оставить операнды как REF INT и вызвать эту версию оператора? Или их следует разыменовать далее на INT и вместо этого использовать эту версию? Поэтому следующее выражение никогда не может быть сделано допустимым:

ip = NIL

Отсюда необходимость в отдельных конструкциях, не подчиняющихся обычным правилам приведения операндов к операторам. Но есть подвох. Следующие выражения:

ip :=: jp
ip :=: NIL

хотя это и допустимо, вероятно, не будет делать то, что можно было бы ожидать. Они всегда будут возвращать FALSE , потому что они сравнивают фактические адреса переменных и , а не то, на что они указывают . Чтобы добиться правильного эффекта, нужно было бы написатьipjp

ip :=: REF INT(jp)
ip :=: REF INT(NIL)

Специальные символы

Клавиатура IBM 2741 с символами APL

Большинство «специальных» символов Algol (⊂, ≡, ␣, ×, ÷, ≤, ≥, ≠, ¬, ⊃, ≡, ∨, ∧, →, ↓, ↑, ⌊, ⌈, ⎩, ⎧, ⊥, ⏨, ¢, ○ и □) можно найти на клавиатуре IBM 2741 со вставленной печатающей головкой APL «гольф-мяч»; они стали доступны в середине 1960-х годов, когда разрабатывался ALGOL 68. Эти символы также являются частью стандарта Unicode , и большинство из них доступны в нескольких популярных шрифтах .

transput: Вход и выход

Transput — это термин, используемый для обозначения входных и выходных возможностей ALGOL 68. Он включает предопределенные процедуры для неформатированного, форматированного и двоичного transput. Файлы и другие устройства transput обрабатываются согласованным и машинно-независимым образом. Следующий пример выводит некоторый неформатированный вывод на стандартное выходное устройство:

 print ((newpage, "Заголовок", newline, "Значение i равно ", i, "и x[i] есть ", x[i], новая строка))

Обратите внимание на предопределенные процедуры newpageи newlineпереданные в качестве аргументов.

Книги, каналы и файлы

ПЕРЕДАЧЕЙ считаются КНИГИ , КАНАЛЫ и ФАЙЛЫ :

  • Книги состоят из страниц, строк и символов и могут иметь резервные копии в файлах.
    • Конкретную книгу можно найти по названию, вызвав match.
  • КАНАЛЫ соответствуют физическим устройствам, например, перфокартам и принтерам.
    • Различают три стандартных канала: канал stand in , канал stand out , канал stand back .
  • ФАЙЛ это средство связи между программой и книгой, открытой по некоторому каналу.
    • MOOD файла может быть прочитан, записан, преобразован в символ, преобразован в двоичный код и открыт .
    • Процедуры транспортировки включают в себя: establish, create, open, associate, lock, close, scratch.
    • Запросы на должность: char number, line number, page number.
    • Процедуры макетирования включают в себя:
      • space, backspace, newline, newpage.
      • get good line, get good page, get good book, иPROC set=(REF FILE f, INT page,line,char)VOID:
    • Файл имеет процедуры обработки событий , например on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error:

форматированный перенос

«Форматированный перенос» в переносе ALGOL 68 имеет свой собственный синтаксис и шаблоны (функции), с FORMAT , встроенным между двумя символами $. [50]

Примеры:

printf (($2l"Сумма равна:"x, g(0)$, m + n)); ¢ печатает то же самое, что и: ¢ print ((новая строка, новая строка, "Сумма равна:", пробел, целое (m + n, 0))

par: Параллельная обработка

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

PROC eat = VOID : ( muffins-:=1; print(("Вкусно!",новая строка))), speak = VOID : ( words-:=1; print(("Як...",новая строка))); INT маффины := 4, слова := 8; SEMA рот = УРОВЕНЬ 1; ПАР  НАЧАТЬ  ПОКА кексы > 0 ДЕЛАТЬ  ВНИЗ рот; есть; ВВЕРХ рот OD , ПОКА слова > 0 ДЕЛАТЬ  ВНИЗ рот; говорить; ВЕРХНИЙ РОТ OD КОНЕЦ

Разнообразный

Из-за своей технической сложности АЛГОЛ 68 нуждается в изобилии методов, чтобы отрицать существование чего-либо:

SKIP , "~" или "?" C – неопределенное значение, всегда синтаксически допустимое, EMPTY – единственное допустимое для VOID значение , необходимое для выбора VOID в UNION , VOID – синтаксически похоже на MODE , но не является им, NIL или "○" – имя, ничего не обозначающее, неопределенного режима ссылки,() или конкретно [1:0] INTвакуум – это пустой массив (в данном случае конкретно MODE [] INT ). undefined – процедура отчетов о стандартах, вызывающая исключение в системе выполнения.ℵ – Используется в отчете о стандартах для подавления интроспекции определенных типов. Например, SEMA

Термин NIL IS var всегда оценивается как TRUE для любой переменной (но см. выше правильное использование IS  :/=:), тогда как неизвестно, какое значение оценивает сравнение x < SKIP для любого целого числа x .

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

Оба официальных отчета включали некоторые расширенные функции, которые не были частью стандартного языка. Они были обозначены ℵ и считались фактически частными. Примерами являются "≮" и "≯" для шаблонов, OUTTYPE / INTYPE для грубой утиной типизации и операторы STRAIGHTOUT и STRAIGHTIN для "выпрямления" вложенных массивов и структур.

Примеры использования

Пример кода

Этот пример программы реализует решето Эратосфена для поиска всех простых чисел , меньших 100. NIL — это аналог нулевого указателя в ALGOL 68 в других языках. Обозначение x OF y обращается к члену x структуры STRUCT y .

НАЧАЛО # Решето простых чисел Алгола-68, функциональный стиль #   Ошибка PROC = ( STRING s) VOID : (print(( newline, " error: ", s, newline)); GOTO stop); PROC one to = ( INT n) LIST : ( PROC f = ( INT m,n) LIST : (m>n | NIL | cons(m, f(m+1,n))); f(1,n));   MODE  LIST = REF  NODE ; MODE  NODE = STRUCT ( INT h, LIST t); PROC cons = ( INT n, LIST l) LIST : HEAP  NODE  := (n,l); PROC hd = ( LIST l) INT : ( l IS  NIL | error("hd NIL "); SKIP | h OF l ); PROC tl = ( LIST l) LIST : ( l IS  NIL | error("tl NIL "); SKIP | t OF l ); PROC show = ( LIST l) VOID : ( l ISNT  NIL | print((" ",whole(hd(l),0))); show(tl(l)));   PROC фильтр = ( PROC ( INT ) BOOL p, СПИСОК l) СПИСОК : ЕСЛИ l ЕСТЬ  NIL  ТО  NIL  ELIF p(hd(l)) ТО cons(hd(l), фильтр(p,tl(l))) ИНАЧЕ фильтр(p, tl(l)) FI ;   PROC sieve = ( LIST l) LIST : IF l IS  NIL  THEN  NIL  ELSE  PROC не кратно = ( INT n) BOOL : n MOD hd(l) ~= 0; cons(hd(l), sieve( filter( not multiple, tl(l) ))) ФИ ;   PROC primes = ( INT n) LIST : sieve( tl( one to(n) ));   показать( простые числа(100) )КОНЕЦ

Операционные системы, написанные на ALGOL 68

  • Компьютер Cambridge CAP – Все процедуры, составляющие операционную систему, были написаны на языке ALGOL 68C , хотя несколько других тесно связанных защищенных процедур, таких как пагинатор, написаны на языке BCPL . [51]
  • Eldon 3 – Разработан в Университете Лидса для ICL 1900 и написан на ALGOL 68-R . [52]
  • Flex machine – Аппаратное обеспечение было индивидуальным и микропрограммируемым, с операционной системой, (модульным) компилятором, редактором, сборщиком мусора и системой хранения файлов, все написанное на ALGOL 68RS . Командная оболочка Curt [53] была разработана для доступа к типизированным данным, аналогичным режимам Algol-68.
  • VMES3 был языком реализации операционной системы VME. S3 был основан на ALGOL 68, но с типами данных и операторами, соответствующими тем, которые предлагались в серии ICL 2900 .

Примечание: советские компьютеры Эльбрус-1 (Эльбрус-1) и Эльбрус-2 были созданы с использованием языка высокого уровня Эль-76 (АЛ-76), а не традиционного ассемблера. Эль-76 напоминает Алгол-68, главное отличие — динамические типы связывания в Эль-76, поддерживаемые на аппаратном уровне. Эль-76 используется для приложений, управления заданиями, системного программирования. [54]

Приложения

Оба языка ALGOL 68C и ALGOL 68-R написаны на ALGOL 68, что фактически делает ALGOL 68 приложением самого себя. Другие приложения включают:

Библиотеки и API

  • NAG Numerical Librariesпрограммная библиотека подпрограмм численного анализа . Поставлялась на ALGOL 68 в 1980-х годах.
  • TORRIX – система программирования для операций с векторами и матрицами над произвольными полями и переменного размера, разработанная С. Г. ван дер Мейленом и М. Вельдхорстом. [56]

Программа представления

Особенностью ALGOL 68, унаследованной от традиции ALGOL , являются его различные представления. Существует язык представления, используемый для описания алгоритмов в печатных работах, строгий язык (строго определенный в Отчете) и официальный справочный язык, предназначенный для использования во входных данных компилятора. Примеры содержат слова, выделенные ЖИРНЫМ шрифтом, это СТРОГИЙ язык. Зарезервированные слова ALGOL 68 фактически находятся в другом пространстве имен, нежели идентификаторы, и в идентификаторах разрешены пробелы, поэтому следующий фрагмент является допустимым:

 INT действительное целое = 3 ;

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

 INT a real int = 3; # СТРОГИЙ язык #'INT'A REAL INT = 3; # QUOTE стиль правки #.INT A REAL INT = 3; # POINT стиль правки # INT a real int = 3; # ВЕРХНИЙ стиль правки # int a_real_int = 3; # Стиль правки RES, есть 61 зарезервированное слово #

Все реализации должны распознавать как минимум POINT, UPPER и RES внутри разделов PRAGMAT. Из них POINT и UPPER стропы встречаются довольно часто, в то время как RES стропы противоречат спецификации (поскольку нет зарезервированных слов). QUOTE (одинарное апострофное кавычивание) было первоначальной рекомендацией, в то время как парное апострофное кавычивание, распространенное в ALGOL 60, нечасто используется в ALGOL 68. [57]

Следующие символы были рекомендованы для переносимости и названы «достойными символами» в Отчете о стандартном аппаратном представлении Алгола 68, архивированном 2 января 2014 г. на Wayback Machine :

  • ^ Достойные символы: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "#$%'()*+,-./:;<=>@[ ]_|

Это отражало проблему 1960-х годов, когда некоторое оборудование не поддерживало строчные буквы и некоторые другие символы, не входящие в ASCII . В отчете 1973 года было написано: «Четыре достойных символа — «|», «_», «[» и «]» — часто кодируются по-разному, даже в установках, которые номинально используют один и тот же набор символов».

  • Базовые персонажи: «Достойные персонажи» являются подмножеством «базовых персонажей».

Пример различных представлений программы

ПредставлениеКод
Algol68 "строгий",
как обычно публикуется
¢ подчеркивание или  жирный шрифт ¢  MODE  XINT = INT ; XINT сумма sq:=0; FOR i WHILE сумма кв≠70×70 ДЕЛАТЬ сумма кв+:=i↑2 ОД
Удаление цитат
(например, викитекст )
'пр' цитата 'пр''режим' 'xint' = 'int';'xint' сумма sq:=0;«для» я «в то время как» сумма кв≠70×70'делать' сумма кв+:=i↑2'од'
Для компилятора 7-битного символьного кода
. PR  ВЕРХНИЙ  .PRРЕЖИМ XINT = INT;XINT сумма sq:=0;НА ВРЕМЯ I сумма кв/=70*70ДЕЛАТЬ сумма кв+:=i**2ОД
Для компилятора 6-битного символьного кода
. PR-  ПОЧКА  .PR
. РЕЖИМ  .XINT  =  .INT;
. XINT  SUM  SQ:=0;
. ДЛЯ  Я  .ПОКА СУММА КВ. ПЛОЩАДЬ 70*70. ДЕЛАТЬ СУММА SQ .PLUSAB I .UP 2. ОД
Algol68 с использованием RES- правки
(зарезервированное слово)
. PR  РЕЗ  .PRрежим .xint = int;. xint  сумма  sq:=0;для меня пока сумма кв≠70×70делать сумма кв+:=i↑2од

ALGOL 68 позволяет каждому естественному языку определять свой собственный набор ключевых слов Algol-68. В результате программисты могут писать программы, используя ключевые слова из своего родного языка. Ниже приведен пример простой процедуры, которая вычисляет "следующий день", код на двух языках: английском и немецком. [ необходима цитата ]

# Дата следующего дня - английский вариант # MODE  DATE = STRUCT ( INT день, STRING месяц, INT год); PROC следующий день = ( DATE x) ДАТА : IF день x < длина месяца (месяц x , год x ) THEN (день x + 1, месяц x , год x ) ELIF месяц x = "Декабрь" THEN (1, "Январь", год x + 1) ELSE (1, следующий за месяцем (месяц x ), год x ) FI ;
# Nachfolgetag - Deutsche Variante # MENGE  DATUM = TUPEL ( тег GANZ , WORT monat, GANZ jahr); FUNKTION naechster tag nach = ( DATUM x) DATUM : WENN tag VON x < monatslaenge(monat VON x, jahr VON x) DANN (tag VON x + 1, monat VON x, jahr VON x) WENNABER monat VON x = "Декабрь" ДАНН (1, "Январь", яр VON x + 1) ANSONSTEN (1, nachfolgemonat(monat VON x), jahr VON x) ENDEWENN ;

Русский/советский пример: в английском языке оператор case в Algol68 выглядит так: CASE ~ IN ~ OUT ~ ESAC , в кириллице это выглядит так: выб ~ в ~ либо ~ быв .

Пересмотры

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

Язык непересмотренного отчета

Исходный язык (согласно "Final Report" r0 ) отличается синтаксисом режима cast , и он имел функцию proceduring , т.е. приведение значения терма к процедуре, которая оценивает терм. Proceduring был предназначен для того, чтобы сделать оценки ленивыми . Наиболее полезным применением могла бы быть сокращенная оценка булевых операторов. В:

OP  ANDF = ( BOOL a, PROC  BOOL b) BOOL :(a | b | ЛОЖЬ ); OP  ORF = ( BOOL a, PROC  BOOL b) BOOL :(a | ИСТИНА | b);

b оценивается только в том случае, если a истинно.

Как определено в ALGOL 68, это не работало так, как ожидалось, например, в коде:

ЕСЛИ  ЛОЖЬ  И F  CO proc bool: CO ( print ("Не следует выполнять"); ИСТИНА ) ТОГДА ...

Вопреки наивным ожиданиям программистов, печать будет выполнена, поскольку это только значение разработанного вложенного предложения после ANDF , которое было обработано. Текстовая вставка закомментированного PROC BOOL : заставляет это работать.

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

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

Например, в:

PROC тест = ( REAL a; REAL b) :......тест (x ПЛЮС 1, x);

Первый аргумент для проверки гарантированно будет оценен раньше второго, но в обычном порядке:

PROC тест = ( REAL a, b) :......тест (x ПЛЮС 1, x);

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

Предложения по расширению от IFIP WG 2.1

После пересмотра отчета были предложены некоторые дополнения к формулировкам для расширения сферы применения:

  • частичная параметризация ( карринг ): создание функций (с меньшим количеством параметров) путем указания некоторых, но не всех параметров для вызова, например, логарифм функции двух параметров, основания и аргумента, может быть специализирован до натурального, двоичного или десятичного логарифма, [58]
  • расширение модуля : для поддержки внешней связи были предложены два механизма: модули определения снизу вверх , более мощная версия средств из ALGOL 68-R и дыры сверху вниз , аналогичные предложениям ENVIRONи USINGиз ALGOL 68C [59]
  • параметры режима : для реализации ограниченного параметрического полиморфизма (большинство операций над структурами данных, такими как списки, деревья или другие контейнеры данных, могут быть указаны без изменения полезной нагрузки). [60]

До сих пор в Algol 68 Genie реализована лишь частичная параметризация.

Спецификация и сроки реализации True ALGOL 68s

ИмяГодЦельСостояниеОписаниеЦелевой ЦПЛицензированиеЯзык реализации
Обобщенный АЛГОЛ1962Научный НЛДАЛГОЛ для обобщенных грамматик
АЛГОЛ Y Y1966Проект предложенияМеждународныйПервая версия Алгола 68СпецификацияАКМ
АЛГОЛ 68 ДР1968Проект предложенияМеждународныйПроект отчета IFIP WG 2.1Спецификация – мартАКМ
АЛГОЛ 68 р01968СтандартМеждународныйЗаключительный отчет рабочей группы IFIP WG 2.1Спецификация – августАКМ
АЛГОЛ 68-Р Р1970Военный ВеликобританияМКЛ 1900АЛГОЛ 60
ЭПОС АЛГОЛ Э1971Научный
АЛГОЛ 68RS RS1972Военный ВеликобританияПортативная система компиляцииICL 2900/Серия 39, Multics, VMS и генератор C (1993)Авторские права короныАЛГОЛ 68RS
Алгол 68 с областями1972Экспериментальное и другое ВеликобританияДобавление областей к Алголу 68
Мини АЛГОЛ 681973Исследовать НЛД"Интерпретатор простых программ на языке Algol 68" Архивировано 18 июля 2011 г. на Wayback MachineПортативный переводчикМатематический центрАЛГОЛ 60
ОРЕГАНО1973Исследовать НАС«Важность моделей внедрения».Калифорнийский университет в Лос-Анджелесе
АЛГОЛ 68С С1975Научный ВеликобританияКембридж Алгол 68ICL , IBM 360, PDP 10 и Unix, Telefunken , Tesla и Z80 (1980) [61]КембриджАЛГОЛ 68С
ALGOL 68 Пересмотренный отчет r11975СтандартМеждународныйПересмотренный отчет рабочей группы IFIP WG 2.1СпецификацияАКМ
Алгол H H1975Экспериментальное и другое ВеликобританияПредлагаемые расширения системы мод Алгола 68СпецификацияАЛГОЛ В
Одра Алгол 681976практическое использование Советский Союз / Польша Одра 1204/ILсоветскийАЛГОЛ 60
Оклахома АЛГОЛ 681976инструкция по программированию СШАРеализация в Университете штата Оклахома [62]IBM 1130 и System/370 /158НеизвестныйANSI Фортран 66 .
Берлин АЛГОЛ 681977Исследовать ДЕ«Берлинская реализация ALGOL 68» и [63]Абстрактная машина ALGOL 68 – машинно-независимый компиляторТехнический университет БерлинаКДЛ 2
ФЛАКК Ф1977Многоцелевой МОЖЕТПересмотренный отчет о полной реализации с функциями отладкиСистема/370аренда, Chion CorporationАссемблер
АЛГОЛ 68-РТ РТ1979Научный ВеликобританияПараллельный АЛГОЛ 68-Р
RS Алгол rs1979Научный Великобритания
АЛГОЛ 68+1980Научный НЛДПредложенный суперязык АЛГОЛ 68 [64]
М-220 АЛГОЛ 68 Советский СоюзМ-220советскийЭПСИЛОН
Ленинград АЛГОЛ 68 Л1980Телекоммуникации Советский СоюзПолный язык + модулиIBM, DEC, CAMCOH, PS 1001 и ПКсоветский
Интерактивный АЛГОЛ 68 I1983 ВеликобританияИнкрементная компиляцияПКНекоммерческое условно-бесплатное программное обеспечение
АЛГОЛ 68С С1985НаучныйМеждународныйВерсия ALGOL 68 для SunSun-3 , Sun SPARC (под SunOS 4.1 и Solaris 2), Atari ST (под GEMDOS ), Acorn Archimedes (под RISC OS ), VAX-11 под Ultrix-32
Algol68toC [65] (ctrans)1985Электроника Великобританияctrans от ELLA ALGOL 68RSПортативный генератор С Программное обеспечение с открытым исходным кодом 1995АЛГОЛ 68RS
МК2 Интерактивный АЛГОЛ 681992 ВеликобританияИнкрементная компиляцияПКНекоммерческое условно-бесплатное программное обеспечение [66]
Алгол 68 Джинн G2001Полный язык НЛДВключает стандартное положение о залогеПортативный переводчикGNU GPLС
Algol 68 Genie версии 2.0.02010Полный язык НЛДПортативный интерпретатор; дополнительная компиляция выбранных модулейGNU GPLС

Язык S3 , который использовался для написания операционной системы ICL VME и многих других системных программ на компьютерах серии ICL 2900, был прямым производным от Algol 68. Однако в нем отсутствовали многие из наиболее сложных функций, а базовые режимы были заменены набором типов данных, которые напрямую соответствовали архитектуре оборудования серии 2900.

Расширения, специфичные для реализации

ALGOL 68R от RRE был первой реализацией подмножества ALGOL 68, работающей на ICL 1900. Основываясь на исходном языке, основными ограничениями подмножества были определение перед использованием и отсутствие параллельной обработки. Этот компилятор был популярен в университетах Великобритании в 1970-х годах, где многие студенты компьютерных наук изучали ALGOL 68 как свой первый язык программирования; компилятор был известен хорошими сообщениями об ошибках.

ALGOL 68RS (RS) от RSRE был переносимой системой компилятора, написанной на ALGOL 68RS (на основе ALGOL 68R) и реализованной на различных системах, включая ICL 2900 / Series 39 , Multics и DEC VAX/VMS . Язык был основан на Revised Report, но с похожими ограничениями подмножества, как у ALGOL 68R. Этот компилятор сохранился в виде компилятора Algol68-to-C.

В ALGOL 68S (S) из Университета Карнеги-Меллона мощность параллельной обработки была улучшена путем добавления ортогонального расширения eventing . Любое объявление переменной, содержащее ключевое слово EVENT, делало назначения этой переменной доступными для параллельной оценки, т.е. правая часть была преобразована в процедуру, которая была перемещена на один из процессоров многопроцессорной системы C.mmp . Доступ к таким переменным задерживался после завершения назначения.

Cambridge ALGOL 68C (C) был переносимым компилятором, который реализовал подмножество ALGOL 68, ограничив определения операторов и исключив сборку мусора, гибкие строки и форматированный перенос.

Algol 68 Genie (G) М. ван дер Вира — это реализация ALGOL 68 для современных компьютеров и операционных систем.

«Несмотря на благие намерения, программист может нарушить переносимость, непреднамеренно применив локальное расширение. Чтобы защититься от этого, каждая реализация должна предоставлять параметр прагмата PORTCHECK. Пока этот параметр действует, компилятор выводит сообщение для каждой конструкции, которую он распознает как нарушающую некоторое ограничение переносимости». [67]

Кавычки

  • ... Схема композиции типов, принятая в C, во многом обязана Algol 68, хотя, возможно, она не появилась в форме, которую одобрили бы приверженцы Algol. Центральным понятием, которое я позаимствовал из Algol, была структура типов, основанная на атомарных типах (включая структуры), составленных в массивы, указатели (ссылки) и функции (процедуры). Концепция объединений и приведений Algol 68 также оказала влияние, которое проявилось позже. Деннис Ритчи , апрель 1993 г. [2]
  • ... C не происходит от Algol 68, это правда, но влияние было, во многом настолько тонкое, что его трудно обнаружить, даже когда я усиленно думаю. В частности, тип union (позднее дополнение к C) обязан A68, не какими-то деталями, а идеей наличия такого типа вообще. Если говорить более глубоко, то структура типа в целом и даже, каким-то странным образом, синтаксис объявления (часть конструктора типа) были вдохновлены A68. И да, конечно, "long". Деннис Ритчи , 18 июня 1988 г. [4]
  • «Поздравляю, ваш Мастер сделал это» – Никлаус Вирт [68]
  • Чем больше я это вижу, тем несчастнее становлюсь – Э. В. Дейкстра, 1968 [69]
  • [...] было сказано, что популярность A68 была обратно пропорциональна [...] расстоянию от АмстердамаГвидо ван Россум [70]
  • [...] Лучшее, что мы могли сделать, это послать с ним отчет меньшинства, в котором излагается наше обоснованное мнение о том, что «... как инструмент для надежного создания сложных программ язык оказался неудачным». [...]К. А. Хоар в своей лекции на вручении премии Тьюринга в октябре 1980 г. [71]
  • «[...] Более чем когда-либо от адекватного инструмента программирования будет требоваться, чтобы он структурно помогал программисту в самых сложных аспектах его работы, а именно в надежном создании сложных программ. В этом отношении мы не видим, как язык, предлагаемый здесь, является значительным шагом вперед: напротив, мы считаем, что его неявный взгляд на задачу программиста во многом такой же, как, скажем, десять лет назад. Это заставляет нас сделать вывод, что, рассматриваемый как инструмент программирования, язык должен считаться устаревшим. [...]» Отчет меньшинства Рабочей группы 1968 года от 23 декабря 1968 года. [72]

Смотрите также

Ссылки

Цитаты

  1. ^ ван Вейнгаарден, Адриан ; Майу, Барри Джеймс ; Пек, Джон Эдвард Ланселот ; Костер, Корнелис Герман Антоний ; Синцов, Мишель [на французском языке] ; Линдси, Чарльз Ходжсон ; Меертенс, Ламбер Гийом Луи Теодор ; Фискер, Ричард Г., ред. (1976). Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68 (PDF) . Спрингер-Верлаг . ISBN 978-0-387-07592-1. OCLC  1991170. Архивировано (PDF) из оригинала 2019-04-19 . Получено 2019-05-11 .
  2. ^ ab Dennis Ritchie (апрель 1993 г.). "Развитие языка C" (PDF) . Архивировано из оригинала (PDF) 2005-11-06 . Получено 2007-04-26 .
  3. ^ Влияние на C: типы, структуры, массивы, указатели и процедуры – Деннис Ритчи [2]
  4. ^ ab Деннис Ритчи (июнь 1988). "C и Algol 68" . Получено 2006-09-15 .
  5. ^ Влияние на C: объединение, структура, синтаксис и большая точность – Деннис Ритчи [4]
  6. ^ "История C++: 1979−1991" (PDF) . Март 1993. Страница 12, 2-й абзац: Algol68 [дал] перегрузку операторов (§3.3.3), ссылки (§3.3.4) и возможность объявлять переменные в любом месте блока (§3.3.1) . Получено 2008-05-06 .
  7. ^ "Интервью с Гвидо ван Россумом". Июль 1998. Архивировано из оригинала 2007-05-01 . Получено 2007-04-29 .
  8. ^ "Краткая история АЛГОЛА 68". Архивировано из оригинала 2006-08-10 . Получено 2006-09-15 .
  9. ^ Вир, Марсель ван дер (2023-04-05). "Пересмотренный отчет об алгоритмическом языке Алгол 68". jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 2013-03-17.
  10. ^ Вир, Марсель ван дер (2023-04-05). "Пересмотренный отчет об алгоритмическом языке Алгол 68". jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 2013-03-17.
  11. ^ Вир, Марсель ван дер (2023-04-05). "Пересмотренный отчет об алгоритмическом языке Алгол 68". jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 2013-03-17.
  12. ^ Вир, Марсель ван дер (2023-04-05). "Пересмотренный отчет об алгоритмическом языке Алгол 68". jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 2013-03-17.
  13. ^ "Гоммас?".
  14. Пересмотренный отчет об алгоритмическом языке Algol 68. Архивировано 17 марта 2013 г. на Wayback Machine . jmvdveer.home.xs4all.nl (20 декабря 1968 г.). Получено 21 июля 2013 г.
  15. ^ Терехов, Андрей (2014). «АЛГОЛ 68 и его влияние на программирование в СССР и России». Третья международная конференция по вычислительной технике в России и бывшем Советском Союзе 2014 г. С. 97–106. doi :10.1109/SoRuCom.2014.29. ISBN 978-1-4799-1799-0. S2CID  16097093.
  16. ^ http://toc.proceedings.com/25445webtoc.pdf «Алгол 68 и его влияние на программирование в СССР и России» – страницы: 336 и 342
  17. ^ Линдси 1996.
  18. ^ ab Lindsey, Charles H. (1996). Bergin, TJ; Gibson, RG (ред.). История ALGOL 68 . История языков программирования-II . Том 28. также в ACM SIGPLAN Notices 28(3), март 1993 г. (включает полную библиографию встреч и обсуждений до, во время и после разработки ALGOL 68). ACM Press . стр. 97–132. doi :10.1145/155360.155365. ISBN 978-0-201-89502-5. {{cite book}}: |journal=проигнорировано ( помощь )
  19. ^ Программирование на Algol 68 стало проще
  20. ^ Вир, Марсель ван дер. «Марсель ван дер Веер - Джинн Алгола 68». jmvdveer.home.xs4all.nl/ .
  21. ^ Линдси 1993, стр. 7.
  22. ^ abcd Линдси 1993, стр. 9.
  23. ^ Линдси 1993, стр. 24.
  24. ^ ab Lindsey 1993, стр. 10.
  25. ^ «Бюллетень Алгола».
  26. ^ ab Lindsey 1993, стр. 12.
  27. ^ Линдси, CH (1972). «ALGOL 68 с меньшим количеством разрывов» (PDF) . The Computer Journal . 15 (1): 176–188. doi :10.1093/comjnl/15.2.176.
  28. ^ Линдси 1993, стр. 13.
  29. ^ Линдси 1993, стр. 15.
  30. ^ Хоар, Калифорния. Р. (ноябрь 1968 г.). «Критика Алгола 68». Алгол Бюллетень . 29 : 27–29.
  31. ^ ab Peck, JEL, ed. (1970), Труды рабочей конференции IFIP по внедрению ALGOL 68 , Мюнхен: Северная Голландия, ISBN 0-7204-2045-8
  32. ^ abcd Koster, CHA "Краткая история Алгола 68". Архивировано из оригинала 2007-12-17.
  33. ^ Ван дер Вир, Марсель. «Реализации Algol 68 с открытым исходным кодом». algol68.sourceforge.net .
  34. ^ Э. Маркези, Хосе. «Фронтенд Algol68 для GCC». jemarch.net .
  35. ^ Ван Вейнгаарден, А.; Майу, Би Джей; Пек, Дж.; Костер, ЦДХ (1 марта 1968 г.). «Проект отчета об алгоритмическом языке АЛГОЛ 68». Бюллетень Алгола (Sup 26): 1–84 . Проверено 7 апреля 2023 г. - март 1968 г.
  36. Сидней Маршалл, «Реализация АЛГОЛа 68», Труды рабочей конференции ИФИП по реализации АЛГОЛа 68 , Мюнхен, 20–24 июля 1970 г., редактор Дж. Э. Л. Пек, Северная Голландия, страницы 239–243.
  37. ^ Сидней Маршалл, О реализации АЛГОЛа 68 , докторская диссертация, Дартмутский колледж, 1972.
  38. ^ Пересмотренный отчет Algol 68
  39. ^ Блэк, AP; Рэйворд-Смит, VJ (1978-05-01). «Предложения по ALGOL H — суперязыку ALGOL 68». ALGOL Bulletin (42): 36–49 . Получено 2023-04-07 – через май. 1978.
  40. ^ "Algol68 S(S) опубликован в интернете". Архивировано из оригинала 2005-12-03 . Получено 2004-08-30 .
  41. ^ Вир, Марсель ван дер. «Марсель ван дер Веер - Джинн Алгола 68». jmvdveer.home.xs4all.nl/ . Проверено 7 апреля 2023 г.
  42. ^ "Черновик отчета об алгоритмическом языке АЛГОЛ 68". Март 1968. Архивировано из оригинала 2007-09-30 . Получено 2007-06-22 .
  43. ^ "Предпоследний черновик отчета об алгоритмическом языке АЛГОЛ 68 – Главы 1-9" (PDF) . Октябрь 1968 г. Получено 22 июня 2007 г.[ постоянная мертвая ссылка ‍ ]
  44. ^ "Предпоследний черновик отчета по алгоритмическому языку АЛГОЛ 68 – Главы 10-12" (PDF) . Октябрь 1968. Получено 22 июня 2007 г.[ постоянная мертвая ссылка ‍ ]
  45. ^ "Отчет об алгоритмическом языке АЛГОЛ 68" (PDF) . Декабрь 1968. Архивировано из оригинала (PDF) 2008-04-06 . Получено 2007-12-30 .
  46. ^ "Пересмотренный отчет об алгоритмическом языке Algol 68". Сентябрь 1973 г. Архивировано из оригинала 27-09-2007 . Получено 30-04-2007 .
  47. ^ Лу Ху-цюань (1971). «Перевод Алгола 68 на китайский язык» (PDF) . Пекин, Китай: Институт математики Академии наук Синика . Проверено 17 августа 2012 г.
  48. ^ «ГОСТ 27974-88 Язык программирования АЛГОЛ 68 – Язык программирования АЛГОЛ 68» (PDF) (на русском языке). ГОСТ . 1988. Архивировано из оригинала (PDF) 15 ноября 2008 г. Проверено 15 ноября 2008 г.
  49. ^ «ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный – Язык программирования АЛГОЛ 68 расширенный» (PDF) (на русском языке). ГОСТ . 1988. Архивировано из оригинала (PDF) 29 апреля 2011 г. Проверено 15 ноября 2008 г.
  50. ^ "Синтаксис формата в ALGOL 68G". Архивировано из оригинала 2008-01-09 . Получено 2023-04-07 .
  51. ^ Needham, RM; Wilkes, MV (январь 1979). "Компьютер Cambridge CAP и его операционная система" (PDF) . Microsoft Research .
  52. Дэвид Холдсворт (зима 2009–2010). «KDF9 Time Sharing: Eldon 2 is not EGDON!». Computer Resurrection – Number 49. Computer Conservation Society . Получено 03.10.2010 .
  53. ^ IF Currie; JM Foster (сентябрь 1982 г.). "RSRE Memorandum" (PDF) . vitanuova.com . Получено 2023-04-07 .
  54. ^ Эльбрусаяна Бабрусаяна и Pentium Пентковского. Ixbt.com. Проверено 21 июля 2013 г.
  55. ^ Оливер, Дж. Р.; Ньютон, Р. С. (1979). «Практический опыт работы с АЛГОЛом 68-РТ». The Computer Journal . 22 (2): 114–118. doi : 10.1093/comjnl/22.2.114 .
  56. ^ Приложения, библиотеки и тестовые наборы — Software Preservation Group. Softwarepreservation.org. Получено 21 июля 2013 г.
  57. ^ Пересмотренный отчет, стр. 123, сноска.
  58. ^ Линдси, CH (июль 1974). «Частичная параметризация». ALGOL Bulletin (37): 24–26 . Получено 19 сентября 2022 г.
  59. ^ Линдси, CH; Бум, HJ (декабрь 1978 г.). «Модули и отдельная компиляция для ALGOL 68». ALGOL Bulletin (43): 19–53 . Получено 29.01.2020 .Комментарии опечатки
  60. ^ Линдси, CH (июль 1974). «Модальности». ALGOL Bulletin (37): 26–29 . Получено 19 сентября 2022 г.
  61. ^ "Архивная копия" (PDF) . Архивировано из оригинала (PDF) 2010-04-15 . Получено 2010-03-20 .{{cite web}}: CS1 maint: архивная копия как заголовок ( ссылка )
  62. ^ http://htportal.acm.org/ft_gateway.cfm?id=803425&type=pdf [ постоянная мертвая ссылка ‍ ]
  63. ^ Абстрактная машина ALGOL 68 и ее применение в машинно-независимом компиляторе – Springer. Springerlink.com. Получено 21 июля 2013 г.
  64. ^ "Энциклопедия компьютерных языков". Архивировано из оригинала 2011-03-10 . Получено 2010-03-20 .
  65. ^ Реализации Algol 68 с открытым исходным кодом – Просмотреть файлы на Sourceforge.net. Получено 21 июля 2013 г.
  66. ^ [1] Архивировано 29 августа 2006 г. на Wayback Machine.
  67. ^ "Архивная копия" (PDF) . Архивировано из оригинала (PDF) 2014-01-02 . Получено 2005-08-27 .{{cite web}}: CS1 maint: архивная копия как заголовок ( ссылка )
  68. ^ CHA Koster (1993). Создание Algol 68. Конспект лекций по информатике. CiteSeerX 10.1.1.76.2072 . 
  69. ^ Дейкстра, Э. В. "Редактору ALGOL 68 Mathematische Centrum". Архивировано из оригинала 21.04.2007 . Получено 28.04.2007 .
  70. ^ Ван Россум, Гвидо (июнь 2005 г.). "Python-Dev Wishlist: dowhile" . Получено 28.04.2007 .
  71. Hoare, CAR (февраль 1981 г.) [основано на его лекции по случаю вручения премии Тьюринга 1980 г. ]. «Старая одежда императора». Communications of the ACM . 24 (2): 75–83. doi : 10.1145/358549.358561 . S2CID  97895.Альтернативный URL-адрес Архивировано 2017-10-02 на Wayback Machine
  72. ^ "ALGOL Bulletin (referenced in AB30.1.1.1)". Март 1970. Архивировано из оригинала 2007-09-30 . Получено 2007-03-01 .

Цитируемые работы

  • Брейлсфорд, Д.Ф. и Уокер, А.Н., Введение в программирование на языке ALGOL 68 , Ellis Horwood/Wiley, 1979
  • Линдси, CH и ван дер Мейлен, SG, Неформальное введение в ALGOL 68 , Северная Голландия, 1971
  • Линдси, CH (1993-03-02). "История ALGOL 68". ACM SIGPLAN Notices . 28 (3): 97–132. doi : 10.1145/155360.155365 .
  • МакГеттрик, А.Д., АЛГОЛ 68, первый и второй курс , Cambridge Univ. Press, 1978
  • Пек, Дж.Э.Л., Компаньон по Алголу 68 , Univ. Британская Колумбия, октябрь 1971 г.
  • Таненбаум, А.С., Учебник по АЛГОЛу 68 , Computing Surveys 8 , 155-190, июнь 1976 г. и 9 , 255-256, сентябрь 1977 г., [7] [ постоянная мертвая ссылка ‍ ]
  • Вудворд, премьер-министр и Бонд, генеральный секретарь, Руководство пользователя ALGOL 68-R , Лондон, Канцелярия Ее Величества, 1972 г.
  • Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68. Официальное руководство для пользователей и разработчиков языка (большой файл PDF, отсканированный из Algol Bulletin)
  • Пересмотренный отчет по алгоритмическому языку АЛГОЛ 68. Гиперссылка на HTML-версию пересмотренного отчета.
  • Учебник по языку Algol 68, Эндрю С. Таненбаум , в Computing Surveys , том 8, № 2, июнь 1976 г., с исправлениями (том 9, № 3, сентябрь 1977 г.)
  • Algol 68 Genie — компилятор-интерпретатор GNU GPL Algol 68.
  • Реализации ALGOL 68 с открытым исходным кодом на SourceForge
  • Стандартное аппаратное представление Algol68 (.pdf) Архивировано 2014-01-02 на Wayback Machine
  • Из истории создания компилятора с Алголом 68
  • Алгол 68 – 25 лет в СССР
  • Система программ динамической опоры для транслятора с Алголом 68
  • История C с наследием Algol68
  • МакДжонс, Пол, «Реализации и диалекты Algol 68», Группа сохранения программного обеспечения , Музей компьютерной истории , 2011-07-05
  • Веб-компилятор ALGOL 68 для небольших экспериментов
Взято с "https://en.wikipedia.org/w/index.php?title=ALGOL_68&oldid=1257674219"