АЛГОЛ 68 - ALGOL 68

АЛГОЛ 68
Algol68RevisedReportCover.jpg
Пересмотренный отчет по алгоритмическому языку - Algol 68 Под редакцией: A. van Wijngaarden et al, сентябрь 1973 г.
Парадигмы Мультипарадигма : параллельная , императивная
Семья АЛГОЛ
Разработано A. van Wijngaarden , BJ Mailloux , JEL Peck и CHA Koster , et al.
Впервые появился Заключительный отчет: 1968 г . ; 53 года назад r0 ( 1968 )
Стабильный выпуск
Algol 68 / RR / Revised Report: 1973 ; 48 лет назад r1 ( 1973 )
Печатная дисциплина статический , прочный , безопасный , структурный
Сфера Лексический
Основные реализации
ALGOL 68C , Algol 68 Genie (недавний), ALGOL 68-R , ALGOL 68RS , ALGOL 68S , FLACC , Алгол 68 Ленинград / Ленинградское отделение , Odra ALGOL 68
Диалекты
АЛГОЛ 68 / FR (Заключительный отчет r0 )
Под влиянием
АЛГОЛ 60 , АЛГОЛ Y
Под влиянием
C , C ++ , оболочка Bourne , KornShell , Bash , Steelman , Ada , Python , Seed7 , Mary , S3

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

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

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

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

Обзор

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

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

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

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

ЦДХ Костер

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

  1. Полнота и ясность описания
  2. Ортогональность дизайна
  3. Безопасность
  4. Эффективность:
    • Проверка статического режима
    • Анализ, не зависящий от режима
    • Самостоятельная компиляция
    • Оптимизация цикла
    • Представления - в минимальных и больших наборах символов

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

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

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

Хотя европейские оборонные агентства (в Великобритании Royal Signals and Radar Establishment (RSRE)) продвигали использование Алгола 68 для достижения ожидаемых преимуществ безопасности, американская сторона альянса НАТО решила разработать другой проект, язык Ada , сделав его использование обязательным. для оборонных контрактов США.

Алгол 68 также имел заметное влияние в Советском Союзе , подробности о котором можно найти в статье Андрея Ершова 2014 года: «Алгол 68 и его влияние на программирование в СССР и России» и «Алгол 68 и его влияние на программирование в». СССР и России ".

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

Полную историю проекта можно найти в книге CH Lindsey 's A History of ALGOL 68 .

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

История

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

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

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

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

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

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

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

Публикация

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

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

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

Реализации

АЛГОЛ 68-R

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

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

Другие

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

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

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

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

Лента новостей

Год Мероприятие Автор
Март 1959 г. Бюллетень ALGOL, выпуск 1 (первый) Питер Наур / ACM
Февраль 1968 г. Опубликован проект отчета (DR) Рабочая группа 2.1 ИФИП
Март 1968 г. Заключительный отчет по Алгол 68 r0 представлен на встрече в Мюнхене Рабочая группа 2.1 ИФИП
Июнь 1968 г. Встреча в Тиррении, Италия Рабочая группа 2.1 ИФИП
Август 1968 г. Встреча в Норт-Бервике, Шотландия Рабочая группа 2.1 ИФИП
Декабрь 1968 г. АЛГОЛ 68 Заключительный отчет r0 представлен на встрече в Мюнхене Рабочая группа 2.1 ИФИП
Апрель 1970 г. Алгол 68-R (R) под GEORGE 3 на ICL 1907F Royal Signals и Radar Est.
Сентябрь 1973 г. Опубликован пересмотренный отчет на языке Algol 68 r1 Рабочая группа 2.1 ИФИП
1975 г. АЛГОЛ 68C (C) - переносимый компилятор (zcode VM ) С. Борн , Эндрю Биррелл и Майкл Гай
Июнь 1975 г. Г. Е. Хедрик и Алан Робертсон. Компилятор подмножества Алгола 68 штата Оклахома. 1975 Международная конференция по АЛГОЛу 68.
Июнь 1977 г. Конференция Strathclyde ALGOL 68, Шотландия ACM
Май 1978 г. Предложения по Алголу H - суперъязыку Алгола 68 А. П. Блэк, В. Дж. Рэйвард-Смит
1984 Полный компилятор ALGOL 68S (S) для Sun, SPARC и ПК CH Линдси и др., Манчестер
Август 1988 г. Бюллетень ALGOL, выпуск 52 (последний) Эд. CH Линдси / ACM
Май 1997 г. Algol68 S (S) опубликован в Интернете Чарльз Х. Линдси
Ноябрь 2001 Algol 68 Genie (G) опубликован в Интернете (с открытым исходным кодом GNU GPL) Марсель ван дер Веер

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

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

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

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

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

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

  • ГОСТ 27974-88 Язык программирования АЛГОЛ 68 - Язык программирования АЛГОЛ 68
  • ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный - Язык программирования АЛГОЛ 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 "@", eitherr0, is ":=:", isnt  is notr0 ":/=:" ":≠:", of "→"r0, true, false, empty, nil "○", skip "~",
