АЛГОЛ 68

редактировать
Язык программирования

АЛГОЛ 68
Пересмотренный отчет по алгоритмическому языку - Алгол 68 Редактор: A. van Wijngaarden et al. al, сентябрь 1973 г.
Парадигмы Мультипарадигма : одновременный, императивный
СемействоАЛГОЛ
Разработано А. ван Вейнгаарден, Б. Ж. Майю, Ж. Э. Л. Пек и К. Х. А. Костер и др.
Впервые появилосьЗаключительный отчет: 1968; 52 года назад (1968 г.)
Стабильный выпуск Algol 68 / RR / Revised Report: 1973; 47 лет назад (1973)
Дисциплина набора текста статический, сильный, безопасный, структурный
Объем Лексический
Основные реализации
ALGOL 68C, Algol 68 Genie (недавний), ALGOL 68-R, ALGOL 68RS, ALGOL 68S, FLACC, Алгол 68 Ленинград / Ленинградская часть, Одра АЛГОЛ 68
Диалекты
АЛГОЛ 68 / FR (Итоговый отчет)
Под влиянием
АЛГОЛ 60, АЛГОЛ Y
Под влиянием
C,C ++, Bourne shell, KornShell, Bash, Steelman, Ada, Python, Seed7, Мэри, S3

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

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

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

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

Содержание

  • 1 Обзор
  • 2 История
    • 2.1 Происхождение
    • 2.2 Процесс определения
    • 2.3 Публикация
    • 2.4 Реализации
      • 2.4.1 Алгол 68-R
      • 2.4.2 Другое
    • 2.5 Временная шкала
    • 2.6 Алгоритмический язык Отчеты ALGOL 68
    • 2.7 График стандартизации
  • 3 Примечательные языковые элементы
    • 3.1 Жирные символы и зарезервированные слова
    • 3.2 Единицы: Выражения
    • 3.3 Режим: Объявления
    • 3.4 Принуждение: приведение
      • 3.4.1 Иерархия принуждения с примерами
    • 3.5 pr & co: Прагматики и комментарии
    • 3.6 Выражения и составные операторы
    • 3.7 struct, union & [:]: Структуры, объединения и массивы
    • 3.8 proc: процедуры
    • 3.9 op: Operators
      • 3.9.1 Операции с массивами, процедурами, разыменованием и принуждением
      • 3.9.2 Монадические операторы
      • 3.9.3 Диадические операторы со связанными приоритетами
      • 3.9.4 Отношения присвоения и идентичности и т. Д.
      • 3.9.5 Специальный символ cters
    • 3.10 transput: ввод и вывод
      • 3.10.1 Книги, каналы и файлы
      • 3.10.2 форматированный перенос
    • 3.11 par: Параллельная обработка
  • 4 Примеры использования
    • 4.1 Пример кода
    • 4.2 Операционные системы, написанные на ALGOL 68
    • 4.3 Приложения
    • 4.4 Библиотеки и API
  • 5 Представление программы
    • 5.1 Пример различных представлений программы
  • 6 Некоторые Vanitas
  • 7 Сравнение с другими языки
  • 8 Редакции
    • 8.1 Язык неотредактированного отчета
    • 8.2 Предложения по расширению от IFIP WG 2.1
    • 8.3 Настоящая спецификация и сроки реализации ALGOL 68
    • 8.4 Расширения для конкретной реализации
  • 9 Цитаты
  • 10 См. Также
  • 11 Ссылки
    • 11.1 Цитаты
    • 11.2 Процитированные работы
  • 12 Внешние ссылки

Обзор

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

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

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

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

С. HA Koster

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

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

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

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

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

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

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

Стив Борн, который был в ревизионной комиссии Алгола 68, перенес некоторые из его идей в свой Оболочка Борна (и, таким образом, для потомков оболочек Unix, таких как Bash ) и до C (и, таким образом, для потомков, таких как C ++ ).

Полную историю проекта можно найти в C. История Алгола 68 Х. Линдси.

