stringtranslate.com

АЛГОЛ 68

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] Cf Язык непересмотренного отчета.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] , процесс, который занял шесть человеконедель усилий. Полученная в результате статья «ALGOL 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]

Хронология

Отчеты и члены рабочей группы по алгоритмическому языку АЛГОЛ 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 стал одним из стандартов ГОСТ в России.

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

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

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

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

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

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

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

Имя режима (типа) можно объявить с помощью объявления 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 имеет иерархию контекстов, которые определяют вид приведения, доступного в определенной точке программы. Эти контексты:

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

Прагматы — это директивы в программе, обычно подсказки для компилятора; в новых языках они называются «прагмами» (без «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 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

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

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

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

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

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 :

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 ; вне)

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

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

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

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

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

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

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

Примечание: четвертичные периоды включают названия 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переданные в качестве аргументов.

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

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

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

«Форматированный перенос» в переносе 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

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

Приложения

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

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

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

Особенностью 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 :

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

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

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

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

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

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

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

Язык 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]

Кавычки

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

Ссылки

Цитаты

  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) . Пекин, Китай: Институт математики, Academia Sinica . Получено 17 августа 2012 г.
  48. ^ "ГОСТ 27974-88 Язык программирования АЛГОЛ 68 – Язык программирования АЛГОЛ 68" (PDF) (на русском языке). ГОСТ . 1988. Архивировано из оригинала (PDF) 2008-11-15 . Получено 2008-11-15 .
  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.07.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 .

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

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