co "¢", comment "¢", pr, pragmat,
case ~ in ~ ouse ~ in ~ out ~ esac "( ~ | ~ |: ~ | ~ | ~ )",
for ~ from ~ to ~ by ~ while ~ do ~ od,
if ~ then ~ elif ~ then ~ else ~ fi "( ~ | ~ |: ~ | ~ | ~ )",
par begin ~ end "( ~ )", go to, goto, exit "."r0.

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

Базовая языковая конструкция - это единица . Единицей может быть формула , заключенное предложение , обычный текст или одна из нескольких технически необходимых конструкций (присваивание, переход, пропуск, nihil). Термин техническая заключенной оговорка унифицирует некоторые из неотъемлемо Брекетинга конструкций , известных как блок , сделать заявление , переключатель заявление в других современных языках. Когда используются ключевые слова, обычно обратная последовательность символов вводящего ключевого слова используется для завершения вложения, например ( if ~ then ~ else ~ fi , case ~ in ~ out ~ esac , for ~ while ~ do ~ od ). Этот синтаксис защищенной команды был повторно использован Стивеном Борном в общей оболочке Unix Bourne . Выражение также может давать множественное значение , которое создается из других значений дополнительным условием . Эта конструкция выглядит как пакет параметров вызова процедуры.

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

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

int n = 2;
co n is fixed as a constant of 2. co
int m := 3;
co m is a newly created local variable whose value is initially set to 3. co
co    This is short for ref int m = loc int := 3; co
real avogadro = 6.0221415⏨23; co Avogadro's number co
long long real long long pi = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510;
compl square root of minus one = 0 ⊥ 1;

Однако объявление real x;- всего лишь синтаксический сахар для . То есть на самом деле это постоянный идентификатор для ссылки на вновь созданную локальную действительную переменную. ref real x = loc real;x

Более того, вместо того, чтобы определять floatи double, или, intи longи shortт. Д., АЛГОЛ 68 предоставляет модификаторы , так что, например, текущее общее doubleбудет записано как long real или long long real , например. Константы prelude max real и min long intпредназначены для адаптации программ к различным реализациям.

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

примитив-декларатор: int , реальный , компл , комплексный G , bool , char , строка , биты , байты , формат , файл , канал G , канал , сема

  • биты - "упакованный вектор" типа bool .
  • bytes - «упакованный вектор» char .
  • string - гибкий массив символов .
  • Сема - это сема phore , который может быть инициализирован с оп Erator уровня .

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

  • ref mode - ссылка на значение типа mode , аналогично & в C / C ++ и ref в Pascal
  • struct - используется для построения структур, таких как struct в C / C ++ и запись в Pascal
  • union - используется для создания объединений, как в C / C ++ и Pascal
  • proc - используется для указания процедур, таких как функции в C / C ++ и процедуры / функции в Pascal

Для некоторых примеров см. Сравнение АЛГОЛА 68 и C ++ .