Полное описание языка см. В «Программировании Алгола 68 стало проще» доктора Сиан Маунтбаттен или «Изучение Алгола 68 Джинн». "Марселя ван дер Вира, который включает Пересмотренный отчет.

История

Истоки

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

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

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

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

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

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

Публикация

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

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

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

Реализации

ALGOL 68-R

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

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

Others

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

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

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

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

Временная шкала

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

Алгоритмический язык Алгол 68 Отчеты

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

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

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

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

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

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

Важные элементы языка

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

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

mode, op, prio, proc, flex, heap, loc, long, ref, short, биты, bool, байты, char, comp, int, реальный, sema, строка, void, канал, файл, format, struct, union, at"@", либо, is": =:", isntне": / =:" ": ≠:", из"→", истина, ложь, пусто, nil"○", skip"~", co"¢", комментарий"", pr, pragmat, case~ in~ ouse~ in~ out~ esac"(~ | ~ |: ~ | ~ | ~) ", для~ из~ to~ by~ в то время как~ do~ od, if~ затем~ elif~ затем~ else~ fi"(~ | ~ |: ~ | ~ | ~)", parbegin~ end"(~)", перейти к, goto, exit".".

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

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

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

Основные типы данных (называемые режимомна языке Algol 68) являются реальными, int, comp(комплексное число ), bool, char, битыи байт. Например:

intn = 2; con фиксируется как константа 2. cointm: = 3; com - вновь созданная локальная переменная, значение которой изначально установлено равным 3. cocoЭто сокращение от ref int m = loc int: = 3; coреальныйavogadro = 6,0221415⏨23; coчисло Авогадро coдлинное длинное вещественное числодлинное длинное pi = 3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510; комплквадратный корень из минус единицы = 0 1;

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

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

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

примитив-декларатор: int, real, comp, complex, bool, char, строка, биты, байты, формат, файл, pipe, channel, sema

  • биты- «упакованный вектор» bool.
  • bytes- «упакованный вектор» char.
  • string- flexible массив из char.
  • sema- semaphore который может быть инициализирован с помощью operator level.

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

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

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

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

  • flex- объявляем массив гибким, т.е. он может увеличиваться в длину по запросу.
  • heap- выделять переменную некоторую свободное пространство из глобальной кучи.
  • loc- выделить переменной некоторое свободное пространство в локальном стеке.
  • long- объявить int, realили Compиметь размер longer.
  • short- объявить int, realили Complдолжен иметь размер shorter.

Имя режима (типа) может быть объявлено с помощью объявления mode, аналогичного typedefв C / C ++ и typeв Pascal:

intmax = 99; режимnewmode = [0: 9] [0: max] struct(longreala, b, c, shortinti, j, k, refrealr);

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

const int max = 99; typedef struct {двойной a, b, c; короткие i, j, k; float * r; } новый режим [9 + 1] [макс + 1];

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

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

modeA = refA modeA = struct(A a, B b) modeA = proc(A a) A

, если они действительны:

modeA = struct(refA a, B b) modeA = proc(refA a) refA

Принуждение: приведение

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

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

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

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

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

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

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

Также:

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

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

INT в LONG INT INT в REAL REAL в COMPL BITS в BOOL BYTES в STRING

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

Например:

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

UNION (INT, REAL) var: = 1

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

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

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

Для получения дополнительной информации о первичных, вторичных, третичных и четвертичных компонентах обратитесь к Приоритет оператора.

pr & co: Pragmats and Comments

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

pragmatheap = 32 pragmatprheap = 32 pr

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

original Исходный способ добавления ваших 2 центов к программа ¢ комментарий"жирный" комментарий комментарийcoКомментарий к стилю i co# Комментарий к стилю ii # £ Это комментарий хеша / фунта для британской клавиатуры £

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

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

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

вещественныйполовина пи, один пи; one pi: = 2 * (half pi: = 2 * arc tan (1))

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

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

