Пересмотренный отчет по алгоритмическому языку - Алгол 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.
Функции ALGOL 68 включают синтаксис на основе выражений, типы, объявленные пользователем и структуры / tagged-union, эталонная модель переменных и эталонных параметров, нарезка строк, массивов и матриц и параллелизм.
АЛГОЛ 68 был разработан Международной федерацией обработки информации (IFIP) Рабочая группа 2.1 IFIP. 20 декабря 1968 года язык был официально принят группой, а затем одобрен для публикации Генеральной ассамблеей IFIP.
АЛГОЛ 68 был определен с использованием формализма, двухуровневой формальной грамматики, изобретенной Адрианом ван Вейнгаарденом. Грамматики Ван Вейнгардена используют контекстно-свободную грамматику для создания бесконечного набора продуктов, которые распознают конкретную программу на Алголе 68; в частности, они могут выражать требования, которые во многих других языках программирования технические стандарты помечены как семантика, и должны быть выражены в тексте на естественном языке, подверженном двусмысленности, а затем реализованы в компиляторах как специальный код прикреплен к синтаксическому анализатору формального языка.
АЛГОЛ 68 был первым (и, возможно, одним из последних) основным языком, для которого было дано полное формальное определение до его реализации.Основные цели и принципы проектирования АЛГОЛА 68:
Алгол 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.
Первая реализация стандарта, основанная на черновик Отчета конца 1968 года был представлен Royal Radar Establishment в Великобритании под названием ALGOL 68-R в июле 1970 года. Это, однако, было подмножеством полного языка, и Барри Майю, последний редактор «Доклада», пошутил, что «это вопрос морали. У нас есть Библия, а вы грешите!» Тем не менее, эта версия стала очень популярной на машинах ICL и стала широко используемым языком в военном кодировании, особенно в Великобритании.
Среди изменений в 68-R было требование для все переменные должны быть объявлены перед их первым использованием. Это имело существенное преимущество, так как позволяло компилятору быть однопроходным, поскольку пространство для переменных в записи активации было зарезервировано перед его использованием. Однако это изменение также имело побочный эффект: требовалось, чтобы procобъявлялись дважды: один раз как объявление типов, а затем снова как фактическое тело кода. Другое изменение заключалось в устранении предполагаемого режима void, выражения, которое не возвращает значения (известного как оператор на других языках) и требует добавления слова voidтам, где оно предполагалось. Кроме того, 68-R устранил явные команды параллельной обработки на основе par.
Первая полная реализация языка была представлена в 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 |
1975 | ALGOL 68C - переносной компилятор (zcode VM ) | S. Борн и Майкл Гай |
июнь 1975 г. | Г. Э. Хедрик и Алан Робертсон. Компилятор подмножества Алгола 68 штата Оклахома. 1975 Международная конференция по Алголу 68. | |
июнь 1977 | Strathclyde Конференция по Алголу 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 исходное лицензирование) | Марсель ван дер Вир |
«Ван Вейнгаарден однажды охарактеризовал четырех авторов, несколько иронично, как: Костер: транспуттер, Пек: синтаксис, Майю: исполнитель, Ван Вейнгаарден: партийный идеолог». - Koster.
- Октябрь 1968: Предпоследний проект отчета по алгоритмическому языку ALGOL 68 - Главы 1-9 Главы 10-12 - Отредактировали: A. van Wijngaarden, BJ Mailloux, JEL Peck и CHA Koster.
- Декабрь 1968 г.: Отчет об алгоритмическом языке ALGOL 68 - Offprint из Numerische Mathematik, 14, 79-218 (1969); Springer-Verlag. - Под редакцией: А. ван Вейнгаарден, Б. Дж. Майлу, Дж. Э. Л. Пек и К. Х. А. Костер.
- Члены WG 2.1, активно участвовавшие в первоначальной разработке Алгола 68: Фридрих Л. Бауэр • • Эдсгер Дейкстра ※ • ※ • ※ • Герхард Гус • Тони Хоар ※ • • Киз Костер • Питер Лэндин • Чарльз Линдси • Барри Майю • Джон Маккарти • • Питер Наур ‡ • • Джон Пек • Виллем ван дер Поэл • Брайан Рэнделл ※ • Дуг Росс • Клаус Самельсон • ※ • Мишель Синцов • ※ • Аад ван Вейнгаарден • Никлаус Вирт ‡ • Майк Вудгер ※ • Нобуо Йонеда ; Ключ: ※ Стороны, подписавшие отчет меньшинства. ‡ Ушел в отставку после [MR 93].
- сентябрь 1973: Пересмотренный отчет об алгоритмическом языке Algol 68 - Springer-Verlag 1976 - Отредактировал: A. van Wijngaarden, B.J. Mailloux, J. Э. Л. Пек, C.H.A. Костер, М. Синцов, К. Х. Линдси, Л. GLT Meertens и.
Хронология стандартизации
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, например. Константы preludemax 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 STRUCTSoft Левая часть назначений, как "~" в: ~: =...
Пример:
- депроцедура:
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 odThis was considered the "universal" loop, the full syntax is:
fori from1 by-22 to-333 whilei×i≠4444 do~ odThe 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 odSubsequent "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)) esacAlgol68 как в пересмотренном отчете 1973 г. узелn: = "1234"; casen in(realr): print (("real:", r)), (inti): print (("int:", i)), ( compc): print (("comp:", c)), (strings): print (("string:", s)) outprint (("?:", n)) esacproc: Процедуры
Объявления процедур (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)Массив, процедура, операции разыменования и принуждения
priority Operation +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, inv lws, ups, ⎩ , ⎧, btb, ctb Диадические операторы со связанными приоритетами
priority
(Tertiary)Algol68 «Достойные символы» + Algol68 + Algol68 + Algol68 9 + *, i + ×, ⊥ ! 8 shl, shr, **, up, вниз, lwb, upb ↑, ↓, ⌊, ⌈ ××, ^, lws, ups, ⎩, ⎧ 7 *, /,%, сверх,% *, mod, elem ×, ÷, ÷ ×, ÷ *,% ×, □ ÷: 6 -, + 5 <, lt, <=, le,>=, ge,>, gt ≤, ≥ 4 eq=, ne~ = / = ≠, ¬ = 3 &, и ∧ / \ 2 or ∨ \ / 1 minusab, 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.
- VME – S3 был языком реализации операционной системы VME. S3 был основан на Алголе 68, но с типами данных и операторами, согласованными с теми, которые предлагаются в ICL 2900 Series.
Примечание: компьютеры советской эпохи Эльбрус-1 (Эльбрус-1) и Эльбрус- 2 были созданы на языке высокого уровня Эль-76 (АЛ-76), а не на традиционной сборке. Эль-76 похож на Алгол-68, главное отличие - это типы динамической привязки в Эль-76, поддерживаемые на аппаратном уровне. Эль-76 используется для приложений, управления заданиями, системного программирования.
Приложения
Оба АЛГОЛ 68C и АЛГОЛ 68-R написаны на АЛГОЛ 68, фактически превращающий АЛГОЛ 68 в приложение. Другие приложения включают:
- ELLA - язык описания оборудования и набор инструментов поддержки. Разработана Royal Signals and Radar Establishment в течение 1980-х и 1990-х годов.
- Система командования RAF Strike - "... 400K безошибочных ALGOL 68-RT код был создан с тремя человеко-годами работы.... "
Библиотеки и API
- NAG Numerical Libraries - программная библиотека подпрограмм численного анализа. Поставляется на АЛГОЛе 68 в течение 1980-х.
- TORRIX - система программирования для операций над векторами и матрицами над произвольными полями и переменного размера, разработанная С.Г. ван дер Мейлен и М. Велдхорст.
Представление программы
Особенностью АЛГОЛА 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.ODAlgol68 с использованием 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(≮ refℒ int≯, ≮ refℒ вещественный≯, ≮ refℒ совокупный≯, refbool, ≮ refℒ биты≯, refchar, ref[] char, refстрока); г) режимℵ тип= ¢... ¢; §10.3.2.3. Выпрямление a) opℵ прямо= (outtypex) [] Simpleout: ¢ результат «выпрямления» 'x' ¢; b) opℵ Straightin= (intypex) [] Simplein: ¢ результат выпрямления 'x' ¢;Сравнение с другими языками
- 1973 - Сравнительные заметки по Algol 68 и PL / I - С.Х. Валентайн - февраль 1973 г.
- 1973 - Б. Р. Александер и Г. Э. Хедрик. Сравнение PL / 1 и ALGOL 68. Международный симпозиум по компьютерам и китайским системам ввода / вывода. С. 359–368.
- 1976 - Оценка ALGOL 68, JOVIAL J3B, Pascal, Simula 67 и TACPOL Против TINMAN - Требования к общему языку программирования высокого порядка.
- 1976 - Сравнение языков - Сравнение свойств языков программирования ALGOL 68, Coral 66, PEARL, PL / 1, RTL / 2 в связи с Программирование в реальном времени - Р. Ресслер; К. Шенк - октябрь 1976 г. [7]
- 1976 г. - Оценка ALGOL 68, Jovial J3B, PASCAL, SIMULA 67 и TACPOL в сравнении с требованиями [Требования к языку Стилмана | TINMAN] для общего языка программирования высокого порядка. Октябрь 1976 г. [8]
- 1977 - Отчет Рабочей группе высокого порядка по языкам (HOLWG) - Краткое содержание - Координационный комитет по оценке языка - Оценка PL / I, Паскаль, АЛГОЛ 68, HAL / S, PEARL, LIS, Евклид, ECL, RTL / 2, Fortran, COBOL, ALGOL 60, TACPOL, CMS-2, Simula 67, JOVIAL J3B, JOVIAL J73 & Coral 66.
- 1977 - Сравнение PASCAL и ALGOL 68 - Эндрю С. Таненбаум - июнь 1977 г.
- 1980 - Критическое сравнение нескольких реализаций языков программирования - Algol 60, FORTRAN, Pascal и Algol 68.
- 1993 - Пять маленьких языков и как они выросли - BLISS, Pascal, Algol 68, BCPL & C – Деннис М. Ричи - Апрель 1993.
- 1999 - Об ортогональности : Algol68, Pascal и C
- 2000 - Сравнение массивов в ALGOL 68 и BLISS - Университет Вирджиния - Майкл Уокер - Весна 2000
- 2009 - На ходу - ох, продолжай - Насколько хорошо Go Google будет противостоять языку программирования Brand X ? - Дэвид Гивен - ноябрь 2009 г.
- 2010 - Алгол и Паскаль из «Концепции языков программирования - Блочно-структурированные процедурные языки» - Марсело Фиоре
- Сравнение Алгола 68 и C ++
Редакции
За исключением случаев, отмеченных (с 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
После пересмотра отчета для расширения применимости были предложены некоторые расширения языка:
- частичная параметризация (также известная как Currying ): создание функций (с меньшим количеством параметров) путем указания некоторых, но не всех параметров для вызова, например логарифм функции двух параметров, основания и аргумента, может быть специализирован для естественного, двоичного или десятичного логарифма, расширение модуля
- : для поддержки внешней связи были предложены два механизма, модули определения снизу вверх, более мощная версия возможностей из ALGOL 68-R и нисходящих дыр, аналогичных предложениям
ENVIRON
иUSING
из ALGOL 68C- параметры режима: для реализации ограниченного параметрического полиморфизма (большинство операций со структурами данных, такими как списки, деревья или другие контейнеры данных, могут быть указаны, не затрагивая полезную нагрузку).
Пока реализована только частичная параметризация в Algol 68 Genie.
Истинная спецификация и сроки реализации ALGOL 68s
Имя Год Цель Состояние Описание Целевой ЦП Лицензирование Язык реализации 1962 Scientific NL АЛГОЛ для обобщенных грамматик АЛГОЛ Y 1966 Проект предложения Intl Первая версия Algol 68 Спецификация ACM ALGOL 68 1968 Проект предложения Intl IFIP WG 2.1 Проект отчета Спецификация - март ACM АЛГОЛ 68 1968 Стандарт Intl IFIP WG 2.1 Final Report Технические характеристики - август ACM АЛГОЛ 68-R 1970 Military UK ICL 1900 ALGOL 60 1971 Scientific ALGOL 68RS 1972 Military UK Портативная система компиляции ICL 2900 / Series 39, Multics, генератор VMS & C (1993) Авторские права Crown ALGOL 68RS Алгол 68 с областями 1972 Experi mental & other UK Добавление областей в Algol 68 Mini ALGOL 68 1973 Research NL «Интерпретатор для простых программ на Algol 68» Портативный интерпретатор Mathematisch Centrum АЛГОЛ 60 1973 Исследование US «Важность моделей реализации». UCLA АЛГОЛ 68C 1975 Scientific UK Cambridge Algol 68 ICL, IBM 360, PDP 10 и Unix, Telefunken, Tesla & Z80 (1980) Cambridge ALGOL 68C ALGOL 68 Revised Report 1975 Standard Intl IFIP WG 2.1 Revised Report Спецификация ACM 1975 Экспериментальные и другие UK Предлагаемые расширения системы режимов Algol 68 Спецификация ALGOL W Odra Алгол 68 1976 Практическое использование СССР / Польша Одра 1204 / Иллинойс Советский АЛГОЛ 60 Оклахома АЛГОЛ 68 1976 programming instruction USA Oklahoma State University implement ation IBM 1130 and System/370 /158 Unknown ANSI Fortran 66. Berlin ALGOL 68 1977 Research DE "The Berlin ALGOL 68 implementation" & An Abstract ALGOL 68 Machine – machine independent Compiler Technical University of Berlin CDL 2 FLACC 1977 Multi-purpose CA Revised Report complete implementation with debug features System/370 lease, Chion Corporation Assembler ALGOL 68-RT 1979 Scientific UK Parallel ALGOL 68-R 1979 Scientific UK ALGOL 68+ 1980 Scientific NL Proposed superlanguage of ALGOL 68 M-220 ALGOL 68 USSR M-220 Soviet EPSILON 1980 Telecommunications USSR Full language + modules IBM, DEC, CAMCOH, PS 1001 & PC Soviet Interactive ALGOL 68 1983 UK Incremental compilation PC Noncommercial shareware | ALGOL 68S 1985 Scientific Intl Sun version of ALGOL 68 Sun-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) 1985 Electronics UK ctrans from ELLA ALGOL 68RS Portable C generator Open-source software 1995 ALGOL 68RS MK2 Interactive ALGOL 68 1992 UK Incremental compilation PC Noncommercial shareware Algol 68 Genie 2001 Full language NL Includes standard collateral clause Portable interpreter GPL C Algol 68 Genie version 2.0.0 2010 Full language NL Portable interpreter; optional compilation of selected units GPL 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. Пока этот параметр действует, компилятор выводит сообщение для каждая конструкция, которую он распознает как нарушающую какое-то ограничение переносимости. "
Цитаты
- ... Схема композиции типов, принятая C, в значительной степени обязана Алголу 68, хотя, возможно, она не возникла в форма, которую одобрили бы приверженцы Алгола. Центральным понятием, которое я уловил из Algol, была структура типов, основанная на атомарных типах (включая структуры), составленных в массивы, указатели (ссылки) и функции (процедуры). Концепция объединений и преобразований в Алголе 68 также оказала влияние, появившееся позже. Деннис Ричи апрель 1993 года.
- ... C не происходит от Алгола 68, это правда, но влияние было, по большей части настолько тонкое, что его трудно восстановить, даже когда я думаю жесткий. В частности, тип объединения (позднее добавление к C) действительно обязан A68 не в каких-либо деталях, а в идее наличия такого типа вообще. Если говорить более глубоко, то структура типов в целом и даже, как ни странно, синтаксис объявления (часть конструктора типа) были вдохновлены A68. И да, конечно, «долго». Деннис Ричи, 18 июня 1988 г.
- «Поздравляю, ваш Учитель сделал это» - Никлаус Вирт
- Чем больше я это вижу, тем более несчастным я становлюсь - EW Dijkstra, 1968
- [...] было сказано, что популярность A68 обратно [...] пропорциональна расстоянию от Амстердама - Гвидо ван Россум
- [...] Лучший мы могли отправить вместе с ним отчет меньшинства, в котором излагалось бы наше взвешенное мнение о том, что «... как инструмент для надежного создания сложных программ язык потерпел неудачу». [...] - С. А. Р. Хоар в своем отчете за октябрь 1980 г.
- Цитата из фактического отчета меньшинства 1970 г.: «[...] Более чем когда-либо потребуется адекватный инструмент программирования, который по своей структуре помогает программисту в самых сложных аспектах его работы, а именно в надежном создании сложных программ. В этом отношении мы не видим, как предлагаемый здесь язык [Algol68] является значительным шагом вперед: напротив, мы чувствуем, что его неявное представление Задача программиста почти такая же, как, скажем, десять лет назад. Это заставляет нас сделать вывод, что, рассматриваемый как инструмент программирования, язык должен считаться устаревшим. [...] "Подписано: Дейкстра, Хоар, Рэнделл, Вудгер. С 23 декабря 1968 года.
См. Также
Ссылки
Цитаты
Цитированные работы
Внешние ссылки
- Пересмотренный отчет по алгоритмическому языку ALGOL 68 Официальный справочник для пользователей и разработчиков языка (большой файл pdf, сканированный из бюллетеня Algol)
- Пересмотренный отчет по алгоритмическому языку ALGOL 68 Гиперссылка HTML-версия Revised Report
- A Tutorial on Algol 68, автор Эндрю С. Таненбаум, в Computing Surveys, Vol. 8, № 2, июнь 1976 г., с исправлениями (том 9, № 3, сентябрь 1977 г.)
- Algol 68 Genie - компилятор-интерпретатор Algol 68 GNU GPL
- Алгол с открытым исходным кодом 68 реализаций на SourceForge
- Стандартное аппаратное представление Algol68 (.pdf)
- Из истории создания компилятора с Алгол 68
- Algol 68 - 25 лет в СССР
- Система программной динамической поддержки для транслятора с Алгол 68
- История C с наследием Algol68
- МакДжонс, Пол, «Реализации и диалекты Algol 68», Группа сохранения программного обеспечения, Музей истории компьютеров, 05.07.2011
- Веб-компилятор ALGOL 68 для небольших экспериментов