Другие символы объявления включают: flex , heap , loc , ref , long , short , event S

  • flex - объявить массив гибким, т.е. он может увеличиваться в длину по запросу.
  • куча - выделить переменной немного свободного места из глобальной кучи.
  • loc - выделить переменной немного свободного места в локальном стеке.
  • долго - объявить Int , реальное или компл быть из длинного размера эр.
  • Короче говоря - провозгласить ИНТ , реальным или компл быть из короткого размера эр.

Имя для режима (типа) может быть объявлено с помощью объявления режима , которое похоже на typedef в C / C ++ и набирает в 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];

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

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

 mode A = ref A
 mode A = struct (A a, B b)
 mode A = proc (A a) A

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

 mode A = struct (ref A a, B b)
 mode A = proc (ref A a) ref A

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

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

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

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

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

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

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

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

Также:

  • Фактические параметры вызовов, как "~" в:PROC: sin(~)
  • Заключенные предложения приведения, как "~" в: REAL(~)
  • Единицы рутинных текстов
  • Заявления, признающие недействительными
  • Все части (кроме одной) сбалансированной статьи
  • Одна сторона отношения идентичности, как "~" в: ~ IS ~
разрушение
Все мягкое, затем слабое разыменование (разыменование или депрокидирование, получение имени)
Все слабое, а затем разыменование (разыменование или разрушение)
Все кроткие, затем единица
Затем все твердое расширение, гребля или мочеиспускание

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

INT to LONG INT
INT to REAL
REAL to COMPL
BITS to []BOOL
BYTES to STRING

Переменная также может быть преобразована в массив длиной 1.

Например:

INT to [1]INT
REAL to [1]REAL
и т.п.
Фирма
  • Операнды формул как "~" в:OP: ~ * ~
  • Параметры транзитных звонков
Пример:

UNION(INT,REAL) var := 1

Кроткий
  • Тримскрипты (дающие ИНТ)
  • Запросы: например, как "~" в следующих

IF ~ THEN ... FI а также FROM ~ BY ~ TO ~ WHILE ~ DO ... OD etc

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

Дополнительные сведения о первичных, вторичных, третичных и четвертичных компонентах см. В разделе «Приоритет операторов» .

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

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

pragmat heap=32 pragmat
pr heap=32 pr

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

¢ The original way of adding your 2 cents worth to a program ¢
comment "bold" comment comment
co Style i comment co
# Style ii comment #
£ This is a hash/pound comment for a UK keyboard £

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

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

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

 real half pi, one pi; one pi := 2 * ( half pi := 2 * arc tan(1) )

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

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

 (int sum := 0; for i to n do sum +:= f(i) od; sum)

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

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

  • если пункты выбора:
 if condition then statements [ else statements ] fi
 "brief" form:  ( condition | statements | statements )
 if condition1 then statements elif condition2 then statements [ else statements ] fi
 "brief" form:  ( condition1 | statements |: condition2 | statements | statements )

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

  • условия выбора случая :
 case switch in statements, statements,... [ out statements ] esac
 "brief" form:  ( switch | statements,statements,... | statements )
 case switch1 in statements, statements,... ouse switch2 in statements, statements,... [ out statements ] esac
 "brief" form of case statement:  ( switch1 | statements,statements,... |: switch2 | statements,statements,... | statements )

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

proc days in month = (int year, month)int:
  (month|
    31,
    (year÷×4=0 ∧ year÷×100≠0  ∨  year÷×400=0 | 29 | 28 ),
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  );

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

proc days in month = (int year, month)int:
  case month in
    31,
    if year mod 4 eq 0 and year mod 100 ne 0  or  year mod 400 eq 0 then 29 else 28 fi,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  esac;

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

proc days in month = (int year, month)int:
  case month in
