ALGOL 60 (сокращение от Algorithmic Language 1960 ) является членом семейства языков программирования ALGOL . Он появился после ALGOL 58 , в котором были введены блоки кода и пары и для их разграничения, что стало ключевым шагом в развитии структурного программирования . ALGOL 60 был одним из первых языков, реализующих определения функций (которые можно было вызывать рекурсивно). Определения функций ALGOL 60 могли быть вложены друг в друга (что было впервые введено любым языком программирования) с лексической областью действия . Он дал начало многим другим языкам, включая CPL , PL/I , Simula , BCPL , B , Pascal и C. Практически каждый компьютер той эпохи имел язык системного программирования, основанный на концепциях ALGOL 60.begin
end
Никлаус Вирт создал свой собственный 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]
На сегодняшний день существует не менее 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.
В стандартном подъязыке больших систем Берроуза имеется 35 таких зарезервированных слов :
ALPHA
ARRAY
BEGIN
BOOLEAN
COMMENT
CONTINUE
DIRECT
DO
DOUBLE
ELSE
END
EVENT
FALSE
FILE
FOR
FORMAT
GO
IF
INTEGER
LABEL
LIST
LONG
OWN
POINTER
PROCEDURE
REAL
STEP
SWITCH
TASK
THEN
TRUE
UNTIL
VALUE
WHILE
ZIP
В стандартном подъязыке Burroughs Large Systems имеется 71 такой ограниченный идентификатор:
ACCEPT
AND
ATTACH
BY
CALL
CASE
CAUSE
CLOSE
DEALLOCATE
DEFINE
DETACH
DISABLE
DISPLAY
DIV
DUMP
ENABLE
EQL
EQV
EXCHANGE
EXTERNAL
FILL
FORWARD
GEQ
GTR
IMP
IN
INTERRUPT
IS
LB
LEQ
LIBERATE
LINE
LOCK
LSS
MERGE
MOD
MONITOR
MUX
NEQ
NO
NOT
ON
OPEN
OR
OUT
PICTURE
PROCESS
PROCURE
PROGRAMDUMP
RB
READ
RELEASE
REPLACE
RESET
RESIZE
REWIND
RUN
SCAN
SEEK
SET
SKIP
SORT
SPACE
SWAP
THRU
TIMES
TO
WAIT
WHEN
WITH
WRITE
а также названия всех внутренних функций.
процедура 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' КОНЕЦ' КОНЕЦ'
Поскольку 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.