stringtranslate.com

АЛГОЛ 68

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

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

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

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

Обзор

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

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

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

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

ЦДХ Костер [8]

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

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

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

В 1970 году АЛГОЛ 68-R стал первым работающим компилятором АЛГОЛА 68.

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

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

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

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

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

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

История

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

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

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

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

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

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

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

Публикация

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

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

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

Реализации

АЛГОЛ 68-Р

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

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

Другие

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

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

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

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

График

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

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

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

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

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

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

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

Жирные символы и зарезервированные слова

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

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 "( ~ | ~ |: ~ | ~ | ~ )", FOR ~ FROM ~ TO ~ BY ~ WHILE ~ DO ~ OD , IF ~ THEN ~ ELIF ~ THEN ~ ELSE ~ FI "( ~ | ~ |: ~ | ~ | ~ )", PAR  BEGIN ~ END "( ~ )", GO TO , GOTO , EXIT " □" р0 .

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

Основная языковая конструкция — это единица . Единицей может быть формула , вложенное предложение , обычный текст или одна из нескольких технически необходимых конструкций (присваивание, переход, пропуск, ничто). Технический термин «прилагаемое предложение» объединяет некоторые конструкции, заключающие в скобки, известные как «блок » , «оператор do », «оператор переключения» в других современных языках. При использовании ключевых слов обычно для завершения вложения используется обратная последовательность символов вводного ключевого слова, например ( IF ~ THEN ~ ELSE ~ FI , CASE ~ IN ~ OUT ~ ESAC , FOR ~ WHILE ~ DO ~ OD ). Этот синтаксис защищенной команды был повторно использован Стивеном Борном в общей оболочке Unix Bourne . Выражение может также давать множественное значение , которое создается из других значений с помощью вспомогательного предложения . Эта конструкция выглядит как пакет параметров вызова процедуры.

режим: Объявления

Базовыми типами данных ( modeна языке Алгола 68 они называются s) являются real, int, compl( комплексное число ) , bool, и . Например:charbitsbytes

ИНТ 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т. д., АЛГОЛ 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 .

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

Некоторые примеры см. в разделе «Сравнение АЛГОЛа 68 и C++» .

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

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

 ИНТ макс=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 ; короткий я , j , k ; плавать * р ; } новый режим [ 9 + 1 ] [ макс + 1 ];                 

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

Объявления режима позволяют типам быть рекурсивными : определяться прямо или косвенно в терминах самих себя. На это распространяются некоторые ограничения – например, эти заявления являются незаконными:

 MODE  A = REF  A  MODE  A = STRUCT ( A a, B b) MODE  A = PROC ( A a) A

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

 РЕЖИМ  A = СТРУКТУРА ( REF  A a, B b) MODE  A = PROC ( REF  A a) REF  A

Принуждения: кастинг

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

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

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

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

В АЛГОЛе 68 имеется иерархия контекстов, определяющая тип приведения, доступный в конкретной точке программы. Эти контексты:

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

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

Куча PRAGMAT =32 Куча PRAGMAT PR =32 PR

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

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

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

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

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

 НАСТОЯЩАЯ половина пи, одно пи; одно пи := 2 * (половина пи := 2 * дуга tan(1))

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

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

( INT sum:= 0; FOR i TO n DO sum +:= f(i) OD ; sum)

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

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

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

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

 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 THEN 29 ELSE 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, 31, 30, 31, 30, 31 ¢ по декабрь ¢ ЭСАК ;

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

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

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

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

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

INT сумма sq:=0; ДЛЯ Я ПОКА print(("Пока:",i,newline)); сумма кв≠70↑2ДЕЛАТЬ сумма sq+:=i↑2ОД

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

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

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

 РЕЖИМ  ВЕКТОР = [1:3] РЕАЛЬНЫЙ ; # векторное объявление 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 : # определение бинарного OP erator # ( VECTOR out; FOR i FROM ⌊a TO ⌈a DO out[i] := a [i]+b[i] OD ;выход); МАТРИЦА m := (v1, v2, v1+v2); печать ((m[,2:])); # фрагмент 2-го и 3-го столбцов #

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

 ССЫЛОЧНЫЙ  ВЕКТОР строка = m[2,]; # определяем REF (указатель) на вторую строку #  REF  VECTOR col = m[,2]; # определяем REF (указатель) на второй столбец #

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

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

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

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

процесс: Процедуры

Объявления процедур ( 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 apply = ( REF [] REAL a, PROC ( REAL ) REAL f):   FOR i FROM  LWB a TO  UPB a DO a[i] := f(a[i]) OD

Такая простота кода была недостижима в предшественнике АЛГОЛА 68, АЛГОЛЕ 60 .

оп: Операторы

Программист может определять новые операторы , причем как те, так и заранее определенные операторы могут быть перегружены , а их приоритеты могут быть изменены программистом. В следующем примере определяется оператор 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 a) REAL : ( REAL out := a[ LWB a]; FOR i FROM  LWB a + 1 TO  UPB a DO ( a[i]>out | out:=a[i]) OD ; вне)

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

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

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

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

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

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

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

Примечание. Кватернарии включают имена 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 , поскольку сравниваются фактические адреса переменных ipи jp, а не то, на что они указывают . Чтобы добиться нужного эффекта, пришлось бы написать

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

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

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

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

транспорт: ввод и вывод

Транспут — это термин, используемый для обозначения средств ввода и вывода Алгола 68. Он включает в себя заранее определенные процедуры для неформатированной, форматированной и двоичной передачи. Файлы и другие устройства передачи обрабатываются согласованным и машинонезависимым образом. В следующем примере выводится неформатированный вывод на стандартное устройство вывода :

 print ((новая страница, «Название», новая строка, «Значение i равно», i, "и x[i] есть ", x[i], новая строка))

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

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

Транспутация состоит из КНИГ , КАНАЛОВ и ФАЙЛОВ :

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

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

Примеры:

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

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

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

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

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

Пример кода

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

НАЧАЛО # Сито простых чисел Алгол-68, функциональный стиль #   Ошибка PROC = ( STRING s) VOID : (print(( новая строка, "ошибка: ", s, новая строка)); ПЕРЕЙТИ к остановке); PROC от одного до = ( INT n) СПИСОК : ( PROC f = ( INT m,n) LIST : (m>n | NIL | cons(m, f(m+1,n))); f(1,n));    СПИСОК РЕЖИМОВ = ОПОРНЫЙ  УЗЕЛ ; 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, LIST l) LIST : IF l IS  NIL  THEN  NIL  ELIF p(hd(l)) THEN cons(hd(l), filter(p,tl(l))) ELSE filter (p, tl(l)) FI ;   PROC sieve = ( LIST l) LIST : IF l IS  NIL  THEN  NIL  ELSE  PROC not Multiple = ( INT n) BOOL : n MOD hd(l) ~= 0; cons(hd(l), сито( фильтр( не кратный, tl(l) ))) ФИ ;   Простые числа PROC = ( INT n) LIST : sieve(tl(one to(n)));   показать(простые числа(100))КОНЕЦ

Операционные системы, написанные на АЛГОЛе 68.

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

Приложения

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

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

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

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

 INT реальный int = 3 ;

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

 INT реальное int = 3; # СТРОГО язык #'INT'A REAL INT = 3; # ЦИТАТА обрезает стиль #.INT РЕАЛЬНОЕ INT = 3; # Стиль обрезки POINT # INT реальное int = 3; # ВЕРХНИЙ стиль обрезки # интервал a_real_int = 3; # Стиль ограничения RES, разрешено 61 зарезервированное слово #

Все реализации должны распознавать как минимум POINT, UPPER и RES внутри разделов PRAGMAT. Из них ограничение POINT и UPPER довольно распространено, тогда как ограничение RES противоречит спецификации (поскольку в нем нет зарезервированных слов). ЦИТАТА (кавычка с одинарным апострофом) была первоначальной рекомендацией, тогда как кавычки с совпадающим апострофом, распространенные в АЛГОЛе 60, не часто используются в АЛГОЛе 68. [56]

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

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

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

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

# Дата следующего дня - английский вариант # MODE  DATE = STRUCT ( INT день, STRING месяц, INT год); PROC следующего дня = ( ДАТА x) ДАТА : ЕСЛИ день 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 ;

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

Немного Ванитас

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

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

другие примеры ℵ см. ниже.

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

АЛГОЛ 68 намеренно оставляет неопределенным то, что происходит в случае целочисленного переполнения , представление целочисленных битов и степень числовой точности для чисел с плавающей запятой. Напротив, язык Java подвергался критике за чрезмерную спецификацию последнего.

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

Выдержка из отчета 1973 года:

§10.3.2.2. Режимы транспортировкиа) MODESIMPLOUT = UNION (≮ℒ  INT ≯, ≮ℒ  REAL ≯, ≮ℒ  COMPL ≯, BOOL , ≮ℒ bits≯, CHAR , [ ] CHAR );б) MODEOUTTYPE = ¢ фактический – объявитель, указывающий объединенный режим из достаточного набора режимов, ни один из которых не является «пустым» или не содержит «гибких», «ссылка на», «процедуру» или «объединение» ¢;в) MODESIMPLIN = UNION (≮ REF ℒ  INT ≯, ≮ REF ℒ  REAL ≯, ≮ REFCOMPL ≯, REF  BOOL ,REF ℒ  BITS ≯, REF  CHAR , REF [ ] CHAR , REF  STRING );г) РЕЖИМТИП = ¢ ... ¢; §10.3.2.3. Выпрямлениеa) OPSTRAIGHTOUT = ( OUTTYPE x) [ ] SIMPLOUT : ¢ результат «выпрямления» 'x' ¢;б) OPSTRAIGHTIN = ( INTYPE x) [ ] SIMPLIN : ¢ результат выпрямления 'x' ¢;

Сравнения с другими языками

Редакции

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

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

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

OP  ANDF = ( BOOL a, PROC  BOOL b) BOOL :(a | b | FALSE ); OP  ORF = ( BOOL a, PROC  BOOL b) BOOL :(a | TRUE | b);

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

Как определено в АЛГОЛе 68, это не работало должным образом, например в коде:

IF  FALSE  ANDF  CO proc bool: CO ( print («Не должно выполняться»); TRUE ) THEN ...

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

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

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

Например в:

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

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

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

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

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

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

На данный момент в Algol 68 Genie реализована лишь частичная параметризация.

Настоящая спецификация ALGOL 68 и график реализации

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

Реализация конкретных расширений

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

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

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

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

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

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

Кавычки

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

Рекомендации