¢Jan¢ 31,
¢Feb¢ ( year mod 4 = 0 and year mod 100 ≠ 0  or  year mod 400 = 0 | 29 | 28 ),
¢Mar¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ to Dec. ¢
  esac;

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

  • предложение цикла do :
 [ for index ] [ from first ] [ by increment ] [ to last ] [ while condition ] do statements od
 The minimum form of a "loop clause" is thus: do statements od

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

for i from 1 by -22 to -333 while i×i≠4444 do ~ od

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

  • только сделать \ од часть является обязательной, и в этом случае цикл будет повторять до бесконечности.
  • таким образом, положение на 100 у ~ О.Д. , будет перебирать только 100 раз.
  • в то время как «синтаксический элемент» позволил программисту отдохнуть от за петлю рано. например
int sum sq:=0;
for i
while
  print(("So far:",i,newline));
  sum sq≠70↑2
do
  sum sq+:=i↑2
od

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

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

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

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

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

 mode vector = [1:3]    real;   # vector mode declaration (typedef)  #
 mode matrix = [1:3,1:3]real;   # matrix mode declaration (typedef)  #
 vector v1  := (1,2,3);         # array variable initially (1,2,3)   #
 []real v2   = (4,5,6);         # constant array, type equivalent to vector, bounds are implied  #
 op + = (vector a,b) vector:    # binary operator definition         #
   (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:]));              # a slice of the 2nd and 3rd columns #

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

 ref vector row = m[2,];  # define a ref (pointer) to the 2nd row #
 ref vector col = m[,2];  # define a ref (pointer) to the 2nd column #

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

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

 mode node = union (void, real, int, compl, string),
      list = struct (node val, ref list next);

Пример использования для накидной случае из узла :

Algol68 r0 как в Заключительном отчете 1968 г.
 node n := "1234";
 real r; int i; compl c; string s
 case r,i,c,s::=n in
   print(("real:", r)),
   print(("int:", i)),
   print(("compl:", c)),
   print(("string:", s))
   out print(("?:", n))
 esac
Algol68 r1, как в Пересмотренном отчете 1973 г.
 node n := "1234";
 # or n := EMPTY; #
  case n in
   (void):     print(("void:", "EMPTY")),
   (real r):   print(("real:", r)),
   (int i):    print(("int:", i)),
   (compl c):  print(("compl:", c)),
   (string s): print(("string:", s))
   out         print(("?:", n))
 esac

proc: процедуры

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

 proc max of real = (real a, b) real:
    if a > b then a else b fi;

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

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

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

 proc apply = (ref [] real a, proc (real) real f):
  
    for i from lwb a to upb a do a[i] := f(a[i]) od

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

op: Операторы

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

 prio max = 9;
  
 op max = (int a,b) int: ( a>b | a | b );
 op max = (real a,b) real: ( a>b | a | b );
 op max = (compl a,b) compl: ( abs a > abs b | a | b );
  
 op max = ([]real a) real:
    (real out := a[lwb a];
     for i from lwb a + 1 to upb a do ( a[i]>out | out:=a[i] ) od;
     out)

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

ПРИО rity Операция r0 и r1 + Алгол68 r0 + Алгол68 G
Фактически 12
(Начальная школа)
разыменование, депроцедура (~, ~), индексирование [~], гребля [~,], нарезка [~: ~], обозначения размеров длинные и короткие производство каррирование (~ ,,,), diag , trnsp , row , col
Фактически 11
(Среднее)
of (выбор), loc & heap (генераторы) → (выбор) новые (генераторы)

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

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

ПРИО rity
(третичный)
Algol68 "Достойные персонажи" r0 & r1 + Алгол68 r0 и r1 + Алгол68 C, G + Алгол68 r0
10 не ~, вверх , вниз , lwb , upb ,

-, abs , arg , bin , entier , leng , level , odd , repr , round , short

¬, ↑, ↓, ⌊, ⌈ норма , след , t , det , inv lws , ups , ⎩, ⎧, btb , ctb

Диадические операторы с соответствующими приоритетами