(intсумма: = 0; дляi ton doсумма +: = f (i) od; sum)

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

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

  • ifпредложения выбора:
ifусловие затемоператоры [elseоператоры] fi"краткая" форма: (условие | операторы | операторы)
ifусловие1 затемоператоры elifусловие2 затемоператоры [elseоператоры ] fi"краткая" форма: (условие1 | операторы |: условие2 | операторы | операторы)

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

  • caseпункты выбора:
caseпереключить воператоры, операторы,... [outоператоры] esac" краткая форма: (переключатель | операторы, операторы,... | операторы)
caseswitch1 воператоры, операторы,... ouseswitch2 instatements, statements,... [ outstatements ] esac"brief" form of casestatement: ( switch1 | statements,statements,... |: switch2 | statements,statements,... | statements )

Choice clause example with Brief symbols:

procdays in month = (intyear, 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 );

Choice clause example with Bold symbols:

procdays in month = (intyear, month)int: casemonth in31, ifyear mod4 eq0 andyear mod100 ne0 oryear mod400 eq0 then29 else28 fi, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 esac;

Choice clause example mixing Bold and Brief symbols:

procdays in month = (intyear, month)int: casemonth in¢Jan¢ 31, ¢Feb¢ ( year mod4 = 0 andyear mod100 ≠ 0 oryear mod400 = 0 | 29 | 28 ), ¢Mar¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ to Dec. ¢ esac;

Algol68 allowed the switch to be of either type intor (uniquely) union. The latter allows the enforcing strong typing onto unionvariables. c.f. union below for example.

  • do loop clause:
[ forindex ] [ fromfirst ] [ byincrement ] [ tolast ] [ whilecondition ] dostatements odThe minimum form of a "loop clause" is thus: dostatements od

This was considered the "universal" loop, the full syntax is:

fori from1 by-22 to-333 whilei×i≠4444 do~ od

The construct have several unusual aspects:

  • only the do~ odportion was compulsory, in which case the loop will iterate indefinitely.
  • thus the clause to100 do~ od, will iterate only 100 times.
  • the while"syntactic element" allowed a programmer to break from a forloop early. e.g.
intsum sq:=0; fori whileprint(("So far:",i,newline)); sum sq≠70↑2 dosum sq+:=i↑2 od

Subsequent "extensions" to the standard Algol68 allowed the tosyntactic element to be replaced with uptoand downtoto achieve небольшая оптимизация. В те же компиляторы также включены:

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

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

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

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

режимвектор= [1: 3] реальный; # вектор режимобъявление (typedef) # режимматрица= [1: 3,1: 3] вещественное; # матрица режимобъявление (typedef) # векторv1: = (1,2,3); # переменная массива изначально (1,2,3) # realv2 = (4,5,6); # постоянный массив, тип эквивалентный vector, подразумеваются границы # op+ = (vectora, b) vector: # binary operator definition # (vectorout; дляi от⌊a до⌈a doout [i]: = a [i] + b [i] od; out); матрицаm: = (v1, v2, v1 + v2); печать ((м [, 2:])); # фрагмент 2-го и 3-го столбцов #

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

refvectorrow = m [2,]; # определить ref(указатель) на 2-ю строку # refvectorcol = m [, 2]; # определить ref(указатель) на второй столбец #

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

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

modenode= union(real, int, comp, string), list= struct(nodeval, refсписокследующий);

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

Algol68, как в Заключительном отчете 1968 года
noden: = «1234»; реальныйr; inti; комплc; строкаs caser, i, c, s :: = n inprint (("real:", r)), print (("int : ", i)), print (("comp:", c)), print (("string:", s)) outprint (("?:", n)) esac
Algol68 как в пересмотренном отчете 1973 г.
узелn: = "1234"; casen in(realr): print (("real:", r)), (inti): print (("int:", i)), ( compc): print (("comp:", c)), (strings): print (("string:", s)) outprint (("?:", n)) esac

proc: Процедуры

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

