stringtranslate.com

АЛГОЛ 60

ALGOL 60 (сокращение от Algorithmic Language 1960 ) является членом семейства языков программирования ALGOL . Он появился после ALGOL 58 , в котором были введены блоки кода и пары и для их разграничения, что стало ключевым шагом в развитии структурного программирования . ALGOL 60 был одним из первых языков, реализующих определения функций (которые можно было вызывать рекурсивно). Определения функций ALGOL 60 могли быть вложены друг в друга (что было впервые введено любым языком программирования) с лексической областью действия . Он дал начало многим другим языкам, включая CPL , PL/I , Simula , BCPL , B , Pascal и C. Практически каждый компьютер той эпохи имел язык системного программирования, основанный на концепциях ALGOL 60.beginend

Никлаус Вирт создал свой собственный ALGOL W на основе ALGOL 60, прежде чем перейти к разработке Pascal . Algol-W должен был стать следующим поколением ALGOL, но комитет ALGOL 68 остановился на более сложном и продвинутом проекте, а не на очищенном упрощенном ALGOL 60. Официальные версии ALGOL названы в честь года, когда они были впервые опубликованы. ALGOL 68 существенно отличается от ALGOL 60 и частично подвергался критике за это, так что в целом «ALGOL» относится к диалектам ALGOL 60.

Стандартизация

ALGOL 60 и COBOL были первыми языками, стремившимися к стандартизации.

История

ALGOL 60 использовался в основном исследователями-компьютерщиками в США и Европе. Его использование в коммерческих приложениях было затруднено отсутствием стандартных средств ввода/вывода в его описании и отсутствием интереса к языку со стороны крупных поставщиков компьютеров. Однако ALGOL 60 стал стандартом для публикации алгоритмов и оказал глубокое влияние на дальнейшее развитие языка.

Джон Бэкус разработал метод нормальной формы Бэкуса для описания языков программирования специально для АЛГОЛа 58. Он был пересмотрен и расширен Питером Науром для АЛГОЛа 60 и по предложению Дональда Кнута переименован в форму Бэкуса–Наура . [1]

Питер Наур: «Как редактор ALGOL Bulletin я был вовлечён в международные дискуссии по языку и был выбран членом Европейской группы по разработке языка в ноябре 1959 года. В этом качестве я был редактором отчёта ALGOL 60, подготовленного в результате встречи ALGOL 60 в Париже в январе 1960 года». [2]

На встрече в Париже (с 11 по 16 января) присутствовали следующие лица:

Алан Перлис дал яркое описание встречи: «Встречи были изнурительными, бесконечными и воодушевляющими. Человек раздражался, когда его хорошие идеи отбрасывались вместе с плохими идеями других. Тем не менее, усердие сохранялось в течение всего периода. Химия 13 была превосходной».

Первоначально язык не включал рекурсию . Она была включена в спецификацию в последнюю минуту, вопреки желанию некоторых членов комитета. [3]

ALGOL 60 вдохновил многие последующие языки. Тони Хоар заметил: «Это язык, который настолько опередил свое время, что он был не только лучше своих предшественников, но и почти всех своих последователей». [4] [5]

Хронология реализаций ALGOL 60

На сегодняшний день существует не менее 70 дополнений, расширений, производных и подъязыков АЛГОЛа 60. [6]

Диалекты Берроуза включали специальные диалекты системного программирования, такие как ESPOL и NEWP .

Характеристики

ALGOL 60, как официально определено, не имел средств ввода/вывода; реализации определяли свои собственные способами, которые редко были совместимы друг с другом. Напротив, ALGOL 68 предлагал обширную библиотеку средств transput (термин ALGOL 68 для ввода/вывода).

ALGOL 60 предоставлял две стратегии оценки для передачи параметров : общий вызов по значению и вызов по имени . В объявлении процедуры для каждого формального параметра указывалось, что должно было использоваться: значение, указанное для вызова по значению, и опущенное для вызова по имени. Вызов по имени имеет определенные эффекты в отличие от вызова по ссылке . Например, без указания параметров как значения или ссылки невозможно разработать процедуру, которая поменяет местами значения двух параметров, если фактические параметры, которые передаются, являются целочисленной переменной и массивом, который индексируется той же целочисленной переменной. [19] Подумайте о передаче указателя на swap(i, A[i]) в функцию. Теперь, когда каждый раз, когда ссылаются на swap, он переоценивается. Скажем, i := 1 и A[i] := 2, поэтому каждый раз, когда ссылаются на swap, он будет возвращать другую комбинацию значений ([1,2], [2,1], [1,2] и так далее). Аналогичная ситуация возникает при передаче случайной функции в качестве фактического аргумента.

Call-by-name известен многим разработчикам компиляторов по интересным " thunks ", которые используются для его реализации. Дональд Кнут разработал " тест man or boy ", чтобы отделить компиляторы, которые правильно реализовали " рекурсию и нелокальные ссылки". Этот тест содержит пример call-by-name.

Зарезервированные слова ALGOL 60 и ограниченные идентификаторы

В стандартном подъязыке больших систем Берроуза имеется 35 таких зарезервированных слов :

В стандартном подъязыке Burroughs Large Systems имеется 71 такой ограниченный идентификатор:

а также названия всех внутренних функций.

Стандартные операторы

Примеры и проблемы переносимости

Сравнение образцов кода

АЛГОЛ 60

процедура Absmax(a) Размер:(n, m) Результат:(y) Индексы:(i, k); значение n, m; массив a; целое число n, m, i, k; действительное число y; комментарий Абсолютный наибольший элемент матрицы a, размером n на m, копируется в y, а индексы этого элемента — в i и k;начало  целого числа p, q; у := 0; я := к := 1; для p := 1 шаг 1 до тех пор, пока n не выполнить  для q := 1 шаг 1 до тех пор , пока m не выполнить  if abs(a[p, q]) > y then  begin y := abs(a[p, q]); я := р; к := д конец конец Абсмакс

Реализации различаются тем, как должен быть написан текст, выделенный жирным шрифтом. Слово 'INTEGER', включая кавычки, должно использоваться в некоторых реализациях вместо integer , выше, тем самым обозначая его как особое ключевое слово.

Ниже приведен пример создания таблицы с использованием АЛГОЛа Эллиотта 803 : [20]

ТЕСТ АЛГОЛА С ПЛАВАЮЩЕЙ ТОЧКОЙ НАЧАЛО РЕАЛЬНЫХ A,B,C,D' ЧИТАЙТЕ D' ДЛЯ A:= 0.0 ШАГ D ДО 6.3 ДО НАЧИНАТЬ ПЕЧАТЬ ПЕРФОРАТОРА(3) ,££L??' B := SIN(A)' С := COS(A)' ПЕЧАТЬ ПЕРФОРАТОРА(3) , ОДИНАКОВАЯ СТРОКА , ВЫРОВНЕННАЯ(1,6) ,A,B,C' КОНЕЦ' КОНЕЦ'

Семейство АЛГОЛ 60

Поскольку ALGOL 60 не имел средств ввода-вывода, в ALGOL нет переносимой программы hello world . Следующая программа могла бы (и все еще будет) компилироваться и запускаться на реализации ALGOL для мэйнфрейма Unisys A-Series и является простым упрощением кода, взятого из The Language Guide [21] на кафедре компьютерных и информационных наук Мичиганского университета в Дирборне Hello world! Страница программы-примера ALGOL. [22]

НАЧИНАТЬ ФАЙЛ F(ТИП=УДАЛЕННЫЙ); МАССИВ EBCDIC E[0:11]; ЗАМЕНИТЕ E НА "ПРИВЕТ, МИР!"; ЗАПИСЬ(Ф, *, Э);КОНЕЦ.

Где * и т. д. представляли спецификацию формата, используемую в FORTRAN, например [23]

Более простая программа, использующая встроенный формат:

 НАЧАЛО  ФАЙЛА  F ( ТИП = УДАЛЕННЫЙ );  ЗАПИСЬ ( F ,  < "ПРИВЕТ, МИР!" > );  КОНЕЦ .

Еще более простая программа, использующая оператор Display:

НАЧАЛО  ОТОБРАЖЕНИЯ ( "ПРИВЕТ, МИР!" )  КОНЕЦ .

Альтернативный пример, использующий ввод-вывод Эллиотта Алгола, выглядит следующим образом. Эллиотт Алгол использовал разные символы для "open-string-quote" и "close-string-quote", представленные здесь как  ' и  ' .

 программа HiFolks ; начало печати ' Привет, мир ' конец ;      

Вот версия для Elliott 803 Algol (A104). Стандартный Elliott 803 использовал бумажную ленту с 5 отверстиями и, таким образом, имел только верхний регистр. В коде отсутствовали символы кавычек, поэтому £ (знак фунта) использовался для открытия кавычек, а ? (знак вопроса) для закрытия кавычек. Специальные последовательности заключались в двойные кавычки (например, £L?? создавал новую строку на телетайпе).

 HIFOLKS' НАЧИНАТЬ ПЕЧАТЬ £ПРИВЕТ, МИР£L??' КОНЕЦ'

Версия Algol I/O серии ICT 1900 допускала ввод с бумажной ленты или перфокарты. Режим бумажной ленты «full» допускал строчные буквы. Вывод осуществлялся на строчный принтер. Обратите внимание на использование '(', ')' и %. [24]

 «ПРОГРАММА» (ПРИВЕТ) 'НАЧИНАТЬ' «КОММЕНТАРИЙ» ОТКРЫТАЯ КАВАЧКА — ЭТО «(», ЗАКРЫТАЯ КАВАЧКА — ЭТО «)», МЕСТО ДЛЯ ПЕЧАТИ ДОЛЖНО БЫТЬ ЗАПИСЫВАТЬСЯ КАК %, ПОТОМУ ЧТО ПРОБЕЛЫ ИГНОРИРУЮТСЯ; НАПИШИТЕ ТЕКСТ('('ПРИВЕТ%МИР')'); 'КОНЕЦ' 'ЗАКАНЧИВАТЬ'

ПРЫГНУТЬ

LEAP — это расширение языка программирования ALGOL 60, которое обеспечивает ассоциативную память троек. Три элемента в тройке обозначают связь, что Атрибут Объекта имеет определенное Значение. LEAP был создан Джеромом Фельдманом (Калифорнийский университет в Беркли) и Полом Ровнером (MIT Lincoln Lab) в 1967 году. LEAP также был реализован в SAIL.

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

Ссылки

  1. ^ Кнут, Дональд Э. (декабрь 1964 г.). «Нормальная форма Бэкуса против формы Бэкуса-Наура». Сообщения ACM . 7 (12): 735–6. doi : 10.1145/355588.365140 . S2CID  47537431.
  2. ^ Цитата премии ACM / Питер Наур, 2005 г.
  3. ^ ван Эмден, Маартен (2014). «Как рекурсия попала в программирование: история интриг, предательства и продвинутой семантики языков программирования». Место программиста .
  4. ^ Хоар, К. А. Р. (декабрь 1973 г.). «Советы по проектированию языков программирования» (PDF) . стр. 27.(Это утверждение иногда ошибочно приписывают Эдсгеру В. Дейкстре , также участвовавшему в реализации первого компилятора ALGOL 60. )
  5. ^ Абельсон, Хэл ; Дибвиг, Р.К.; и др. Рис, Джонатан; Клингер, Уильям (ред.). "Пересмотренный(3) отчет о схеме алгоритмического языка (посвященный памяти АЛГОЛа 60)" . Получено 20 октября 2009 г.
  6. Энциклопедия компьютерных языков. Архивировано 27 сентября 2011 г. на Wayback Machine.
  7. ^ Daylight, EG (2011). «Объединяющий клич Дейкстры для обобщения: появление рекурсивной процедуры, конец 1950-х – начало 1960-х». The Computer Journal . 54 (11): 1756–1772. doi :10.1093/comjnl/bxr002.
  8. ^ Kruseman Aretz, FEJ (30 июня 2003 г.). "Компилятор Dijkstra-Zonneveld ALGOL 60 для Electrologica X1" (PDF) . Программная инженерия . История компьютерных наук. Амстердам: Centrum Wiskunde & Informatica. ISSN  1386-3711. Архивировано из оригинала (PDF) 2004-01-17.
  9. Айронс, Эдгар Т., Синтаксически направленный компилятор для ALGOL 60, Communications of the ACM, т. 4, стр. 51. (январь 1961 г.)
  10. ^ Курц, Томас Э. (1978). "БЕЙСИК". История языков программирования . С. 515–537. doi : 10.1145/800025.1198404 . ISBN 0127450408.
  11. ^ Gries, D.; Paul, M.; Wiehle, H. R (1965). «Некоторые методы, используемые в ALCOR Illinois 7090». Сообщения ACM . 8 (8): 496–500. doi : 10.1145/365474.365511 . S2CID  18365024.
  12. ^ Bayer, R.; Gries, D.; Paul, M.; Wiehle, HR (1967). "Посмертный сброс ALCOR Illinois 7090/7094". Сообщения ACM . 10 (12): 804–808. doi : 10.1145/363848.363866 . S2CID  3783605.
  13. ^ Rechenautomaten mit Trommelspeicher, Förderverein der Technischen Sammlung Dresden
  14. ^ Мунье-Кун, Пьер (2014). «Algol во Франции: от универсального проекта к встроенной культуре». IEEE Annals of the History of Computing . 36 (4): 6. ISSN  1058-6180.
  15. Курц, op. cit. , стр. 517.
  16. ^ Буссар, Жан-Клод (июнь 1964 г.). Etude et réalisation d'un compilateur Algol60 sur Calculator éléctronique du type IBM 7090/94 et 7040/44 [ Разработка и реализация компилятора Algol60 на электронных калькуляторах IBM 7090/94 и 7040/44 ] (доктор философии) (на французском языке). Университет Жозефа-Фурье - Гренобль I.
  17. Клод Пэйр (27 апреля 1965 г.). Описание компилятора АЛГОЛА . Группа пользователей Европейского региона 1620 . ИБМ.
  18. ^ Круземан Арец, FEJ (1973). Компилятор Алгола 60 в Алголе 60 . Трактаты Математического центра. Амстердам: Математический центр.
  19. ^ Ахо, Альфред В.; Сети , Рави ; Ульман, Джеффри Д. (1986). Компиляторы: принципы, методы и инструменты (1-е изд.). Addison-Wesley. ISBN 978-0-201-10194-2., Раздел 7.5 и ссылки в нем
  20. ^ "803 ALGOL", руководство для Elliott 803 ALGOL
  21. ^ "Язык программирования ALGOL". www.engin.umd.umich.edu . Архивировано из оригинала 10 февраля 2010 . Получено 11 января 2022 .
  22. ^ "Hello world! Example Program". www.engin.umd.umich.edu . Архивировано из оригинала 4 февраля 2010 . Получено 11 января 2022 .
  23. ^ Fortran#Пример "Hello, World!"
  24. ^ "ICL 1900 series: Algol Language". Техническая публикация ICL 3340. 1965.

Дальнейшее чтение

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