ПРИО rity
(третичный)
Algol68 "Достойные персонажи" r0 & r1 + Алгол68 r0 и r1 + Алгол68 C, G + Алгол68 r0
9 + *, я + ×, ⊥ !
8 shl , shr , **, вверх , вниз , lwb , upb ↑, ↓, ⌊, ⌈ × ··· × , ^, lws , ups , ⎩, ⎧
7 *, /,%, больше ,% *, mod , elem ×, ÷, ÷ ×, ÷ *,% ×, □ ÷:
6 -, +
5 <, lt , <=, le ,> =, ge ,>, gt ≤, ≥
4 eq =, ne ~ = / = ≠, ¬ =
3 &, и / \
2 или \ /
1 минусаб , плюсаб , таймсаб , диваб , овераб , модаб , плюсто ,

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

×: =, ÷: =, ÷ ×: =, ÷ *: =,% ×: = минус , плюс , div , overb , modb , ÷ :: =, prus

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

  • Третичные категории включают имена nil и ○.
  • lws : В Algol68 r0 операторы lws и ⎩ ... оба возвращают истину, если нижнее состояние измерения массива фиксировано.
  • Операторы ups и ⎧ аналогичны для верхнего состояния .
  • Операторы lwb и upb автоматически доступны для объединений различных порядков (и режимов ) массивов. например. УПБ из союза ([] INT, [,] реальный, гибкий [,,,] голец)

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

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

ПРИО rity
(четвертичные)
Algol68 "Достойные персонажи" r0 & r1 + Алгол68 r0 и r1 + Алгол68 C, G, R + Алгол68 r0
Фактически 0 : =, is  : = :, isnt  : / =:: ~ = :, at @, ":", ";" : ≠:: ¬ =: : =: = C , =: = R .. = ,. =, ct , ::, ctab , :: =, .., не является , "..", ".,"

Примечание. Четвертичные числа включают имена skip и ~.

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

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

ref int ip, jp

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

ip = jp

будет разыменовывать оба указателя до значений типа int и сравнивать их, поскольку оператор "=" определен для int , но не для ref int . Это не законно , чтобы определить «=» для операндов типа исх междунар и междунар в то же время, потому что тогда вызовы становятся неоднозначными, из - за неявного принуждения , которые могут быть применены: если операнды оставить как исх междунар и этой версии оператор звонил? Или они должны быть разыменованы на int и вместо этого использовать эту версию? Следовательно, следующее выражение никогда не может быть признано законным:

ip = nil

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

ip :=: jp
ip :=: nil

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

ip :=: ref int(jp)
ip :=: ref int(nil)

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

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

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

transput: ввод и вывод

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

  print ((newpage, "Title", newline, "Value of i is ",
    i, "and x[i] is ", x[i], newline))

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

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

Transput считается из книг , каналов и файлов :

  • Книги состоят из страниц, строк и символов и могут иметь резервные копии файлов.
    • Определенную книгу можно найти по имени с помощью вызова match.
  • каналы соответствуют физическим устройствам. например, перфораторы для карт и принтеры.
    • Три стандартных каналов различают: стоять в канале, выделяются канал, отойти в сторону канала.
  • Файл является средством общения между программой и книгой , которая была открыта с помощью какого - либо канала.
    • Настроение файла может быть чтение, запись, голец, бен, и открыл.
    • Процедуры transput включают в себя: 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.

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

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