procmax of real = (reala, b) real: ifa>b затемa elseb fi;

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

procmax of real = (reala, b) real: (а>б | а | б);

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

procapply = (refreala, proc(real) realf): дляi изlwba toupba doa [ i]: = f (a [i]) od

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

op: Operators

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

priomax= 9; opмакс= (inta, b) int: (a>b | a | b); opмакс= (реальныйa, b) реальный: (a>b | a | b); opмакс= (соответствиеa, b) соответствие: (абсa>абсb | a | b ); opmax= (reala) real: (realout: = a [lwba]; дляi отlwba + 1 toupba do(a [i]>out | out: = a [i]) od; out)

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

priorityOperation+Algol68+ Algol68
Фактически 12
(Primary)
разыменование, депроцедура (~, ~), подпись [~], гребля [~,], нарезка [~: ~], обозначения размеров длинный& короткийпроцедураcurrying (~ ,,,), diag, trnsp, row, col
Фактически 11
(вторичный)
of(выбор), loc& куча(генераторы)→ ( selection)new(генераторы)

Это технически не операторы, а скорее они считаются «модулями, связанными с именами "

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

priority
( Третичный)
Algol68 «Достойные символы»+ Algol68+ Algol68+ Algol68
10не~, up, вниз, lwb, upb,

-, abs, arg, bin, entier, длина, уровень, нечетный, повтор, округление, сокращение

¬, ↑, ↓, ⌊, ⌈norm, trace, t, det, invlws, ups, ⎩ , ⎧, btb, ctb

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

priority
(Tertiary)
Algol68 «Достойные символы»+ Algol68+ Algol68+ Algol68
9+ *, i+ ×, ⊥!
8shl, shr, **, up, вниз, lwb, upb↑, ↓, ⌊, ⌈××, ^, lws, ups, ⎩, ⎧
7*, /,%, сверх,% *, mod, elem×, ÷, ÷ ×, ÷ *,% ×, □÷:
6-, +
5<, lt, <=, le,>=, ge,>, gt≤, ≥
4eq=, ne~ = / =≠, ¬ =
3&, и/ \
2or\ /
1minusab, plusab, timesab, divab, overab, modab, plusto,

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

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

Примечание. Третичные категории включают имена nilи ○.

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

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

priority
(четвертичные)
Algol68 «Достойные персонажи»+ Algol68+ Algol68+ Algol68
Фактически 0: =, равно: = :, isnt: / =:: ~ = :, at@, ":", ";": ≠: : ¬ =:: =: =, =: =.. =,. =, ct, ::, ctab, :: =,.., не является, "..", ".,"

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

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

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

refintip, jp

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

ip = jp

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

ip = nil

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

ip: =: jp
ip: =: nil

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

ip: =: refint(jp)
ip: =: refint(nil)

Заявка на патент:14 мая 2003 г. патент на программное обеспечение была подана заявка № 20040230959 для ISNOTсотрудниками Microsoft. Этот патент был выдан 18 ноября 2004 г.

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

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

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

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

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

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

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

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

передачарассматривается как книги, каналыи файлы:

  • Книгисостоят из страниц, строк и символов и могут иметь резервные копии файлов.
    • Определенную книгу можно найти по имени с помощью вызова match.
  • каналсоответствуют физическим устройствам. например перфораторы и принтеры.
    • Различают три стандартных канала: стандартный канал, выделенный канал, резервный канал.
  • A файл- это средство связи между программой и книгой, которая была открыта через какой-либо канал.
    • настройфайла может быть прочитан, записан, char, bin и открыт.
    • процедуры передачи включают: установить, создать, открыть, связать , блокировка, закрытие, царапина.
    • позиция запрашивает: номер символа, номер строки, номер страницы.
    • процедуры макета включают:
      • пробел, backspace, новая строка, newpage.
      • получить хорошую строку, получить хорошую страницу, получить хорошую книгуи procset=(reffilef, intpage, line, char) void:
    • Файл имеет подпрограммы обработки событий. например в конце логического файла, в конце физического файла, в конце страницы, в конце строки, в конце формата, при ошибке значения, при ошибке символа.

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

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

