Парадигмы | Мультипарадигма : одновременная , императивная |
---|---|
Семья | АЛГОЛ |
Разработано | А. ван Вейнгаарден , Б. Дж. Майу , Дж. Э. Пек и ЧА Костер и др. |
Впервые появился | Окончательный отчет: 1968 ( 1968 ) | r0
Стабильный релиз | Алгол 68/RR/Пересмотренный отчет: 1973 г ( 1973 ) r1 |
Дисциплина набора текста | статичный , прочный , безопасный , структурный |
Объем | Лексический |
Основные внедрения | |
АЛГОЛ 68C , Алгол 68 Джинн (недавний), АЛГОЛ 68-R , АЛГОЛ 68RS , АЛГОЛ 68S , FLACC , Алгол 68 Ленинград/Ленинградский отряд, Одра АЛГОЛ 68 | |
Диалекты | |
АЛГОЛ 68/FR (Окончательный отчет r0 ) | |
Под влиянием | |
АЛГОЛ 60 , АЛГОЛ Y | |
Под влиянием | |
C , [3] [5] C++ , [6] Bourne shell , KornShell , Bash , Steelman , Ada , Python , [7] Seed7 , Mary , S3 |
ALGOL 68 (сокращение от Algorithmic Language 1968 ) — императивный язык программирования , задуманный как преемник языка программирования ALGOL 60 , разработанный с целью гораздо более широкой сферы применения и более строго определенного синтаксиса и семантики.
Сложность определения языка, которое достигает нескольких сотен страниц, заполненных нестандартной терминологией, затрудняла реализацию компилятора , и было сказано, что у него «нет реализаций и нет пользователей». Это было правдой лишь отчасти; ALGOL 68 нашел применение на нескольких нишевых рынках, в частности в Соединенном Королевстве , где он был популярен на машинах International Computers Limited (ICL) и в учебных целях. За пределами этих областей применение было относительно ограниченным.
Тем не менее, вклад ALGOL 68 в область компьютерных наук был глубоким, всеобъемлющим и устойчивым, хотя многие из этих вкладов были публично идентифицированы только тогда, когда они вновь появились в впоследствии разработанных языках программирования. Многие языки были разработаны специально как ответ на воспринимаемую сложность языка, наиболее заметным из которых является Pascal , или были повторными реализациями для определенных ролей, как Ada .
Многие языки 1970-х годов прослеживают свой дизайн именно к ALGOL 68, выбирая некоторые функции и отказываясь от других, которые считались слишком сложными или выходящими за рамки определенных ролей. Среди них — язык C , на который ALGOL 68 оказал непосредственное влияние, особенно его строгая типизация и структуры. Большинство современных языков прослеживают по крайней мере часть своего синтаксиса либо к C, либо к Pascal, и, таким образом, напрямую или косвенно к ALGOL 68.
Возможности ALGOL 68 включают синтаксис на основе выражений, объявляемые пользователем типы и структуры/тегированные объединения, справочную модель переменных и справочных параметров, нарезку строк, массивов и матриц, а также параллелизм.
ALGOL 68 был разработан Рабочей группой IFIP 2.1 по алгоритмическим языкам и исчислениям Международной федерации по обработке информации (IFIP) . 20 декабря 1968 года язык был официально принят группой, а затем одобрен для публикации Генеральной ассамблеей IFIP.
ALGOL 68 был определен с использованием формализма , двухуровневой формальной грамматики , изобретенной Адрианом ван Вейнгарденом . Грамматики ван Вейнгардена используют контекстно-свободную грамматику для генерации бесконечного набора производных, которые распознают конкретную программу ALGOL 68; в частности, они способны выражать тип требований, которые во многих других технических стандартах языков программирования называются семантикой и должны быть выражены в подверженной неоднозначности естественно-языковой прозе, а затем реализованы в компиляторах как специальный код, прикрепленный к формальному синтаксическому анализатору языка.
АЛГОЛ 68 был первым (и, возможно, одним из последних) крупным языком, для которого было дано полное формальное определение до его реализации.
CHA Костер [8]
Основные цели и принципы построения АЛГОЛа 68:
ALGOL 68 подвергался критике, особенно со стороны некоторых членов его проектного комитета, таких как К. А. Хоар и Эдсгер Дейкстра , за отказ от простоты ALGOL 60 , превращение в средство для сложных или слишком общих идей и незначительную работу по облегчению задачи разработчика компилятора в отличие от намеренно простых современников (и конкурентов), таких как C , S-algol и Pascal .
В 1970 году ALGOL 68-R стал первым рабочим компилятором для ALGOL 68.
В редакции 1973 года некоторые особенности, такие как процедуры , гоммы [13] и формальные границы , были опущены. [14] Ср. Язык непересмотренного отчета.r0
Хотя европейские оборонные агентства (в Великобритании — Королевское управление радиолокации и связи (RSRE)) продвигали использование языка ALGOL 68 из-за его предполагаемых преимуществ в плане безопасности, американская сторона альянса НАТО решила разработать другой проект — язык Ada , сделав его использование обязательным для оборонных контрактов США.
АЛГОЛ 68 также имел заметное влияние в Советском Союзе , подробности о котором можно найти в статье Андрея Терехова 2014 года: «АЛГОЛ 68 и его влияние на СССР и российское программирование», [15] и «Алгол 68 и его влияние». по программированию в СССР и России». [16]
Стив Борн , входивший в комитет по пересмотру ALGOL 68, перенес некоторые из его идей в свою оболочку Bourne (и, следовательно, в дочерние оболочки Unix, такие как Bash ) и в C (и, следовательно, в дочерние оболочки, такие как C++ ).
Полную историю проекта можно найти в книге CH Lindsey «История ALGOL 68» . [17] [18]
Полное описание языка см. в книге «Программирование ALGOL 68 Made Easy» [19] д-ра Сиан Маунтбеттен или в книге «Изучение ALGOL 68 Genie» [20] Марселя ван дер Вира, которая включает в себя пересмотренный отчет.
ALGOL 68, как следует из названия, является продолжением языка ALGOL , который был впервые формализован в 1960 году. В том же году Международная федерация по обработке информации (IFIP) сформировала и начала работу Рабочую группу по ALGOL, или WG2.1. Эта группа выпустила обновленную спецификацию ALGOL 60 в Риме в апреле 1962 года. На последующем заседании в марте 1964 года было решено, что группа должна начать работу над двумя последующими стандартами, ALGOL X , который будет переопределением языка с некоторыми дополнениями, и ALGOL Y , который будет иметь возможность изменять свои собственные программы в стиле языка LISP . [21]
Первая встреча группы ALGOL X состоялась в Принстонском университете в мае 1965 года. В отчете о встрече были отмечены две широко поддерживаемые темы: введение строгой типизации и интерес к концепциям Эйлера «деревьев» или «списков» для обработки коллекций. [22]
На второй встрече в октябре во Франции были представлены три формальных предложения: ALGOL W Никлауса Вирта вместе с комментариями о структурах записей CAR (Tony) Hoare , похожий язык Герхарда Зеегмюллера и статья Адриана ван Вейнгаардена на тему «Ортогональное проектирование и описание формального языка». Последняя, написанная на почти неразборчивой «W-грамматике», оказалась решающим сдвигом в развитии языка. Встреча завершилась соглашением о том, что ван Вейнгаарден перепишет предложение Вирта/Хора, используя свою W-грамматику. [22]
Эта, казалось бы, простая задача в конечном итоге оказалась сложнее, чем ожидалось, и последующую встречу пришлось отложить на шесть месяцев. Когда она состоялась в апреле 1966 года в Котвейке , черновик ван Вейнгаардена остался незавершенным, и Вирт и Хоар представили версию, использующую более традиционные описания. Было в целом решено, что их статья была «правильным языком в неправильном формализме». [23] По мере изучения этих подходов стало ясно, что существует разница в способе описания параметров, которая будет иметь реальные эффекты, и хотя Вирт и Хоар протестовали, что дальнейшие задержки могут стать бесконечными, комитет решил дождаться версии ван Вейнгаардена. Затем Вирт реализовал свое текущее определение как ALGOL W. [24]
На следующей встрече в Варшаве в октябре 1966 года [25] был представлен первоначальный отчет Подкомитета по вводу/выводу, который встречался в Национальной лаборатории Оук-Ридж и Иллинойсском университете , но еще не достиг большого прогресса. Два предложения с предыдущей встречи были снова изучены, и на этот раз возник новый спор об использовании указателей ; ALGOL W использовал их только для ссылки на записи, в то время как версия ван Вейнгаардена могла указывать на любой объект. Чтобы добавить путаницы, Джон Маккарти представил новое предложение по перегрузке операторов и возможности связывать вместе конструкции и или , а Клаус Самельсон хотел разрешить анонимные функции . В результате путаницы было некоторое обсуждение отказа от всех усилий. [24] Путаница продолжалась до того, что должно было стать встречей ALGOL Y в Зандвоорте в мае 1967 года. [22]
Проект отчета был наконец опубликован в феврале 1968 года. Это было встречено «шоком, ужасом и несогласием» [22] , в основном из-за сотен страниц нечитаемой грамматики и странной терминологии. Чарльз Х. Линдси попытался выяснить, какой «язык был скрыт внутри него» [26] , процесс, который занял шесть человеко-недель усилий. Получившаяся в результате статья «АЛГОЛ 68 с меньшим количеством слез» [27] была широко распространена. На более широком совещании по обработке информации в Цюрихе в мае 1968 года участники жаловались, что язык был навязан им и что IFIP был «истинным злодеем этой неразумной ситуации», поскольку совещания в основном были закрытыми и не было никакого формального механизма обратной связи. Вирт и Петер Наур официально отказались от своих авторских должностей в WG2.1 в то время. [26]
Следующая встреча WG2.1 состоялась в Тиррении в июне 1968 года. На ней предполагалось обсудить выпуск компиляторов и другие вопросы, но вместо этого она переросла в обсуждение языка. Ван Вейнгаарден ответил, заявив (или пригрозив), что он выпустит только еще одну версию отчета. К этому моменту Наур, Хоар и Вирт оставили работу, и еще несколько человек угрожали сделать это. [28] Последовало еще несколько встреч: в Норт-Бервике в августе 1968 года, в Мюнхене в декабре, которые привели к выпуску официального отчета в январе 1969 года, но также привели к написанию спорного отчета меньшинства. Наконец, в Банфе, Альберта , в сентябре 1969 года проект был в целом признан завершенным, и обсуждение в основном касалось исправлений и значительно расширенного введения к отчету. [29]
Усилия заняли пять лет, выжгли многие из величайших имен в компьютерной науке и несколько раз заходили в тупик из-за проблем как в определении, так и в группе в целом. Хоар почти сразу же выпустил «Критику ALGOL 68», [30] на которую широко ссылались во многих работах. Вирт продолжил развивать концепцию ALGOL W и выпустил ее как Pascal в 1970 году.
Первая реализация стандарта, основанная на черновике Отчета конца 1968 года, была представлена Королевским радиолокационным учреждением в Великобритании как ALGOL 68-R в июле 1970 года. Однако это было подмножество полного языка, и Барри Майу , последний редактор Отчета, пошутил, что «Это вопрос морали. У нас есть Библия, а вы грешите!» [31] Тем не менее эта версия стала очень популярной на машинах ICL и стала широко используемым языком в военном кодировании, особенно в Великобритании. [32]
Среди изменений в 68-R было требование, чтобы все переменные были объявлены до их первого использования. Это имело существенное преимущество, поскольку позволяло компилятору быть однопроходным, поскольку место для переменных в записи активации отводилось до ее использования. Однако это изменение также имело побочный эффект, требуя, чтобы PROC были объявлены дважды, один раз как объявление типов, а затем еще раз как тело кода. Другое изменение заключалось в устранении предполагаемого режима VOID , выражения, которое не возвращает никакого значения (называемого оператором в других языках), и требуя добавления слова VOID там, где оно предполагалось. Кроме того, 68-R устранил явные команды параллельной обработки, основанные на PAR . [31]
Первая полная реализация языка была представлена в 1974 году CDC Netherlands для серии мэйнфреймов Control Data . Она имела ограниченное применение, в основном в преподавании в Германии и Нидерландах. [32]
Версия, похожая на 68-R, была представлена в Университете Карнеги-Меллона в 1976 году как 68S и снова представляла собой однопроходный компилятор, основанный на различных упрощениях оригинала и предназначенный для использования на меньших машинах, таких как DEC PDP-11 . Она также использовалась в основном в учебных целях. [32]
Версия для мэйнфреймов IBM не была доступна до 1978 года, когда ее выпустил Кембриджский университет . Она была «почти завершена». Линдси выпустила версию для небольших машин, включая IBM PC, в 1984 году. [32]
Известны три реализации Algol 68 с открытым исходным кодом: [33]
Год | Событие | Участник |
---|---|---|
Март 1959 г. | Бюллетень ALGOL, выпуск 1 (первый) | Питер Наур / ACM |
Февраль 1968 г. | Опубликован проект отчета (DR) [35] | Рабочая группа ИФИП 2.1 |
Март 1968 г. | Заключительный отчет Algol 68 r0 представлен на Мюнхенской встрече | Рабочая группа ИФИП 2.1 |
Июнь 1968 г. | Встреча в Тиррении, Италия | Рабочая группа ИФИП 2.1 |
август 1968 г. | Встреча в Норт-Бервике, Шотландия | Рабочая группа ИФИП 2.1 |
Декабрь 1968 г. | Заключительный отчет ALGOL 68 r0 представлен на Мюнхенской конференции | Рабочая группа ИФИП 2.1 |
Апрель 1970 г. | ALGOL 68-R под GEORGE 3 на ICL 1907F | Королевские сигналы и радары. |
Июль 1970 г. | ALGOL 68 для системы разделения времени Дартмута [36] [37] | Сидни Маршалл |
Сентябрь 1973 г. | Пересмотренный отчет Algol 68 [38] r1 Опубликован | Рабочая группа ИФИП 2.1 |
1975 | ALGOL 68C (C) – переносимый компилятор (zcode VM ) | С. Борн , Эндрю Биррелл и Майкл Гай |
Июнь 1975 г. | GE Hedrick и Alan Robertson. Oklahoma State ALGOL 68 Subset Compiler. Международная конференция по ALGOL 68 1975 года. | |
Июнь 1977 г. | Конференция Strathclyde ALGOL 68, Шотландия | АКМ |
Май 1978 г. | Предложения по ALGOL H – суперязыку ALGOL 68 [39] | AP Black, VJ Rayward-Smith |
1984 | Полный компилятор ALGOL 68S (S) для Sun, SPARC и ПК | CH Lindsey и др., Манчестер |
Август 1988 г. | ALGOL Bulletin Выпуск 52 (последний) | Ред. CH Lindsey / ACM |
Май 1997 г. | Algol68 S (S) опубликован в Интернете [40] | Чарльз Х. Линдси |
Ноябрь 2001 г. | Algol 68 Genie (G) опубликован в Интернете [41] (лицензия с открытым исходным кодом GNU GPL) | Марсель ван дер Веер |
«Ван Вейнгаарден однажды охарактеризовал четырех авторов, несколько иронично, как: Костер: транспьютер, Пек: синтаксис, Майу: исполнитель, Ван Вейнгаарден: партийный идеолог». – Костер.
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 . Выражение также может выдавать множественное значение , которое создается из других значений с помощью сопутствующего предложения . Эта конструкция выглядит просто как пакет параметров вызова процедуры.
Базовыми типами данных (называемых mode
s в жаргоне 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 имеет иерархию контекстов, которые определяют вид приведения, доступного в определенной точке программы. Эти контексты:
Контекст | Контекстное местоположение | Принуждения доступны | Примеры принуждения в контексте | ||||
---|---|---|---|---|---|---|---|
Мягкий | Слабый | Кроткий | Твердый | Сильный | |||
Сильный | Правая сторона:
Также:
| депроцедуринг | Все SOFT , затем слабое разыменование (разыменование или депроцедурирование, возвращающее имя) | Все СЛАБЫЕ затем разыменовывание (разыменование или депроцедурирование) | Все МИК затем объединяются | Все ТВЕРДОЕ затем расширение, гребля или опорожнение | Расширение происходит, если нет потери точности. Например: INT будет приведен к REAL , а REAL будет приведен к LONG REAL . Но не наоборот. Примеры:
Переменную также можно привести (привести к строке) к массиву длиной 1. Например:
|
Твердый |
| Пример:
| |||||
Кроткий |
| Примеры:
| |||||
Слабый |
| Примеры:
| |||||
Мягкий | Левая часть заданий, как «~» в:~ := ... | Пример:
|
Более подробную информацию о первичных, вторичных, третичных и четвертичных операторах см. в разделе Приоритет операторов.
Прагматы — это директивы в программе, обычно подсказки для компилятора; в новых языках они называются «прагмами» (без «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 , но и позволяет избежать необходимости использования BEGIN
and 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 :
Algol68 r0 как в Заключительном отчете 1968 года | Algol68 r1 как в пересмотренном отчете 1973 г. |
---|---|
УЗЕЛ n := "1234"; REAL r; INT i; COMPL c; СТРОКА s КЕЙС r,i,c,s::=n IN print(("действительный:", r)), print(("int:", i)), print(("compl:", c)), print(("строка:", s)) OUT print(("?:", n)) ESAC | УЗЕЛ n := "1234"; # или n := ПУСТО; # CASE n IN ( VOID ): print(("void:", "EMPTY")), ( REAL r): print(("real:", r)), ( INT i): печать(("int:", i)), ( КОМПЛ c): print(("компл:", c)), ( СТРОКА s): печать(("строка:", s)) ВЫХОД печать(("?:", n)) ESAC |
Для объявлений процедур ( PROC ) требуются спецификации типов как для параметров, так и для результата ( 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 .
Программист может определить новые операторы , и как те, так и предопределенные могут быть перегружены , а их приоритеты могут быть изменены кодером. Следующий пример определяет оператор MAX
как с диадической, так и с монадической версиями (сканирование по элементам массива).
ПРИО МАКС = 9; OP MAX = ( INT a,b) INT : ( a>b | a | b ); OP MAX = ( REAL a,b) REAL : ( a>b | a | b ); OP MAX = ( COMPL a,b) COMPL : ( ABS a > ABS b | a | b ); OP MAX = ([] РЕАЛЬНЫЙ а) РЕАЛЬНЫЙ : ( REAL out := a[ LWB a]; ДЛЯ i ОТ LWB a + 1 ДО UPB a ДО ( a[i]>out | out:=a[i] ) OD ; вне)
ПРИОРИТЕТ | Операция r0&r1 | +Алгол68 р0 | +Алгол68 Г |
---|---|---|---|
Эффективно 12 (начальная школа) | разыменование, депроцедурирование(~,~), индексация[~], выравнивание[~,], нарезка[~:~], обозначения размера LONG и SHORT | процедура | каррирование(~,,,), DIAG , TRNSP , ROW , COL |
Эффективно 11 (среднее) | OF (выбор), LOC и HEAP (генераторы) | → (выбор) | НОВЫЕ (генераторы) |
Технически они не являются операторами, а скорее считаются «единицами, связанными с именами».
ПРИОРИТЕТ (Третичный ) | Algol68 "Достойные персонажи [6] " r0&r1 | +Алгол68 r0&r1 | +Алгол68 C,G | +Алгол68 р0 |
---|---|---|---|---|
10 | НЕ ~, ВВЕРХ , ВНИЗ , ЛБП , ВВЕРХБП , -, ABS , ARG , BIN , ENTIER , LENG , LEVEL , ODD , REPR , ROUND , SHORTEN | ¬, ↑, ↓, ⌊, ⌈ | НОРМА , СЛЕД , Т , ДЕТ , ИНВ | LWS , UPS , ⎩, ⎧, BTB , CTB |
ПРИОРИТЕТ (Третичный ) | Algol68 "Достойные персонажи" r0&r1 | +Алгол68 r0&r1 | +Алгол68 C,G | +Алгол68 р0 |
---|---|---|---|---|
9 | +*, я | +×, ⊥ | ! | |
8 | SHL , SHR , **, ВВЕРХ , ВНИЗ , LWB , UPB | ↑, ↓, ⌊, ⌈ | ××, ^, LWS , UPS , ⎩, ⎧ | |
7 | *, /, %, OVER , %*, MOD , ЭЛЕМ | ×, ÷, ÷×, ÷*, %×, □ | ÷: | |
6 | -, + | |||
5 | <, LT , <=, LE , >=, GE , >, GT | ≤, ≥ | ||
4 | ЭКВ =, СВ ~= /= | ≠, ¬= | ||
3 | &, И | ∧ | /\ | |
2 | ИЛИ | ∨ | \/ | |
1 | МИНУСАБ , ПЛЮСАБ , TIMESAB , ДИВАБ , ОВЕРАБ , МОДАБ , ПЛЮСТО , -:=, +:=, *:=, /:=, %:=, %*:=, +=: | ×:=, ÷:=, ÷×:=, ÷*:=, %×:= | МИНУС , ПЛЮС , ДЕЛ , ПЕРЕБЕР , MODB , ÷::=, ПРУС |
Конкретные детали:
union([]int, [,]real, flex[,,,]char)
Технически они не являются операторами, а скорее считаются «единицами, связанными с именами».
ПРИОРИТЕТ (четвертичные периоды ) | Algol68 "Достойные персонажи" r0&r1 | +Алгол68 r0&r1 | +Алгол68 C,G,R | +Алгол68 р0 |
---|---|---|---|---|
Эффективно 0 | :=, ЕСТЬ :=:, НЕТ :/=: :~=:, AT @, ":", ";" | :≠: :¬=: | :=:= С , =:= Р | ..=, .=, CT , ::, CTAB , ::=, .., не является , "..", ".," |
Примечание: четвертичные периоды включают названия SKIP и ~.
:=:
(альтернативно IS ) проверяет, равны ли два указателя; (альтернативно ISNT ) проверяет, не равны ли они.:/=:
:=:
и :/=:
нужныПопробуйте сравнить два значения указателя, например, следующие переменные, объявленные как указатели на целое число:
REF INT ip, jp
Теперь рассмотрим, как решить, указывают ли эти два на одно и то же место или один из них указывает на NIL . Следующее выражение
ip = jp
разыменует оба указателя вниз на значения типа INT и сравнит их, поскольку оператор = определен для INT , но не REF INT . Недопустимо определять = для операндов типа REF INT и INT одновременно, поскольку тогда вызовы становятся неоднозначными из-за неявных приведения, которые могут быть применены: следует ли оставить операнды как REF INT и вызвать эту версию оператора? Или их следует разыменовать далее на INT и вместо этого использовать эту версию? Поэтому следующее выражение никогда не может быть сделано допустимым:
ip = NIL
Отсюда необходимость в отдельных конструкциях, не подчиняющихся обычным правилам приведения операндов к операторам. Но есть подвох. Следующие выражения:
ip :=: jp
ip :=: NIL
хотя это и допустимо, вероятно, не будет делать то, что можно было бы ожидать. Они всегда будут возвращать FALSE , потому что они сравнивают фактические адреса переменных и , а не то, на что они указывают . Чтобы добиться правильного эффекта, нужно было бы написатьip
jp
ip :=: REF INT(jp)
ip :=: REF INT(NIL)
Большинство «специальных» символов Algol (⊂, ≡, ␣, ×, ÷, ≤, ≥, ≠, ¬, ⊃, ≡, ∨, ∧, →, ↓, ↑, ⌊, ⌈, ⎩, ⎧, ⊥, ⏨, ¢, ○ и □) можно найти на клавиатуре IBM 2741 со вставленной печатающей головкой APL «гольф-мяч»; они стали доступны в середине 1960-х годов, когда разрабатывался ALGOL 68. Эти символы также являются частью стандарта Unicode , и большинство из них доступны в нескольких популярных шрифтах .
Transput — это термин, используемый для обозначения входных и выходных возможностей ALGOL 68. Он включает предопределенные процедуры для неформатированного, форматированного и двоичного transput. Файлы и другие устройства transput обрабатываются согласованным и машинно-независимым образом. Следующий пример выводит некоторый неформатированный вывод на стандартное выходное устройство:
print ((newpage, "Заголовок", newline, "Значение i равно ", i, "и x[i] есть ", x[i], новая строка))
Обратите внимание на предопределенные процедуры newpage
и newline
переданные в качестве аргументов.
ПЕРЕДАЧЕЙ считаются КНИГИ , КАНАЛЫ и ФАЙЛЫ :
match
.establish, create, open, associate, lock, close, scratch
.char number, line number, page number
.space
, backspace
, newline
, newpage
.get good line, get good page, get good book
, иPROC set=(REF FILE f, INT page,line,char)VOID:
on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error
:«Форматированный перенос» в переносе ALGOL 68 имеет свой собственный синтаксис и шаблоны (функции), с FORMAT , встроенным между двумя символами $. [50]
Примеры:
printf (($2l"Сумма равна:"x, g(0)$, m + n)); ¢ печатает то же самое, что и: ¢ print ((новая строка, новая строка, "Сумма равна:", пробел, целое (m + n, 0))
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) )КОНЕЦ
Примечание: советские компьютеры Эльбрус-1 (Эльбрус-1) и Эльбрус-2 были созданы с использованием языка высокого уровня Эль-76 (АЛ-76), а не традиционного ассемблера. Эль-76 напоминает Алгол-68, главное отличие — динамические типы связывания в Эль-76, поддерживаемые на аппаратном уровне. Эль-76 используется для приложений, управления заданиями, системного программирования. [54]
Оба языка ALGOL 68C и ALGOL 68-R написаны на ALGOL 68, что фактически делает ALGOL 68 приложением самого себя. Другие приложения включают:
Особенностью 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 года было написано: «Четыре достойных символа — «|», «_», «[» и «]» — часто кодируются по-разному, даже в установках, которые номинально используют один и тот же набор символов».
Представление | Код |
---|---|
Algol68 "строгий", как обычно публикуется | ¢ подчеркивание или жирный шрифт ¢ MODE XINT = INT ; XINT сумма sq:=0; FOR i WHILE сумма кв≠70×70 ДЕЛАТЬ сумма кв+:=i↑2 ОД |
Удаление цитат (например, викитекст ) | 'пр' цитата 'пр''режим' 'xint' = 'int';'xint' сумма sq:=0;«для» я «в то время как» сумма кв≠70×70'делать' сумма кв+:=i↑2'од' |
Для компилятора 7-битного символьного кода | . PR ВЕРХНИЙ .PRРЕЖИМ XINT = INT;XINT сумма sq:=0;НА ВРЕМЯ I сумма кв/=70*70ДЕЛАТЬ сумма кв+:=i**2ОД |
Для компилятора 6-битного символьного кода | . PR- ПОЧКА .PR
. РЕЖИМ .XINT = .INT;
. XINT SUM SQ:=0;
. ДЛЯ Я .ПОКА СУММА КВ. ПЛОЩАДЬ 70*70. ДЕЛАТЬ СУММА SQ .PLUSAB I .UP 2. ОД |
Algol68 с использованием RES- правки (зарезервированное слово) | . PR РЕЗ .PRрежим .xint = int;. xint сумма sq:=0;для меня пока сумма кв≠70×70делать сумма кв+:=i↑2од |
ALGOL 68 позволяет каждому естественному языку определять свой собственный набор ключевых слов Algol-68. В результате программисты могут писать программы, используя ключевые слова из своего родного языка. Ниже приведен пример простой процедуры, которая вычисляет "следующий день", код на двух языках: английском и немецком. [ необходима цитата ]
# Дата следующего дня - английский вариант # MODE DATE = STRUCT ( INT день, STRING месяц, INT год); PROC следующий день = ( DATE x) ДАТА : IF день x < длина месяца (месяц x , год x ) THEN (день x + 1, месяц x , год x ) ELIF месяц x = "Декабрь" THEN (1, "Январь", год x + 1) ELSE (1, следующий за месяцем (месяц x ), год x ) FI ;
# Nachfolgetag - Deutsche Variante # MENGE DATUM = TUPEL ( тег GANZ , WORT monat, GANZ jahr); FUNKTION naechster tag nach = ( DATUM x) DATUM : WENN tag VON x < monatslaenge(monat VON x, jahr VON x) DANN (tag VON x + 1, monat VON x, jahr VON x) WENNABER monat VON x = "Декабрь" ДАНН (1, "Январь", яр VON x + 1) ANSONSTEN (1, nachfolgemonat(monat VON x), jahr VON x) ENDEWENN ;
Русский/советский пример: в английском языке оператор case в Algol68 выглядит так: CASE ~ IN ~ OUT ~ ESAC , в кириллице это выглядит так: выб ~ в ~ либо ~ быв .
За исключением особо оговоренных случаев (с верхним индексом ), язык, описанный выше, соответствует языку «Пересмотренного отчета (r1) ».
Исходный язык (согласно "Final Report" r0 ) отличается синтаксисом режима cast , и он имел функцию proceduring , т.е. приведение значения терма к процедуре, которая оценивает терм. Proceduring был предназначен для того, чтобы сделать оценки ленивыми . Наиболее полезным применением могла бы быть сокращенная оценка булевых операторов. В:
OP ANDF = ( BOOL a, PROC BOOL b) BOOL :(a | b | ЛОЖЬ ); OP ORF = ( BOOL a, PROC BOOL b) BOOL :(a | ИСТИНА | b);
b оценивается только в том случае, если a истинно.
Как определено в ALGOL 68, это не работало так, как ожидалось, например, в коде:
ЕСЛИ ЛОЖЬ И F CO proc bool: CO ( print ("Не следует выполнять"); ИСТИНА ) ТОГДА ...
Вопреки наивным ожиданиям программистов, печать будет выполнена, поскольку это только значение разработанного вложенного предложения после ANDF , которое было обработано. Текстовая вставка закомментированного PROC BOOL : заставляет это работать.
Некоторые реализации имитируют ожидаемое поведение для этого особого случая путем расширения языка.
До пересмотра программист мог решить, что аргументы процедуры должны оцениваться последовательно, а не параллельно, используя точки с запятой вместо запятых ( gomma s).
Например, в:
PROC тест = ( REAL a; REAL b) :......тест (x ПЛЮС 1, x);
Первый аргумент для проверки гарантированно будет оценен раньше второго, но в обычном порядке:
PROC тест = ( REAL a, b) :......тест (x ПЛЮС 1, x);
затем компилятор может оценивать аргументы в любом удобном ему порядке.
После пересмотра отчета были предложены некоторые дополнения к формулировкам для расширения сферы применения:
ENVIRON
и USING
из ALGOL 68C [59]До сих пор в Algol 68 Genie реализована лишь частичная параметризация.
Имя | Год | Цель | Состояние | Описание | Целевой ЦП | Лицензирование | Язык реализации |
---|---|---|---|---|---|---|---|
Обобщенный АЛГОЛ | 1962 | Научный | НЛД | АЛГОЛ для обобщенных грамматик | |||
АЛГОЛ Y Y | 1966 | Проект предложения | Международный | Первая версия Алгола 68 | Спецификация | АКМ | |
АЛГОЛ 68 ДР | 1968 | Проект предложения | Международный | Проект отчета IFIP WG 2.1 | Спецификация – март | АКМ | |
АЛГОЛ 68 р0 | 1968 | Стандарт | Международный | Заключительный отчет рабочей группы IFIP WG 2.1 | Спецификация – август | АКМ | |
АЛГОЛ 68-Р Р | 1970 | Военный | Великобритания | МКЛ 1900 | АЛГОЛ 60 | ||
ЭПОС АЛГОЛ Э | 1971 | Научный | |||||
АЛГОЛ 68RS RS | 1972 | Военный | Великобритания | Портативная система компиляции | ICL 2900/Серия 39, Multics, VMS и генератор C (1993) | Авторские права короны | АЛГОЛ 68RS |
Алгол 68 с областями | 1972 | Экспериментальное и другое | Великобритания | Добавление областей к Алголу 68 | |||
Мини АЛГОЛ 68 | 1973 | Исследовать | НЛД | "Интерпретатор простых программ на языке Algol 68" Архивировано 18 июля 2011 г. на Wayback Machine | Портативный переводчик | Математический центр | АЛГОЛ 60 |
ОРЕГАНО | 1973 | Исследовать | НАС | «Важность моделей внедрения». | Калифорнийский университет в Лос-Анджелесе | ||
АЛГОЛ 68С С | 1975 | Научный | Великобритания | Кембридж Алгол 68 | ICL , IBM 360, PDP 10 и Unix, Telefunken , Tesla и Z80 (1980) [61] | Кембридж | АЛГОЛ 68С |
ALGOL 68 Пересмотренный отчет r1 | 1975 | Стандарт | Международный | Пересмотренный отчет рабочей группы IFIP WG 2.1 | Спецификация | АКМ | |
Алгол H H | 1975 | Экспериментальное и другое | Великобритания | Предлагаемые расширения системы мод Алгола 68 | Спецификация | АЛГОЛ В | |
Одра Алгол 68 | 1976 | практическое использование | Советский Союз / Польша | Одра 1204/IL | советский | АЛГОЛ 60 | |
Оклахома АЛГОЛ 68 | 1976 | инструкция по программированию | США | Реализация в Университете штата Оклахома [62] | IBM 1130 и System/370 /158 | Неизвестный | ANSI Фортран 66 . |
Берлин АЛГОЛ 68 | 1977 | Исследовать | ДЕ | «Берлинская реализация ALGOL 68» и [63] | Абстрактная машина ALGOL 68 – машинно-независимый компилятор | Технический университет Берлина | КДЛ 2 |
ФЛАКК Ф | 1977 | Многоцелевой | МОЖЕТ | Пересмотренный отчет о полной реализации с функциями отладки | Система/370 | аренда, Chion Corporation | Ассемблер |
АЛГОЛ 68-РТ РТ | 1979 | Научный | Великобритания | Параллельный АЛГОЛ 68-Р | |||
RS Алгол rs | 1979 | Научный | Великобритания | ||||
АЛГОЛ 68+ | 1980 | Научный | НЛД | Предложенный суперязык АЛГОЛ 68 [64] | |||
М-220 АЛГОЛ 68 | Советский Союз | М-220 | советский | ЭПСИЛОН | |||
Ленинград АЛГОЛ 68 Л | 1980 | Телекоммуникации | Советский Союз | Полный язык + модули | IBM, DEC, CAMCOH, PS 1001 и ПК | советский | |
Интерактивный АЛГОЛ 68 I | 1983 | Великобритания | Инкрементная компиляция | ПК | Некоммерческое условно-бесплатное программное обеспечение | ||
АЛГОЛ 68С С | 1985 | Научный | Международный | Версия ALGOL 68 для Sun | Sun-3 , Sun SPARC (под SunOS 4.1 и Solaris 2), Atari ST (под GEMDOS ), Acorn Archimedes (под RISC OS ), VAX-11 под Ultrix-32 | ||
Algol68toC [65] (ctrans) | 1985 | Электроника | Великобритания | ctrans от ELLA ALGOL 68RS | Портативный генератор С | Программное обеспечение с открытым исходным кодом 1995 | АЛГОЛ 68RS |
МК2 Интерактивный АЛГОЛ 68 | 1992 | Великобритания | Инкрементная компиляция | ПК | Некоммерческое условно-бесплатное программное обеспечение [66] | ||
Алгол 68 Джинн G | 2001 | Полный язык | НЛД | Включает стандартное положение о залоге | Портативный переводчик | GNU GPL | С |
Algol 68 Genie версии 2.0.0 | 2010 | Полный язык | НЛД | Портативный интерпретатор; дополнительная компиляция выбранных модулей | GNU GPL | С |
Язык S3 , который использовался для написания операционной системы ICL VME и многих других системных программ на компьютерах серии ICL 2900, был прямым производным от Algol 68. Однако в нем отсутствовали многие из наиболее сложных функций, а базовые режимы были заменены набором типов данных, которые напрямую соответствовали архитектуре оборудования серии 2900.
ALGOL 68R от RRE был первой реализацией подмножества ALGOL 68, работающей на ICL 1900. Основываясь на исходном языке, основными ограничениями подмножества были определение перед использованием и отсутствие параллельной обработки. Этот компилятор был популярен в университетах Великобритании в 1970-х годах, где многие студенты компьютерных наук изучали ALGOL 68 как свой первый язык программирования; компилятор был известен хорошими сообщениями об ошибках.
ALGOL 68RS (RS) от RSRE был переносимой системой компилятора, написанной на ALGOL 68RS (на основе ALGOL 68R) и реализованной на различных системах, включая ICL 2900 / Series 39 , Multics и DEC VAX/VMS . Язык был основан на Revised Report, но с похожими ограничениями подмножества, как у ALGOL 68R. Этот компилятор сохранился в виде компилятора Algol68-to-C.
В ALGOL 68S (S) из Университета Карнеги-Меллона мощность параллельной обработки была улучшена путем добавления ортогонального расширения eventing . Любое объявление переменной, содержащее ключевое слово EVENT, делало назначения этой переменной доступными для параллельной оценки, т.е. правая часть была преобразована в процедуру, которая была перемещена на один из процессоров многопроцессорной системы C.mmp . Доступ к таким переменным задерживался после завершения назначения.
Cambridge ALGOL 68C (C) был переносимым компилятором, который реализовал подмножество ALGOL 68, ограничив определения операторов и исключив сборку мусора, гибкие строки и форматированный перенос.
Algol 68 Genie (G) М. ван дер Вира — это реализация ALGOL 68 для современных компьютеров и операционных систем.
«Несмотря на благие намерения, программист может нарушить переносимость, непреднамеренно применив локальное расширение. Чтобы защититься от этого, каждая реализация должна предоставлять параметр прагмата PORTCHECK. Пока этот параметр действует, компилятор выводит сообщение для каждой конструкции, которую он распознает как нарушающую некоторое ограничение переносимости». [67]
{{cite book}}
: |journal=
проигнорировано ( помощь ){{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка ){{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка )