Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

Обзор [ править ]

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

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

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

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

ЦДХ Костер [8]

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

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

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

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

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

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

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

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

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

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

История [ править ]

Истоки [ править ]

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

Процесс определения [ править ]

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

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

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

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

Публикация [ править ]

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

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

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

Реализации [ править ]

АЛГОЛ 68-R [ править ]

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

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

Другое [ править ]

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

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

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

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

  • a68g , GPLv3 , автор - Марсель ван дер Вир.
  • algol68toc , программный порт с открытым исходным кодом для ALGOL 68RS .
  • экспериментальный интерфейс Algol68 для GCC, написанный Jose E. Marchesi. [33]

Хронология [ править ]

  • "Краткая история Алгола 68"
  • АЛГОЛ 68 - АЛГОЛ 3-го поколения

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

  • Март 1968: Проект отчета по алгоритмическому языку ALGOL 68 [39] - Под редакцией: Адриан ван Вейнгаарден , Барри Дж. Майлу , Джон Пек и Корнелис Х.А. Костер .

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

  • Октябрь 1968: Предпоследний проект отчета по алгоритмическому языку АЛГОЛ 68 - Главы 1–9 [40] Главы 10–12 [41] - Под редакцией: А. ван Вейнгаарден, Б. Дж. Майлу, Дж. Э. Пек и Ч. А. Костер.
  • Декабрь 1968: Отчет об алгоритмическом языке ALGOL 68 - Offprint из Numerische Mathematik, 14, 79-218 (1969); Springer-Verlag. [42] - Под редакцией: А. ван Вейнгаарден, Б. Дж. Майлу, Дж. Э. Пек и Ч. А. Костер.
  • Отчет меньшинства, Алгол Бюллетень AB31.1.1 - подписали: март 1970 Эдсгер Дейкстры , Фрейзер Дункан , Ян Garwick , Тони Хоара , Брайан Рэнделл , Герхард Seegmüller , Wlad Турский , и Майк Вуджер .
  • Сентябрь 1973: Пересмотренный отчет по алгоритмическому языку Algol 68 - Springer-Verlag 1976 [43] - Под редакцией: A. van Wijngaarden, B. Mailloux, J. Peck, K. Koster, M. Sintzoff, CH Lindsey, Lambert Meertens and Ричард Г. Фискер .
  • другие члены WG 2.1, активно участвующие в разработке Алгола 68: [18] Фридрих Л. Бауэр • Ганс Бекич • Герхард Гус • Питер Зилахи Ингерман • Питер Ландин • Чарльз Х. Линдси • Джон Маккарти • Джек Мернер • Питер Наур • Манфред Пол • Виллем ван дер Поэль • Дуг Росс • Клаус Самельсон • Мишель Синцов • Никлаус Вирт • Нобуо Йонеда .

Хронология стандартизации [ править ]

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

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

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

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

Примечательные языковые элементы [ править ]

Жирные символы и зарезервированные слова [ править ]

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

режим , op , prio , proc , flex , heap , loc , long , ref , short , bits , bool , bytes , char , comp , int , real , sema , string , void , channel , file , format , struct , union , в "@",либо r0 , равно ": =:", isnt is not  is not r0 ": / =:" ": ≠:", из "→" r0 , true , false , empty , nil "○", пропустить "~", co " ¢ ", комментарий " ¢ ", pr , pragmat , case ~ in ~ ouse ~ in ~ out ~ esac " (~ | ~ |: ~ | ~ | ~) ",для ~ от ~ до ~by ~ while ~ do ~ od , if ~ then ~ elif ~ then ~ else ~ fi "(~ | ~ |: ~ | ~ | ~)", par  begin ~ end "(~)", перейти к , перейти , выйти "." r0 .

Единицы: выражения [ править ]

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

режим: Объявления [ править ]

Основные типы данных (называемые режимом s на языке Алгола 68) - это real , int , comp ( комплексное число ), bool , char , биты и байты . Например:

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

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

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

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

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

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

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

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

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

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

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

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

 int max = 99; режим newmode = [0: 9] [0: max] struct ( long  real a, b, c, short  int i, j, k, ref  real r );

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

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

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

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

 режим A = ref A режим A = структура (A a, B b) режим A = proc (A a) A

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

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

Принуждение: кастинг [ править ]

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

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

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

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

Иерархия принуждения с примерами [ править ]

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

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

pr & co: Pragmats and Comments [ править ]

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

pragmat heap = 32 pragmat pr heap = 32 pr

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

¢ Оригинальный способ добавления ваших 2 цента к программе ¢ комментарий «жирный» комментарий комментарий co Стиль я комментарий co# Стиль ii комментарий #£ Это комментарий хеша / фунта для британской клавиатуры £

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

Выражения и составные утверждения [ править ]

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

 реальная половина пи, один пи; один пи: = 2 * (половина пи: = 2 * дуга загар (1))

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

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

( int sum: = 0; от i до n сделать sum +: = f (i) od ; sum)

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

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

  • если условия выбора:
 if условие then операторы [ else операторы] fi «краткая» форма: (условие | утверждения | утверждения)
 если Condition1 затем ОТЧЕТНОСТЬ Элифа condition2 затем заявление [ остальное заявления] фи «краткая» форма: (условие1 | операторы |: условие2 | операторы | операторы)

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

  • условия выбора случая :
 case switch in операторы, операторы, ... [ операторы out ] esac «краткая» форма: (переключатель | операторы, операторы, ... | операторы)
 case switch1 в операторах, операторах, ... ouse switch2 в операторах, операторах, ... [ операторы out ] esac "краткая" форма оператора case : (switch1 | операторы, операторы, ... |: switch2 | операторы, операторы , ... | заявления)

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

дни процесса в месяце = ( int год, месяц) int : (месяц | 31, (год ÷ × 4 = 0 ∧ год ÷ × 100 ≠ 0 ∨ год ÷ × 400 = 0 | 29 | 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

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

дни процесса в месяце = ( int год, месяц) int : case месяц в 31, если год кратен 4 э 0 и год кратен 100 п 0 или год кратен 400 эк 0 тогда 29 еще 28 ц , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 esac ;

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

дни процесса в месяце = ( int год, месяц) int : case месяц в¢ янв. ¢ 31,¢ ¢ февраль (год моды 4 = 0 и года кратен 100 ≠ 0 или год кратен 400 = 0 | 29 | 28)¢ марта ¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ до декабря ¢ esac ;

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

  • предложение цикла do :
[ для индекса] [ от первого] ​​[ по приращению] [ до последнего] [в то время как условие] операторы do od Минимальная форма «предложения цикла» такова: операторы do od

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

для i от 1 до -22 до -333, а i × i ≠ 4444 do ~ od

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

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

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

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

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

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

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

  вектор моды = [1: 3] действительный ; # объявление векторного режима (typedef) #  mode  matrix = [1: 3,1: 3] real ; # объявление режима матрицы (typedef) #  вектор v1: = (1,2,3); # исходная переменная массива (1,2,3) # [] real v2 = (4,5,6); # Константа массив, тип эквивалентен вектор , оценки являются подразумеваемой #  оп + = ( вектор а, б) вектор : # двоичного оп Erator определения # ( векториз; для i от ⌊a до ⌈a do out [i]: = a [i] + b [i] od ; из); матрица m: = (v1, v2, v1 + v2); печать ((м [, 2:])); # срез 2-го и 3-го столбцов #

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

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

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

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

 режим  node = union ( void , real , int , comp , string ), list = struct ( node val, ref  list next);

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

proc: процедуры [ править ]

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

 proc max of real = ( real a, b) real : если a> b, то a else b fi ;

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

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

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

 proc apply = ( ref [] real a, proc ( real ) real f):   для i от  lwb a до  upb a do a [i]: = f (a [i]) od

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

op: Операторы [ править ]

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

 prio  max = 9;   op  max = ( int a, b) int : (a> b | a | b); op  max = ( real a, b) real : (a> b | a | b); op  max = ( comp a, b) comp : ( abs a> abs b | a | b);   op  max = ([] real a) real : ( real out: = a [ lwb a]; для i от  lwb a + 1 до  upb a do (a [i]> out | out: = a [i]) od ; из)

Операции с массивами, процедурами, разыменованием и принуждением [ править ]

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

Монадические операторы [ править ]

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

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

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

Отношения присвоения и идентичности и т. Д. [ Править ]

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

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

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

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

ref int ip, jp

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

ip = jp

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

ip = nil

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

ip :=: jp
ip :=: nil

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

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

Специальные символы [ править ]

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

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

transput: ввод и вывод [ править ]

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

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

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

Книги, каналы и файлы [ править ]

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

  • Книги состоят из страниц, строк и символов и могут иметь резервные копии файлов.
    • Определенную книгу можно найти по имени с помощью вызова match.
  • каналы соответствуют физическим устройствам. например, перфораторы и принтеры.
    • Три стандартных каналов различают: стоять в канале, выделяются канал, отойти в сторону канала.
  • Файл является средством общения между программой и книгой , которая была открыта с помощью какого - либо канала.
    • Настроение файла может быть чтение, запись, голец, бен, и открыл.
    • Процедуры transput включают в себя: establish, create, open, associate, lock, close, scratch.
    • Позиция вопрошает: char number, line number, page number.
    • процедуры компоновки включают:
      • space, backspace, newline, newpage.
      • get good line, get good page, get good book, и proc set=(ref file f, int page,line,char)void:
    • В файле есть процедуры обработки событий . напр on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error.

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

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

Примеры:

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

par: Параллельная обработка [ править ]

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

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

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

Пример кода [ править ]

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

begin # Сито простых чисел Алгола-68, функциональный стиль #   Proc ошибка = ( строка s) недействительными : (print ((новая строка, "ошибка:", s, новая строка)); перейти к остановке); proc one to = ( int n) list : ( proc f = ( int m, n) list : (m> n | nil | cons (m, f (m + 1, n))); f (1, n));    список режимов = эталонный  узел ; узел режима = структура ( int h, список t); proc cons = ( int n, list l) list : узел кучи  : = (n, l); proc hd = ( list l) int : (l is nil | error ("hd nil "); пропустить | h из l); proc tl = ( список l) список : (l -   ноль | ошибка ("tl nil "); пропустить | т из л); proc show = ( list l) void : (l isnt  nil | print (("", целое (hd (l), 0))); show (tl (l)));   proc filter = ( proc ( int ) bool p, list l) list : если l равно  nil,  то  nil  elif p (hd (l)), затем cons (hd (l), filter (p, tl (l))) else filter (p, tl (l)) fi ;   proc sieve = ( list l) list : если l равно  nil,  то  nil  else  proc not multiple = ( int n) bool : n mod hd (l) ≠ 0; cons (hd (l), сито (фильтр (не кратный, tl (l)))) fi ;   proc primes = ( int n) list : sieve (tl (one to (n)));   показать (простые числа (100))конец

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

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

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

Приложения [ править ]

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

  • ELLA - язык описания оборудования и инструментарий поддержки. Разработан Royal Signals and Radar Establishment в 1980-х и 1990-х годах.
  • Система командования ударом Королевских ВВС - «... 400 КБ безошибочного кода Алгола 68-RT было создано с тремя человеко-годами работы ...» [52]

Библиотеки и API [ править ]

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

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

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

 int реальный int = 3;

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

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

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

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

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

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

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

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

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

# Дата следующего дня - вариант на английском языке # mode  date = struct ( int day, string month, int year); срабатывать на следующий день после = ( дата х) даты : если день из й <длины месяца (месяц от х, года от й) тогда (дня из й + 1, месяца от х, года от й) Элифа месяца от й = " декабрь» , то (1,„январь“, год изх + 1) еще (1, правопреемник месяца (месяц из й), год от й) ц ;
# Nachfolgetag - Deutsche Variante # menge  datum = tupel ( тег ganz , monat сусла , ganz jahr); funktion naechster tag nach = ( datum x) datum : wenn tag von x <monatslaenge (monat von x, jahr von x) dann (tag von x + 1, monat von x, jahr von x) wennaber monat von x = "Dezember" данн (1, «Януар», jahrvon x + 1) ansonsten (1, nachfolgemonat (monat von x), jahr von x) endewenn ;

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

Некоторые Vanitas [ править ]

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

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

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

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

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

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

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

§10.3.2.2. Режимы передачиа) режимsimplout = объединение (≮ℒ  INT ≯, ≮ℒ  реальный ≯, ≮ℒ  компл ≯, BOOL , ≮ℒ bits≯, символ , [] символ );б) режимouttype = ¢ фактический - декларатор, указывающий режим объединенных из достаточного набора режимов, ни один из которых не является «недействительным» и не содержит «гибкий», «ссылка на», «процедура» или «объединение» ¢;в) режимsimplin = объединение (≮ исх ℒ  INT ≯, ≮ исх ℒ  реального ≯, ≮ исхкомпл ≯, исх  BOOL ,ref ℒ  биты ≯, ref  char , ref [] char , ref  string );г) режимintype = ¢ ... ¢; §10.3.2.3. Выпрямлениеа) опstraightout = ( outtype х) [] simplout : ¢ результат "выпрямления" 'х' ¢;б) опstraightin = ( intype х) [] simplin : ¢ результат выпрямления 'х' ¢;

Сравнение с другими языками [ править ]

  • 1973 - Сравнительные заметки по Algol 68 и PL / I - SH Valentine - февраль 1973 г.
  • 1973 - Б.Р. Александр и Г.Е. Хедрик. Сравнение PL / 1 и ALGOL 68. Международный симпозиум по компьютерам и китайским системам ввода / вывода. С. 359–368.
  • 1976 - Оценка ALGOL 68, JOVIAL J3B, Pascal , Simula 67 и TACPOL по сравнению с TINMAN - Требования к общему языку программирования высокого порядка.
  • 1976 - Сравнение языков [ постоянная мертвая ссылка ] - Сравнение свойств языков программирования ALGOL 68, CAMAC-IML , Coral 66 , PAS 1 , PEARL , PL / 1 , PROCOL , RTL / 2 в отношении программирования в реальном времени - Р. Ресслер; К. Шенк - октябрь 1976 г. [7]
  • 1976 - Оценка ALGOL 68, JOVIAL J3B, PASCAL, SIMULA 67 и TACPOL в сравнении с требованиями [Требования к языку Steelman | TINMAN] для общего языка программирования высокого порядка. Октябрь 1976 г. [8]
  • 1977 - Отчет Рабочей группе высокого порядка по языку (HOLWG) - Резюме - Координационный комитет по оценке языка - Оценка PL / I , Pascal , ALGOL 68, HAL / S , PEARL , SPL / I , PDL / 2 , LTR, CS-4 , LIS , Euclid , ECL , Moral, RTL / 2 , Fortran , COBOL , ALGOL 60 , TACPOL , CMS-2 , Simula 67, JOVIAL J3B, JOVIAL J73 и Coral 66 .
  • 1977 - Сравнение PASCAL и ALGOL 68 [55] - Эндрю С. Таненбаум - июнь 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 - On Go - ну, давай - Насколько хорошо Google Go противостоит языку программирования Brand X? - Дэвид Гивен - ноябрь 2009 г.
  • 2010 - Алгол и Паскаль из "Концепции языков программирования - Блочно-структурированные процедурные языки" - Марсело Фиоре
  • Сравнение АЛГОЛА 68 и C ++

Редакции [ править ]

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

Язык неотредактированного отчета [ править ]

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

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

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

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

if  false  andf  co proc bool: co (print ("Не должно выполняться"); true ) то ...

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

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

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

Например в:

proc test = ( real a; real b): ......тест (x плюс 1, x);

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

proc test = ( real a, b): ......тест (x плюс 1, x);

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

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

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

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

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

Истинная спецификация и сроки реализации АЛГОЛА 68 [ править ]

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

Расширения для конкретных реализаций [ править ]

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

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

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

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

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

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

Цитаты [ править ]

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

См. Также [ править ]

Ссылки [ править ]

Цитаты [ править ]

  1. ^ ван Вейнгаарден, Адриан ; Майлу, Барри Джеймс ; Пек, Джон Эдвард Ланселот ; Костер, Корнелис Херманус Антониус ; Синцов, Мишель ; Линдси, Чарльз Ходжсон ; Меертенс, Ламбер Гийом Луи Теодор ; Фискер, Ричард Г., ред. (1976). Пересмотренный отчет по алгоритмическому языку ALGOL 68 (PDF) . Springer-Verlag . ISBN 978-0-387-07592-1. OCLC  1991170 . Архивировано (PDF) из оригинала 19.04.2019 . Проверено 11 мая 2019 .
  2. ^ a b Деннис Ричи (апрель 1993 г.). «Развитие языка Си» (PDF) . Архивировано из оригинального (PDF) 06.11.2005 . Проверено 26 апреля 2007 .
  3. ^ Влияние на C: типы, структуры, массивы, указатели и процедуры - Деннис Ричи [2]
  4. ^ a b Деннис Ричи (июнь 1988 г.). «Си и Алгол 68» . Проверено 15 сентября 2006 .
  5. ^ Влияние на C: объединение, структура, синтаксис и длинная точность - Деннис Ричи [4]
  6. ^ "История C ++: 1979-1991" (PDF) . Март 1993. Страница 12, 2-й абзац: Algol68 [дал] перегрузку оператора (§3.3.3), ссылки (§3.3.4) и возможность объявлять переменные в любом месте блока (§3.3.1) . Проверено 6 мая 2008 .
  7. ^ «Интервью с Гвидо ван Россумом» . Июль 1998. Архивировано из оригинала на 2007-05-01 . Проверено 29 апреля 2007 .
  8. ^ «Краткая история АЛГОЛА 68» . Архивировано из оригинала на 2006-08-10 . Проверено 15 сентября 2006 .
  9. Полнота и ясность описания. Архивировано 17 марта 2013 г. на Wayback Machine.
  10. Ортогональный дизайн. Архивировано 17 марта 2013 г. в Wayback Machine.
  11. Безопасность Архивировано 17 марта 2013 г. на Wayback Machine.
  12. ^ Эффективность Архивировано 17 марта 2013 г. на Wayback Machine.
  13. ^ https://groups.google.com/group/comp.lang.misc/msg/03af5063e1662d4d
  14. ^ Пересмотренный отчет по алгоритмическому языку Algol 68, архивирован 17 марта 2013 г. на Wayback Machine . jmvdveer.home.xs4all.nl (1968-12-20). Проверено 21 июля 2013.
  15. Терехов, Андрей (2014). «АЛГОЛ 68 и его влияние на программирование в СССР и России». 2014 Третья международная конференция по компьютерным технологиям в России и бывшем Советском Союзе . С. 97–106. DOI : 10.1109 / SoRuCom.2014.29 . ISBN 978-1-4799-1799-0. S2CID  16097093 .
  16. ^ http://toc.proceedings.com/25445webtoc.pdf "Алгол 68 и его влияние на программирование в СССР и России" - страницы: 336 и 342
  17. ^ Линдси 1996 .
  18. ^ a b Линдси, Чарльз Х. (1996). Бергин, Т.Дж.; Гибсон, Р.Г. (ред.). История АЛГОЛА 68 . Уведомления ACM SIGPLAN . История языков программирования-II . 28 . также в ACM SIGPLAN Notices 28 (3), март 1993 г. (включает исчерпывающую библиографию встреч и обсуждений до, во время и после разработки АЛГОЛА 68). ACM Press . С. 97–132. DOI : 10.1145 / 155360.155365 . ISBN 978-0-201-89502-5.
  19. ^ Программирование на Алголе 68 стало проще
  20. ^ Изучение ALGOL 68 Genie
  21. Перейти ↑ Lindsey 1993 , p. 7.
  22. ^ а б в г Линдси 1993 , стр. 9.
  23. Перейти ↑ Lindsey 1993 , p. 24.
  24. ^ a b Линдси 1993 , стр. 10.
  25. ^ http://archive.computerhistory.org/resources/text/algol/algol_bulletin/
  26. ^ a b Линдси 1993 , стр. 12.
  27. Перейти ↑ Lindsey 1993 , p. 13.
  28. Перейти ↑ Lindsey 1993 , p. 15.
  29. Перейти ↑ Hoare, C. a. Р. (ноябрь 1968 г.). «Критика АЛГОЛА 68» . Бюллетень АЛГОЛ . 29 : 27–29.
  30. ^ a b Пек, JEL, изд. (1970), Труды рабочей конференции IFIP по внедрению Алгола 68 , Мюнхен: Северная Голландия, ISBN 0-7204-2045-8
  31. ^ a b c d Костер, ЦДХ "Краткая история Алгола 68" . Архивировано из оригинала на 2007-12-17.
  32. ^ ван дер Вир, Марсель. «Реализации Алгола 68 с открытым исходным кодом» . algol68.sourceforge.net .
  33. ^ Э. Марчези, Хосе. "Интерфейс Algol68 для GCC" . jemarch.net .
  34. ^ Проект отчета (DR) опубликован
  35. ^ Algol 68 Пересмотренный отчет
  36. ^ Предложения для АЛГОЛА H - Суперязыка АЛГОЛА 68
  37. ^ Algol68 S (S) опубликовано в Интернете
  38. Алгол 68 Джинн (G)
  39. ^ «Проект отчета по алгоритмическому языку АЛГОЛ 68» . Март 1968 года. Архивировано 30 сентября 2007 года . Проверено 22 июня 2007 .
  40. ^ «Предпоследний проект отчета по алгоритмическому языку Алгол 68 - главы 1-9» (PDF) . Октябрь 1968 . Проверено 22 июня 2007 . [ постоянная мертвая ссылка ]
  41. ^ «Предпоследний проект отчета по алгоритмическому языку Алгол 68 - главы 10-12» (PDF) . Октябрь 1968 . Проверено 22 июня 2007 . [ постоянная мертвая ссылка ]
  42. ^ "Отчет по алгоритмическому языку АЛГОЛ 68" (PDF) . Декабрь 1968 . Проверено 30 декабря 2007 .
  43. ^ "Пересмотренный отчет по алгоритмическому языку Алгола 68" . Сентябрь 1973. архивации от оригинала на 2007-09-27 . Проверено 30 апреля 2007 .
  44. Лу Ху-цюань (1971). «Перевод Алгола 68 на китайский язык» (PDF) . Пекин, Китай: Институт математики, Academia Sinica . Проверено 17 августа 2012 .
  45. ^ "ГОСТ 27974-88 Язык программирования АЛГОЛ 68 - Язык программирования АЛГОЛ 68" (PDF) (на русском). ГОСТ . 1988. Архивировано из оригинального (PDF) на 2008-11-15 . Проверено 15 ноября 2008 .
  46. ^ «ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный - Язык программирования АЛГОЛ 68 расширенный» (PDF) (на русском). ГОСТ . 1988. Архивировано из оригинального (PDF) 29 апреля 2011 года . Проверено 15 ноября 2008 .
  47. ^ Синтаксис формата в ALGOL 68G. Архивировано 9 января 2008 г. на Wayback Machine.
  48. ^ Нидхэм, RM; Уилкс, М.В. (январь 1979 г.). «Компьютер Cambridge CAP и его операционная система» (PDF) . Microsoft Research .
  49. Дэвид Холдсворт (зима 2009–2010 гг.). «KDF9 Time Sharing: Eldon 2 - это не EGDON!» . Компьютерное воскресение - номер 49 . Общество сохранения компьютеров . Проверено 3 октября 2010 .
  50. ^ http://www.vitanuova.com/dist/doc/rsre-3522-curt.pdf
  51. ^ Эльбрус Бабаяна и Pentium Пентковского . Ixbt.com. Проверено 21 июля 2013.
  52. ^ Оливер, младший; Ньютон, RS (1979). «Практический опыт работы с АЛГОЛОМ 68-РТ» (PDF) . Компьютерный журнал . 22 (2): 114–118. DOI : 10.1093 / comjnl / 22.2.114 . Проверено 9 апреля 2011 .
  53. ^ Приложения, библиотеки и наборы тестов - Группа сохранения программного обеспечения . Softwarepreservation.org. Проверено 21 июля 2013.
  54. ^ Пересмотренный отчет, стр. 123, сноска.
  55. ^ http://dare.ubvu.vu.nl/bitstream/1871/2609/1/11054.pdf
  56. ^ Линдси, Швейцария; Бум, HJ (декабрь 1978 г.). «Модули и отдельное средство компиляции для АЛГОЛА 68» . Бюллетень АЛГОЛА (43): 19–53. DOI : 10,1145 / 1061719,1061724 (неактивный 2021-01-17) . Проверено 29 января 2020 .CS1 maint: DOI неактивен с января 2021 г. ( ссылка )
  57. ^ «Архивная копия» (PDF) . Архивировано из оригинального (PDF) 15 апреля 2010 года . Проверено 20 марта 2010 . CS1 maint: archived copy as title (link)
  58. ^ http://htportal.acm.org/ft_gateway.cfm?id=803425&type=pdf [ постоянная мертвая ссылка ]
  59. ^ Абстрактная машина на Алголе 68 и ее применение в машинно-независимом компиляторе - Springer . Springerlink.com. Проверено 21 июля 2013.
  60. ^ "Архивная копия" . Архивировано из оригинала на 2011-03-10 . Проверено 20 марта 2010 .CS1 maint: archived copy as title (link)
  61. ^ Реализации Algol 68 с открытым исходным кодом - Просмотр файлов в . Sourceforge.net. Проверено 21 июля 2013.
  62. ^ [1] Архивировано 29 августа 2006 г. в Wayback Machine.
  63. ^ http://www.fh-jena.de/~kleine/history/languages/Algol68-RR-HardwareRepresentation.pdf
  64. ^ ЧА Костер (1993). «Создание Алгола 68». CiteSeerX 10.1.1.76.2072 .  Cite journal requires |journal= (help)
  65. ^ Дейкстра, EW "Редактору ALGOL 68 Mathematische Centrum" . Архивировано 21 апреля 2007 года . Проверено 28 апреля 2007 .
  66. ^ ван Россум, Гвидо (июнь 2005 г.). "Список желаний Python-Dev: пока" . Проверено 28 апреля 2007 .
  67. Hoare, CAR (февраль 1981 г.) [на основе его лекции 1980 г. по Премии Тьюринга ]. «Старая одежда императора» . Коммуникации ACM . 24 (2): 75–83. DOI : 10.1145 / 358549.358561 . S2CID 97895 . Архивировано из оригинала на 2013-05-08.  Альтернативный URL
  68. ^ «Бюллетень АЛГОЛА (упоминается в AB30.1.1.1)» . Март 1970. Архивировано 30 сентября 2007 года . Проверено 1 марта 2007 .

Процитированные работы [ править ]

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

Внешние ссылки [ править ]

  • Пересмотренный отчет по алгоритмическому языку ALGOL 68 Официальный справочник для пользователей и разработчиков языка (большой файл в формате pdf, отсканированный из бюллетеня Algol)
  • Пересмотренный отчет на алгоритмическом языке АЛГОЛ 68 HTML-версия пересмотренного отчета с гиперссылкой
  • Учебное пособие по Алголу 68 , Эндрю С. Таненбаум , в Computing Surveys , Vol. 8, № 2, июнь 1976 г., с исправлениями (том 9, № 3, сентябрь 1977 г.)
  • Algol 68 Genie - компилятор-интерпретатор GNU GPL Algol 68
  • Реализации Алгола 68 с открытым исходным кодом на SourceForge
  • Стандартное представление оборудования Algol68 (.pdf)
  • Из истории создания компилятора с Алгол 68
  • Алгол 68-25 лет в СССР
  • Система программной динамической поддержки для транслятора с Алгол 68
  • История C с наследием Algol68
  • МакДжонс, Пол, «Реализации и диалекты Алгола 68» , Группа сохранения программного обеспечения , Музей истории компьютеров , 2011-07-05
  • Веб-компилятор ALGOL 68 для небольших экспериментов