Примеры:

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

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

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

intначальная ширина стопы = 5; режимfoot= struct(строкаимя, semaширина, битыtoe ¢ упакованный вектор BOOL ¢); футлевая ступня: = фут(«Левая», уровеньисходная ширина ступни, 2r11111), правая ступня: = фут("Правый", уровеньначальная ширина стопы, 2r11111); 10 круглых обойм в 1968 Colt Python.357 Magnum ¢ semaраундов = уровень10; ¢ Магнум нужен s больше стволов, чтобы в полной мере использовать параллелизм ¢ semaполучить цель = уровень1; приоритет∧: = = 1; op∧: = = (refбитlhs, bitsrhs)refбит: lhs: = lhs ∧ rhs; procстрелять = (refфутфут) void: (↓ захватить цель; ↓ раунды; печать («БАХ!»); ↓ ширина → ступня; носок → ступня ∧: = ¬ (bin1 shllevelwidth → foot); printf (($ g ": Ой !! - «5 (g) l $, name → foot, bool(toe → foot) [ширина в битах - начальная ширина стопы + 1:])); ↑ получить цель); ¢ производите стрельбу параллельно, чтобы угодить тем, кто надеется стоять на одной ноге ¢ пар(от дляноска доисходная ширина стопы делатьстрелять (левая нога) od, ¢ <= требуется запятая ¢ длязацепа доисходная ширина стопы делатьстрелять (правая нога ) od)

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

Пример кода

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

begin# Сито простых чисел Алгола-68, функциональный стиль # procerror = (strings) void: (print ((newline, "error:", s, newline)); gotostop); procone to = (intn) list: ( procf = (intm, n) list: (m>n | nil| cons (m, f (m + 1, n))); f (1, n)); modelist= refузел; modeузел= struct(inth, listt); proccons = (intn, listl) list: heapnode: = (n, l); prochd = (listl) int: (l isnil| error ("hd nil") ; пропустить| h изl); proctl = (listl) list: (l isnil| error ("tl nil") ; пропустить| t изl); procshow = (listl) void: (l isntnil| print(("", целое (hd (l), 0))); показать (tl (l))); procfilter = (proc(int) boolp, listl) list: ifl isnilзатемnilelifp (hd (l)) затемcons (hd (l), filter (p , tl (l))) elsefilter (p, tl (l)) fi; procsieve = (listl) list: ifl isnil, затемnilelseprocnot multiple = (intn) bool: n modhd (l) ≠ 0; cons (hd (l), sieve (filter (not multiple, tl (l)))) fi; procprimes = (intn) list: sieve ( tl (от одного до (n))); show (primes (100)) end

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

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

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

Приложения

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

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

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

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

inta real int = 3;

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

inta real int = 3; # строгийязык # 'INT'A REAL INT = 3; # ЦИТАТНЫЙ стиль коррекции #.INT A REAL INT = 3; # Стиль обводки ТОЧКИ # INT a real int = 3; # ВЕРХНИЙ стиль обводки # int a_real_int = 3; # Стиль обновления RES, имеется 61 допустимое зарезервированное слово #

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

Следующие символы были рекомендованы для переносимости и назывались "достойными символами" в Отчет о стандартном аппаратном представлении Algol 68 :

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

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

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

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

ПредставлениеКод
Algol68 "строгий"
как обычно публикуется
¢ подчеркивание или жирный шрифт ¢ modexint= int; xintсумма sq: = 0; дляi whilesum sq ≠ 70 × 70 dosum sq +: = i ↑ 2 od
выравнивание цитаты
(например, wikitext )
'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 сумма 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строппинг
(зарезервированное слово)
.PR RES.PR mode.xint = int;.xint sum sq: = 0; for i while sum sq ≠ 70 × 70 do sum sq +: = i ↑ 2 od

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

# Дата следующего дня - вариант на английском языке # modedate= struct(intday, строкамесяц, intгод); procследующий день = (датаx) дата: ifдень ofx < length of month (month ofx, год изx) затем(день изx + 1, месяц изx, год изx) elifмесяц изx = "Декабрь" , затем(1, "январь", год изx + 1) else(1, преемник месяца (месяц изx), год изx) fi;
# Nachfolgetag - Deutsche Variante # mengedatum= tupel(тег ganz, wortmonat, ganzjahr); funktionnaechster tag nach = (datumx) datum: wenntag фонx < monatslaenge(monat фонx, jahr vonx) dann(tag vonx + 1, monat vonx, jahr vonx) wennabermonat vonx = "Dezember" dann(1, "Januar", jahr vonx + 1) ansonsten(1, nachfolgemonat (monat vonx), jahr vonx) endewenn;

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

Some Vanitas

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

skip, «~» или «?» - неопределенное значение всегда синтаксически корректно, пусто- единственное значение, допустимое для void, необходимое для выбора voidв union, void- синтаксически как mode, но не один, nilили "○" - имя, ничего не обозначающее, неопределенного ссылочного режима, () или конкретно [1: 0] int- вакуум - это пустой массив (здесь, в частности, modeint). undefined - стандартная процедура отчетов, вызывающая исключение в системе времени выполнения. ℵ - Используется в стандартном отчете для предотвращения самоанализа определенных типов. например sema

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

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

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

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

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

§10.3.2.2. Режимы передачи а) режимSimpleout= union(≮ℒ int≯, ≮ℒ real≯, ≮ℒ comp≯, bool, ≮ℒ bits≯, char, [] char); б) режимouttype= ¢ фактический - декларатор, определяющий режим, объединенный из достаточного набора режимов, ни один из которых не является «недействительным» или не содержит «гибкий», «ссылка на» , «процедура» или «объединение» ¢; c) режимSimplein= union(≮ refint≯, ≮ refвещественный≯, ≮ refсовокупный≯, refbool, ≮ refбиты≯, refchar, ref[] char, refстрока); г) режимтип= ¢... ¢; §10.3.2.3. Выпрямление a) opпрямо= (outtypex) [] Simpleout: ¢ результат «выпрямления» 'x' ¢; b) opStraightin= (intypex) [] Simplein: ¢ результат выпрямления 'x' ¢;

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