Примеры:

 printf (($2l"The sum is:"x, g(0)$, m + n)); ¢ prints the same as: ¢
 print ((new line, new line, "The sum is:", space, whole (m + n, 0))

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

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

int initial foot width = 5;
mode foot = struct(
   string name,
   sema width,
   bits toe ¢ packed vector of BOOL ¢
);
 
foot left foot:= foot("Left", level initial foot width, 2r11111),
     right foot:= foot("Right", level initial foot width, 2r11111);
 
¢ 10 round clip in a 1968 Colt Python .357 Magnum ¢
sema rounds = level 10;
 
¢ the Magnum needs more barrels to take full advantage of parallelism ¢
sema acquire target = level 1;
 
prio ∧:= = 1;
op ∧:= = (ref bits lhs, bits rhs)ref bits: lhs := lhs ∧ rhs;
 
proc shoot = (ref foot foot)void: (
  ↓acquire target;
  ↓rounds;
  print("BANG! ");
  ↓width → foot;
  toe → foot ∧:= ¬(bin 1 shl level width → foot);
  printf(($g": Ouch!! – "5(g)l$, name → foot, []bool(toe → foot)[bits width – initial foot width + 1:]));
  ↑acquire target
);
 
¢ do shooting in parallel to cater for someone hoping to stand on just one foot ¢
par (
  for toe to initial foot width do
    shoot (left foot)
  od, ¢ <= a comma is required ¢
  for toe to initial foot width do
    shoot(right foot)
  od
)

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

Образец кода

Этот пример программы реализует решето Эратосфена для поиска всех простых чисел , меньших 100. nil является аналогом нулевого указателя в Алголе 68 в других языках. Обозначения х из у обращается к членам х о в STRUCT у .

begin # Algol-68 prime number sieve, functional style #
  
  proc error = (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 filter = (proc (int) bool p, list l) list:
     if l is nil then nil
     elif p(hd(l)) then cons(hd(l), filter(p,tl(l)))
     else filter(p, tl(l))
     fi;
  
  proc sieve = (list l) list:
     if l is nil then nil
     else
        proc not multiple = (int n) bool: n mod hd(l) ≠ 0;
        cons(hd(l), sieve( filter( not multiple, tl(l) )))
     fi;
  
  proc primes = (int n) list: sieve( tl( one to(n) ));
  
  show( primes(100) )
end

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

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

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

Приложения

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

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

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

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

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

 int a real int = 3 ;

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

 int a real int = 3; # the strict language #
'INT'A REAL INT = 3; # QUOTE stropping style #
.INT A REAL INT = 3; # POINT stropping style #
 INT a real int = 3; # UPPER stropping style #
 int a_real_int = 3; # RES stropping style, there are 61 accepted reserved words #

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

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

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

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

  • Основные персонажи: «Достойные персонажи» - это подмножество «основных персонажей».

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

Представление Код
Algol68 "строгий",
как обычно публикуется
¢ подчеркнуть или
   жирный шрифт ¢
 режим  xint = int ;
 xint sum sq: = 0;
 для меня пока
   сумма кв ≠ 70 × 70
 делать
   сумма sq +: = i ↑ 2
 od
Расстановка цитат
(например, вики-текст )
'pr' quote 'pr'
'mode' 'xint' = 'int';
'xint' sum sq:=0;
'for' i 'while'
  sum sq≠70×70
'do'
  sum sq+:=i↑2
'od'
Для компилятора 7-битного символьного кода
.PR UPPER .PR
MODE XINT = INT;
XINT sum sq:=0;
FOR i WHILE
  sum sq/=70*70
DO
  sum sq+:=i**2
OD
Для компилятора 6-битного символьного кода
.PR POINT .PR
.MODE .XINT = .INT;
.XINT SUM SQ:=0;
.FOR I .WHILE
  SUM SQ .NE 70*70
.DO
  SUM SQ .PLUSAB I .UP 2
.OD
Algol68 с использованием res stpping
(зарезервированное слово)
.PR RES .PR
mode .xint = int;
.xint sum sq:=0;
for i while
  sum sq≠70×70
do
  sum sq+:=i↑2
od

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

 # Next day date - English variant #
 mode date = struct(int day, string month, int year);
 proc the day following = (date x) date:
      if day of  x < length of month (month of x, year of x)
      then (day of x + 1, month of x, year of x)
      elif month of x = "December"
      then (1, "January", year of x + 1)
      else (1, successor of month (month of x), year of x)
      fi;
 # Nachfolgetag - Deutsche Variante #
 menge datum = tupel(ganz tag, 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 = "Dezember"
          dann (1, "Januar", jahr von x + 1)
          ansonsten (1, nachfolgemonat(monat von x), jahr von x)
          endewenn;

Русский / советский пример: на английском языке оператор case в Algol68 читается как case ~ in ~ out ~ esac , на кириллице это читается как выб ~ в ~ либо ~ быв .

Некоторые Vanitas

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

skip, "~" or "?"C – an undefined value always syntactically valid,
empty – the only value admissible to void, needed for selecting void in a union,
void – syntactically like a mode, but not one,
nil or "○" – a name not denoting anything, of an unspecified reference mode,
() or specifically [1:0]int – a vacuum is an empty array (here specifically of mode []int).
undefined – a standards reports procedure raising an exception in the runtime system.
ℵ – Used in the standards report to inhibit introspection of certain types. e.g. sema

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

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

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

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

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

§10.3.2.2. Transput modes
a) modesimplout = union (≮ℒ int≯, ≮ℒ real≯, ≮ℒ compl≯, bool, ≮ℒ bits≯,
           char, [ ] char);
b) modeouttype = ¢ an actual – declarer specifying a mode united
   from a sufficient set of modes none of which is 'void' or contains 'flexible',
   'reference to', 'procedure' or 'union of' ¢;
c) modesimplin = union (≮ref ℒ int≯, ≮ref ℒ real≯, ≮refcompl≯, ref bool,
           ≮ref ℒ bits≯, ref char, ref [ ] char, ref string);