Цитаты

  1. ^ ван Вейнгаарден, Адриан ; Майу, Барри Джеймс ; Пек, Джон Эдвард Ланселот ; Костер, Корнелис Герман Антоний ; Синцов, Мишель [на французском языке] ; Линдси, Чарльз Ходжсон ; Меертенс, Ламбер Гийом Луи Теодор ; Фискер, Ричард Г., ред. (1976). Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68 (PDF) . Спрингер-Верлаг . ISBN 978-0-387-07592-1. OCLC  1991170. Архивировано (PDF) из оригинала 19 апреля 2019 г. Проверено 11 мая 2019 г.
  2. ^ аб Деннис Ритчи (апрель 1993 г.). «Развитие языка C» (PDF) . Архивировано из оригинала (PDF) 6 ноября 2005 г. Проверено 26 апреля 2007 г.
  3. ^ Влияние на C: типы, структуры, массивы, указатели и процедуры - Деннис Ритчи [2]
  4. ^ аб Деннис Ричи (июнь 1988 г.). «С и Алгол 68» . Проверено 15 сентября 2006 г.
  5. ^ Влияние на C: объединение, структура, синтаксис и длинная точность - Деннис Ритчи [4]
  6. ^ «История C++: 1979–1991» (PDF) . Март 1993. Страница 12, 2-й абзац: Algol68 [предоставил] перегрузку операторов (§3.3.3), ссылки (§3.3.4) и возможность объявлять переменные в любом месте блока (§3.3.1) . Проверено 6 мая 2008 г.
  7. ^ «Интервью с Гвидо ван Россумом». Июль 1998 г. Архивировано из оригинала 1 мая 2007 г. Проверено 29 апреля 2007 г.
  8. ^ «Краткая история Алгола 68». Архивировано из оригинала 10 августа 2006 г. Проверено 15 сентября 2006 г.
  9. ^ Вир, Марсель ван дер (5 апреля 2023 г.). «Пересмотренный отчет об алгоритмическом языке Алгол 68». jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 17 марта 2013 г.
  10. ^ Вир, Марсель ван дер (5 апреля 2023 г.). «Пересмотренный отчет об алгоритмическом языке Алгол 68». jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 17 марта 2013 г.
  11. ^ Вир, Марсель ван дер (5 апреля 2023 г.). «Пересмотренный отчет об алгоритмическом языке Алгол 68». jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 17 марта 2013 г.
  12. ^ Вир, Марсель ван дер (5 апреля 2023 г.). «Пересмотренный отчет об алгоритмическом языке Алгол 68». jmvdveer.home.xs4all.nl/ . Архивировано из оригинала 17 марта 2013 г.
  13. ^ "Гоммас?".
  14. ^ Пересмотренный отчет об алгоритмическом языке Algol 68. Архивировано 17 марта 2013 г. в Wayback Machine . jmvdveer.home.xs4all.nl (20 декабря 1968 г.). Проверено 21 июля 2013 г.
  15. ^ Терехов, Андрей (2014). «АЛГОЛ 68 и его влияние на советское и российское программирование». 2014 Третья Международная конференция по компьютерным технологиям в России и на постсоветском пространстве . стр. 97–106. дои :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. ^ аб Линдси, Чарльз Х. (1996). Бергин, Ти Джей; Гибсон, Р.Г. (ред.). История АЛГОЛА 68 . История языков программирования-II . Том. 28. также в Уведомлениях ACM SIGPLAN 28(3), март 1993 г. (включает исчерпывающую библиографию встреч и дискуссий до, во время и после разработки ALGOL 68). АКМ Пресс . стр. 97–132. дои : 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. ^ аб Линдси 1993, с. 10.
  25. ^ "Бюллетень Алгола".
  26. ^ аб Линдси 1993, с. 12.
  27. ^ Линдси 1993, с. 13.
  28. ^ Линдси 1993, с. 15.
  29. ^ Хоар, Калифорния. Р. (ноябрь 1968 г.). «Критика Алгола 68». Алгол Бюллетень . 29 : 27–29.
  30. ^ аб Пек, JEL, изд. (1970), Материалы рабочей конференции ИФИП по реализации Алгола 68 , Мюнхен: Северная Голландия, ISBN. 0-7204-2045-8
  31. ^ abcd Костер, CHA «Краткая история Алгола 68». Архивировано из оригинала 17 декабря 2007 г.
  32. ^ ван дер Веер, Марсель. «Реализации Algol 68 с открытым исходным кодом». algol68.sourceforge.net .
  33. ^ Э. Маркези, Хосе. «Фронтенд Algol68 для GCC». jemarch.net .
  34. ^ Ван Вейнгаарден, А.; Майу, Би Джей; Пек, Дж.; Костер, ЦДХ (1 марта 1968 г.). «Проект отчета об алгоритмическом языке АЛГОЛ 68». Бюллетень АЛГОЛА (Sup 26): 1–84 . Проверено 7 апреля 2023 г. - март 1968 г.
  35. ^ Сидни Маршалл, «Внедрение АЛГОЛа 68», Материалы рабочей конференции ИФИП по внедрению АЛГОЛа 68 , Мюнхен, 20–24 июля 1970 г., Дж. Э. Пек, редактор, Северная Голландия, страницы 239–243.
  36. ^ Сидни Маршалл, О реализации Алгола 68 , докторская диссертация, Дартмутский колледж, 1972.
  37. ^ Пересмотренный отчет Алгола 68
  38. ^ Блэк, AP; Рэйворд-Смит, виджей (1 мая 1978 г.). «Предложения по АЛГОЛУ H - сверхязыку АЛГОЛА 68». Бюллетень Алгола (42): 36–49 . Проверено 7 апреля 2023 г. - в мае. 1978.
  39. ^ "Algol68 S(S) опубликован в Интернете" . Архивировано из оригинала 3 декабря 2005 г. Проверено 30 августа 2004 г.
  40. ^ Вир, Марсель ван дер. «Марсель ван дер Веер - Джинн Алгола 68». jmvdveer.home.xs4all.nl/ . Проверено 7 апреля 2023 г.
  41. ^ «Проект отчета об алгоритмическом языке АЛГОЛ 68» . Март 1968 г. Архивировано из оригинала 30 сентября 2007 г. Проверено 22 июня 2007 г.
  42. ^ «Предпоследний проект отчета об алгоритмическом языке ALGOL 68 – Главы 1–9» (PDF) . Октябрь 1968 года . Проверено 22 июня 2007 г.[ постоянная мертвая ссылка ]
  43. ^ «Предпоследний проект отчета об алгоритмическом языке ALGOL 68 - Главы 10–12» (PDF) . Октябрь 1968 года . Проверено 22 июня 2007 г.[ постоянная мертвая ссылка ]
  44. ^ «Отчет об алгоритмическом языке АЛГОЛ 68» (PDF) . Декабрь 1968 г. Архивировано из оригинала (PDF) 6 апреля 2008 г. Проверено 30 декабря 2007 г.
  45. ^ «Пересмотренный отчет об алгоритмическом языке Алгол 68» . Сентябрь 1973 г. Архивировано из оригинала 27 сентября 2007 г. Проверено 30 апреля 2007 г.
  46. ^ Лу Ху-цюань (1971). «Перевод Алгола 68 на китайский язык» (PDF) . Пекин, Китай: Институт математики Академии наук Синика . Проверено 17 августа 2012 г.
  47. ^ «ГОСТ 27974-88 Язык программирования АЛГОЛ 68 – Язык программирования АЛГОЛ 68» (PDF) (на русском языке). ГОСТ . 1988. Архивировано из оригинала (PDF) 15 ноября 2008 г. Проверено 15 ноября 2008 г.
  48. ^ «ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный – Язык программирования АЛГОЛ 68 расширенный» (PDF) (на русском языке). ГОСТ . 1988. Архивировано из оригинала (PDF) 29 апреля 2011 г. Проверено 15 ноября 2008 г.
  49. ^ «Синтаксис формата в ALGOL 68G» . Архивировано из оригинала 9 января 2008 г. Проверено 7 апреля 2023 г.
  50. ^ Нидхэм, РМ; Уилкс, М.В. (январь 1979 г.). «Компьютер Cambridge CAP и его операционная система» (PDF) . Исследования Майкрософт .
  51. ^ Дэвид Холдсворт (зима 2009–2010 гг.). «Разделение времени KDF9: Элдон 2 — это не EGDON!». Компьютерное воскрешение — номер 49 . Общество охраны компьютеров . Проверено 3 октября 2010 г.
  52. ^ ЕСЛИ Карри; Дж. М. Фостер (сентябрь 1982 г.). «Меморандум РСРЭ» (PDF) . vitanuova.com . Проверено 7 апреля 2023 г.
  53. ^ Эльбрусаяна Бабрусаяна и Pentium Пентковского. Ixbt.com. Проверено 21 июля 2013 г.
  54. ^ Оливер, младший; Ньютон, Р.С. (1979). «Практический опыт работы с АЛГОЛом 68-RT». Компьютерный журнал . 22 (2): 114–118. дои : 10.1093/comjnl/22.2.114 .
  55. ^ Приложения, библиотеки и наборы тестов — Группа сохранения программного обеспечения. Softwarepreservation.org. Проверено 21 июля 2013 г.
  56. ^ Пересмотренный отчет, стр. 123, сноска.
  57. ^ "Свободный университет Амстердама" (PDF) .
  58. ^ Линдси, CH (июль 1974 г.). «Частичная параметризация». Бюллетень Алгола (37): 24–26 . Проверено 19 сентября 2022 г.
  59. ^ Линдси, Швейцария; Бум, HJ (декабрь 1978 г.). «Модули и отдельная программа компиляции для АЛГОЛа 68». Бюллетень Алгола (43): 19–53 . Проверено 29 января 2020 г.Ошибки в комментариях
  60. ^ Линдси, CH (июль 1974 г.). «Модалы». Бюллетень Алгола (37): 26–29 . Проверено 19 сентября 2022 г.
  61. ^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 15 апреля 2010 г. Проверено 20 марта 2010 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
  62. ^ http://htportal.acm.org/ft_gateway.cfm?id=803425&type=pdf [ постоянная неработающая ссылка ]
  63. ^ Абстрактная машина АЛГОЛ 68 и ее применение в машинно-независимом компиляторе - Springer. Springerlink.com. Проверено 21 июля 2013 г.
  64. ^ "Энциклопедия компьютерных языков". Архивировано из оригинала 10 марта 2011 г. Проверено 20 марта 2010 г.
  65. ^ Реализации Algol 68 с открытым исходным кодом – просмотр файлов на сайте. Sourceforge.net. Проверено 21 июля 2013 г.
  66. ^ [1] Архивировано 29 августа 2006 г. в Wayback Machine.
  67. ^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 2 января 2014 г. Проверено 27 августа 2005 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
  68. ^ ЦДХ Костер (1993). Создание Алгола 68 . Конспекты лекций по информатике. CiteSeerX 10.1.1.76.2072 . 
  69. ^ Дейкстра, EW "Редактору ALGOL 68 Mathematische Centrum". Архивировано из оригинала 21 апреля 2007 г. Проверено 28 апреля 2007 г.
  70. ^ ван Россум, Гвидо (июнь 2005 г.). «Список желаний Python-Dev: бездействовать» . Проверено 28 апреля 2007 г.
  71. ^ Хоар, ЦАР (февраль 1981 г.) [на основе его лекции на Премии Тьюринга 1980 г. ]. «Старая одежда императора». Коммуникации АКМ . 24 (2): 75–83. дои : 10.1145/358549.358561 . S2CID  97895.Альтернативный URL-адрес. Архивировано 2 октября 2017 г. на Wayback Machine.
  72. ^ «Бюллетень АЛГОЛА (упоминается в AB30.1.1.1)» . Март 1970 г. Архивировано из оригинала 30 сентября 2007 г. Проверено 1 марта 2007 г.

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

Внешние ссылки