Редакции

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

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

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

opandf= (boola, procboolb) bool: (a | b | ложь); oporf= (boola, procboolb) bool: (a | true| б);

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

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

iffalseandfcoproc bool: co( print ("Не должно выполняться"); true) затем...

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

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

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

Например, в:

proctest = (reala; realb):...... test (x плюс1, x);

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

proctest = (reala, b):...... тест (x плюс1, x);

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

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

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

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

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

ИмяГодЦельСостояниеОписаниеЦелевой ЦПЛицензированиеЯзык реализации
1962ScientificNLАЛГОЛ для обобщенных грамматик
АЛГОЛ Y 1966Проект предложенияIntlПервая версия Algol 68СпецификацияACM
ALGOL 681968Проект предложенияIntlIFIP WG 2.1 Проект отчетаСпецификация - мартACM
АЛГОЛ 681968СтандартIntlIFIP WG 2.1 Final ReportТехнические характеристики - августACM
АЛГОЛ 68-R 1970MilitaryUKICL 1900 ALGOL 60
1971Scientific
ALGOL 68RS 1972MilitaryUKПортативная система компиляцииICL 2900 / Series 39, Multics, генератор VMS & C (1993)Авторские права Crown ALGOL 68RS
Алгол 68 с областями1972Experi mental & otherUKДобавление областей в Algol 68
Mini ALGOL 681973ResearchNL«Интерпретатор для простых программ на Algol 68» Портативный интерпретаторMathematisch Centrum АЛГОЛ 60
1973ИсследованиеUS«Важность моделей реализации».UCLA
АЛГОЛ 68C 1975ScientificUKCambridge Algol 68ICL, IBM 360, PDP 10 и Unix, Telefunken, Tesla & Z80 (1980)CambridgeALGOL 68C
ALGOL 68 Revised Report1975StandardIntlIFIP WG 2.1 Revised ReportСпецификацияACM
1975Экспериментальные и другиеUKПредлагаемые расширения системы режимов Algol 68СпецификацияALGOL W
Odra Алгол 681976Практическое использованиеСССР / ПольшаОдра 1204 / ИллинойсСоветский АЛГОЛ 60
Оклахома АЛГОЛ 681976programming instructionUSAOklahoma State University implement ationIBM 1130 and System/370 /158UnknownANSI Fortran 66.
Berlin ALGOL 681977ResearchDE"The Berlin ALGOL 68 implementation" &An Abstract ALGOL 68 Machine – machine independent CompilerTechnical University of Berlin CDL 2
FLACC 1977Multi-purposeCARevised Report complete implementation with debug featuresSystem/370lease, Chion CorporationAssembler
ALGOL 68-RT 1979ScientificUKParallel ALGOL 68-R
1979ScientificUK
ALGOL 68+1980ScientificNLProposed superlanguage of ALGOL 68
M-220 ALGOL 68USSRM-220Soviet EPSILON
1980TelecommunicationsUSSRFull language + modulesIBM, DEC, CAMCOH, PS 1001 & PCSoviet
Interactive ALGOL 68 1983UKIncremental compilation PCNoncommercial shareware |
ALGOL 68S 1985ScientificIntlSun version of ALGOL 68Sun-3, Sun SPARC (under SunOS 4.1 & Solaris 2), Atari ST (under GEMDOS ), Acorn Archimedes (under RISC OS ), VAX-11 under Ultrix-32
Algol68toC (ctrans)1985ElectronicsUKctrans from ELLA ALGOL 68RS Portable C generatorOpen-source software 1995ALGOL 68RS
MK2 Interactive ALGOL 68 1992UKIncremental compilation PCNoncommercial shareware
Algol 68 Genie2001Full languageNLIncludes standard collateral clausePortable interpreterGPL C
Algol 68 Genie version 2.0.02010Full languageNLPortable interpreter; optional compilation of selected unitsGPL C