d) modeintype = ¢ ... ¢;
 
§10.3.2.3. Straightening
a) opstraightout = (outtype x) [ ] simplout: ¢ the result of "straightening" 'x' ¢;
b) opstraightin = (intype x) [ ] simplin: ¢ the result of straightening 'x' ¢;

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

Редакции

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

Язык неотредактированного отчета

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

op andf = (bool a,proc bool b)bool:(a | b | false);
op orf = (bool a,proc bool b)bool:(a | true | b);

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

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

if false andf co proc bool: co ( print ("Should not be executed"); true)
then ...

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

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

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

Например в:

proc test = (real a; real b) :...
...
test (x plus 1, x);

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

proc test = (real a, b) :...
...
test (x plus 1, x);

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

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

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

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

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

Истинная спецификация и сроки реализации Алгола 68s

Имя Год Цель Состояние Описание Целевой ЦП Лицензирование Язык реализации
Обобщенный АЛГОЛ 1962 г. Научный NL АЛГОЛ для обобщенных грамматик
АЛГОЛ Y Y 1966 г. Проект предложения Intl Первая версия Algol 68 Технические характеристики ACM
АЛГОЛ 68 DR 1968 г. Проект предложения Intl Проект отчета РГ 2.1 ИФИП Спецификация - март ACM
АЛГОЛ 68 r0 1968 г. Стандарт Intl Итоговый отчет РГ 2.1 ИФИП Уточнение - август ACM
АЛГОЛ 68-R R 1970 г. Военный Соединенное Королевство ICL 1900 АЛГОЛ 60
EPOS АЛГОЛ E 1971 г. Научный
АЛГОЛ 68RS RS 1972 г. Военный Соединенное Королевство Переносимая система компиляции ICL 2900 / Series 39, Multics, генератор VMS & C (1993) Корона Авторские права АЛГОЛ 68RS
Алгол 68 с областями 1972 г. Экспериментальные и другие Соединенное Королевство Добавление областей в Алгол 68
Мини АЛГОЛ 68 1973 Исследовать NL "Интерпретатор простых программ на языке Algol 68" Портативный переводчик Mathematisch Centrum АЛГОЛ 60
ОРЕГАНО 1973 Исследовать нас «Важность моделей реализации». UCLA
АЛГОЛ 68C C 1975 г. Научный Соединенное Королевство Кембриджский язык 68 ICL , IBM 360, PDP 10 и Unix, Telefunken , Tesla и Z80 (1980) Кембридж АЛГОЛ 68C
АЛГОЛ 68 Пересмотренный отчет r1 1975 г. Стандарт Intl Пересмотренный отчет РГ 2.1 ИФИП Технические характеристики ACM
Алгол H H 1975 г. Экспериментальные и другие Соединенное Королевство Предлагаемые расширения системы режимов Algol 68 Технические характеристики АЛГОЛ W
Одра Алгол 68 1976 г. практическое использование СССР / Польша Одра 1204 / IL Советский АЛГОЛ 60
Оклахома АЛГОЛ 68 1976 г. инструкция по программированию Соединенные Штаты Америки Внедрение Университета штата Оклахома IBM 1130 и System / 370/158 Неизвестный ANSI Fortran 66 .
Берлинский АЛГОЛ 68 1977 г. Исследовать DE «Реализация Берлинского АЛГОЛА 68» & Абстрактная машина на Алголе 68 - машинно-независимый компилятор Технический университет Берлина CDL 2
FLACC F 1977 г. Многоцелевой CA Завершенная реализация обновленного отчета с функциями отладки Система / 370 аренда, Chion Corporation Ассемблер
АЛГОЛ 68-РТ РТ 1979 г. Научный Соединенное Королевство Параллельный АЛГОЛ 68-R
RS Algol RS 1979 г. Научный Соединенное Королевство
АЛГОЛ 68+ 1980 г. Научный NL Предлагаемый суперъязык Алгола 68
M-220 АЛГОЛ 68 СССР М-220 Советский ЭПСИЛОН
Ленинградский АЛГОЛ 68 Л 1980 г. Телекоммуникации СССР Полный язык + модули IBM, DEC, CAMCOH, PS 1001 и ПК Советский
Интерактивный АЛГОЛ 68 I 1983 г. Соединенное Королевство Инкрементальная компиляция ПК Некоммерческое условно-бесплатное ПО
АЛГОЛ 68S S 1985 г. Научный Intl Солнечная версия АЛГОЛА 68 Sun-3 , Sun SPARC (под SunOS 4.1 и Solaris 2), Atari ST (под GEMDOS ), Acorn Archimedes (под RISC OS ), VAX-11 под Ultrix-32
Algol68toC (ctrans) 1985 г. Электроника Соединенное Королевство ctrans из ELLA ALGOL 68RS Портативный генератор C  Программное обеспечение с открытым исходным кодом 1995 г. АЛГОЛ 68RS
MK2 Интерактивный АЛГОЛ 68 1992 г. Соединенное Королевство Инкрементальная компиляция ПК Некоммерческое условно-бесплатное ПО
Алгол 68 Genie G 2001 г. Полный язык NL Включает стандартную оговорку о залоге Портативный переводчик GPL C
Алгол 68 Genie версии 2.0.0 2010 г. Полный язык NL Портативный переводчик; необязательная компиляция выбранных единиц GPL C

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

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

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

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

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

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

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

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

Цитаты

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

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

использованная литература

Цитаты

Процитированные работы

  • Брейлсфорд, Д. Ф. и Уокер, А. Н., Введение в программирование на Алголе 68 , Эллис Хорвуд / Уайли, 1979 г.
  • Линдси, С.Х. и ван дер Мейлен, С.Г., Неформальное введение в АЛГОЛ 68 , Северная Голландия, 1971 г.
  • Линдси, CH (1993-03-02). «История АЛГОЛА 68». Уведомления ACM SIGPLAN . 28 (3): 97–132. DOI : 10.1145 / 155360.155365 .
  • McGettrick, AD, АЛГОЛ 68, Первый и Второй курс , Cambridge Univ. Пресса, 1978
  • Пек, JEL, партнер по Алголу 68 , Univ. Британской Колумбии, октябрь 1971 г.
  • Таненбаум, А.С., Учебное пособие по АЛГОЛУ 68 , Computing Surveys 8 , 155-190, июнь 1976 и 9 , 255-256, сентябрь 1977, [9]
  • Woodward, PM и Бонд, SG, Алгол 68-R Users SIC Guide , Лондон, Ее Величества, в 1972

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