АЛГОЛ 60 (сокращение от Algorithmic Language 1960 ) — член семейства языков программирования АЛГОЛ . Он последовал за АЛГОЛом 58 , в котором были введены блоки кода и пары и для их разграничения, что представляет собой ключевой шаг на пути развития структурного программирования . АЛГОЛ 60 был одним из первых языков, реализующих определения функций (которые можно было вызывать рекурсивно). Определения функций ALGOL 60 могли быть вложены друг в друга (что впервые было введено в любом языке программирования) с лексической областью действия . Он породил множество других языков, включая CPL , PL/ I , Simula , BCPL , B , Pascal и C. Практически каждый компьютер той эпохи имел язык системного программирования, основанный на концепциях АЛГОЛ-60.begin
end
Никлаус Вирт основал свой собственный АЛГОЛ W на основе АЛГОЛА 60, прежде чем приступить к разработке Паскаля . Алгол-W должен был стать АЛГОЛом следующего поколения, но комитет АЛГОЛ 68 принял решение использовать более сложную и продвинутую конструкцию, а не очищенный упрощенный АЛГОЛ 60. Официальные версии АЛГОЛА названы в честь года их первой публикации. АЛГОЛ 68 существенно отличается от АЛГОЛА 60, и за это его частично критиковали, так что в целом «АЛГОЛ» относится к диалектам АЛГОЛА 60.
АЛГОЛ 60 – вместе с КОБОЛом – были первыми языками, которые стремились к стандартизации.
АЛГОЛ 60 использовался в основном учеными-исследователями в США и Европе. Его использованию в коммерческих приложениях препятствовало отсутствие стандартных средств ввода/вывода в его описании и отсутствие интереса к языку со стороны крупных поставщиков компьютеров. Однако АЛГОЛ 60 стал стандартом для публикации алгоритмов и оказал глубокое влияние на будущее развитие языка.
Джон Бэкус разработал метод нормальной формы Бэкуса для описания языков программирования специально для АЛГОЛа 58. Он был переработан и расширен Питером Науром для АЛГОЛа 60 и по предложению Дональда Кнута переименован в форму Бэкуса-Наура . [1]
Питер Наур: «Как редактор бюллетеня АЛГОЛ, я был вовлечен в международные дискуссии по этому языку и в ноябре 1959 года был выбран членом европейской группы разработчиков языков. В этом качестве я был редактором отчета об АЛГОЛ 60, подготовленного в результате встречи АЛГОЛ-60 в Париже в январе 1960 года». [2]
На встрече в Париже (с 11 по 16 января) присутствовали следующие люди:
Алан Перлис дал яркое описание встречи: «Встречи были утомительными, бесконечными и волнующими. Человек раздражался, когда хорошие идеи одного человека отбрасывались вместе с плохими идеями других. Тем не менее, усердие сохранялось в течение всего периода. 13 было превосходно».
Язык изначально не включал рекурсию . Его включили в спецификацию в последнюю минуту, вопреки желанию некоторых членов комитета. [3]
АЛГОЛ 60 вдохновил множество последовавших за ним языков. Тони Хоар заметил: «Это язык, настолько опередивший свое время, что он стал улучшением не только своих предшественников, но и почти всех своих преемников». [4] [5]
На сегодняшний день существует не менее 70 дополнений, расширений, производных и подъязыков Алгола 60. [6]
Диалекты Берроуза включали специальные диалекты системного программирования, такие как ESPOL и NEWP .
Алгол 60 в официальном определении не имел средств ввода-вывода; реализации определяли свои собственные способами, которые редко были совместимы друг с другом. Напротив, АЛГОЛ 68 предлагал обширную библиотеку средств передачи (на языке АЛГОЛ 68 означает ввод/вывод).
АЛГОЛ 60 предоставил две стратегии оценки передачи параметров : общий вызов по значению и вызов по имени . В объявлении процедуры указано для каждого формального параметра, который должен был использоваться: значение , указанное для вызова по значению и опущенное для вызова по имени. Вызов по имени имеет определенные эффекты в отличие от вызова по ссылке . Например, без указания параметров как value или reference невозможно разработать процедуру, которая будет менять местами значения двух параметров, если фактические передаваемые параметры представляют собой целочисленную переменную и массив, индексированный той же целочисленной переменной. . [19] Представьте себе передачу указателя на swap(i, A[i]) в функцию. Теперь, когда каждый раз упоминается swap, он пересчитывается. Скажем, i := 1 и A[i] := 2, поэтому при каждом обращении к swap он будет возвращать другую комбинацию значений ([1,2], [2,1], [1,2] и т. д. на). Аналогичная ситуация возникает со случайной функцией, переданной в качестве фактического аргумента.
Функция вызова по имени известна многим разработчикам компиляторов благодаря интересным « thunks », которые используются для ее реализации. Дональд Кнут разработал « тест мужчины или мальчика » для разделения компиляторов, которые правильно реализовали « рекурсию и нелокальные ссылки». Этот тест содержит пример вызова по имени.
В стандартном подъязыке Burroughs Large Systems 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, м; массив а; целое число n, m, i, k; правда ;комментарий Абсолютный наибольший элемент матрицы a размером n на m, копируется в y, а индексы этого элемента в i и k;начать целое число p, q; у := 0; я := к := 1; for p := 1 шаг 1 до n делать for q := 1 шаг 1 до m делать if abs(a[p, q]) > y then start y := abs(a[p, q]); я := р; к := q конец конец Абсмакс
Реализации различаются тем, как должен быть написан текст, выделенный жирным шрифтом. Слово «ЦЕЛОЕ», включая кавычки, должно использоваться в некоторых реализациях вместо целого числа , приведенного выше, тем самым обозначая его как специальное ключевое слово.
Ниже приведен пример создания таблицы с использованием Elliott 803 ALGOL: [20]
АЛГОЛ ТЕСТ С ПЛАВАЮЩЕЙ ТОЧКОЙ' НАЧИНАЙТЕ НАСТОЯЩЕЕ A,B,C,D' ЧИТАЙТЕ Д' ДЛЯ A:= 0,0 ШАГ D ДО 6,3 DO НАЧИНАТЬ ПУФОН ДЛЯ ПЕЧАТИ(3) ,££L??' Б := SIN(A)' C := COS(A)' ПУФОН ДЛЯ ПЕЧАТИ(3) , ОДНА ЛИНИИ , ВЫРАВНИВАНИЕ(1,6) , A,B,C' КОНЕЦ' КОНЕЦ'
Поскольку в АЛГОЛе 60 не было средств ввода-вывода, в АЛГОЛе нет переносимой программы hello world . Следующая программа может (и будет) компилироваться и запускаться на реализации ALGOL для мэйнфрейма Unisys серии A и представляет собой простое упрощение кода, взятого из The Language Guide [21] в Мичиганском университете - Дирборн, компьютерные и информационные науки. Отдел Привет, мир! Страница примера программы АЛГОЛ. [22]
НАЧИНАТЬ ФАЙЛ F(ВИД=УДАЛЕННЫЙ); EBCDIC МАССИВ E[0:11]; ЗАМЕНИТЕ E НА «HELLO WORLD!»; ЗАПИСАТЬ(Ф, *, Е);КОНЕЦ.
Где * и т. д. представляют спецификацию формата, используемого в FORTRAN, например [23]
Более простая программа, использующая встроенный формат:
НАЧАТЬ ФАЙЛ F ( ВИД = УДАЛЕННЫЙ ); WRITE ( F , < "HELLO WORLD!" > ); КОНЕЦ .
Еще более простая программа, использующая оператор Display:
НАЧАЛО ОТОБРАЖЕНИЯ ( «ПРИВЕТ, МИР!» ) КОНЕЦ .
Альтернативный пример использования ввода-вывода Elliott Algol выглядит следующим образом. Эллиот Алгол использовал разные символы для «цитат открытой строки» и «кавычек закрытой строки», представленных здесь как ' и ' .
программа HiFolks ; начало печати ' Привет, мир ' конец ;
Вот версия для Elliott 803 Algol (A104). В стандартном Elliott 803 использовалась бумажная лента с 5 отверстиями, поэтому в ней были только заглавные буквы. В коде отсутствовали символы кавычек, поэтому для открытой кавычки использовался £ (знак фунта), а ? (знак вопроса) для закрытия цитаты. Специальные последовательности заключались в двойные кавычки (например, £L?? выводила на телетайпе новую строку).
ПРИВЕТ НАРОД' НАЧИНАТЬ НАПЕЧАТАЙТЕ £HELLO WORLD£L??' КОНЕЦ'
Версия Algol I/O серии ICT 1900 позволяла вводить данные с бумажной ленты или перфокарты. В режиме «заполнения» бумажной ленты разрешен нижний регистр. Вывод осуществлялся на построчный принтер. Обратите внимание на использование символов «(», «)» и %. [24]
«ПРОГРАММА» (ПРИВЕТ) 'НАЧИНАТЬ' 'КОММЕНТАРИЙ' ОТКРЫТАЯ ЦИТАТА '(', ЗАКРЫТЬ ЕСТЬ ')', ПРОСТРАНСТВО ДЛЯ ПЕЧАТИ ДОЛЖНО БУДЕТ НАПИСАНО КАК %, ПОТОМУ ЧТО ПРОБЕЛЫ ИГНОРИРУЮТСЯ; НАПИСАТЬ ТЕКСТ('('HELLO%WORLD')'); 'КОНЕЦ' 'ЗАКАНЧИВАТЬ'
LEAP — это расширение языка программирования АЛГОЛ 60, обеспечивающее ассоциативную память троек. Три элемента в тройке обозначают связь с тем, что атрибут объекта имеет определенное значение. LEAP был создан Джеромом Фельдманом (Калифорнийский университет в Беркли) и Полом Ровнером (Лаборатория Линкольна Массачусетского технологического института) в 1967 году. LEAP также был реализован в SAIL.