The S3 language that was used to write the ICL VME operating system and much other system software on the ICL 2900 Series was a direct derivative of Algol 68. However, it omitted many of the more complex features, and replaced the basic modes with a set of data types that mapped directly to the 2900 Series hardware architecture.

Implementation specific extensions

ALGOL 68R from RRE was the first ALGOL 68 subset implementation, running on the ICL 1900. Основываясь на исходном языке, основными ограничениями подмножества были определение перед использованием и отсутствие параллельной обработки. This compiler was popular in UK universities in the 1970s, where many computer science students learnt ALGOL 68 as their first programming language; компилятор был известен хорошими сообщениями об ошибках.

ALGOL 68RS from RSRE was a portable compiler system written in ALGOL 68RS (bootstrapped from ALGOL 68R), and implemented on a variety of systems including the ICL 2900 /Series 39, Multics and DEC VAX/VMS. Язык был основан на Пересмотренном отчете, но с теми же ограничениями подмножества, что и АЛГОЛ 68R. Этот компилятор сохранился в виде компилятора с Algol68 на C.

In ALGOL 68S from Carnegie Mellon University the power of parallel processing was improved добавив ортогональное расширение, событие. Любое объявление переменной, содержащее ключевое слово event, сделало присвоения этой переменной подходящей для параллельной оценки, т.е. правая часть была преобразована в процедуру, которая была перемещена на один из процессоров C.mmp многопроцессорная система. Доступ к таким переменным задерживался после завершения присваивания.

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

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

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

Цитаты

См. Также

Ссылки

Цитаты

Цитированные работы

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

Последняя правка сделана 2021-06-07 21:24:52
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте