Введение

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

Сроки внедрения ALGOL 60

На сегодняшний день существует не менее 70 дополнений, расширений, производных и подязыков ALGOL 60. НазваниеГодАвторСтатусОписаниеЦелевой процессор X1 ALGOL 60 Август 1960 Эдсгер В. Дикстра и Жаап А. Зонневельд Первая реализация ALGOL 60 Electrologica X1 Algol 1960 Эдгар Т. Ирсон ALGOL 60 CDC 1604 Burroughs Algol (несколько вариантов) 1961 Burroughs Corporation (с участием Хоаре, Дикстра и других) Основа компьютеров Burroughs (и теперь Unisys MCP) Burroughs Large Systems и систем среднего диапазона Case ALGOL 1961 Simula первоначально разрабатывалась как расширение для моделирования Case ALGOL UNIVAC 1107 GOGOL 1961 Уильям М. МакКейман Для ODIN системы совместного использования времени PDP 1 DASK ALGOL 1961 Питер Наур, Йорн Йенсен ALGOL 60 DASK в Regnecentralen SMIL ALGOL 1962 Торгиль Экман, Карл Эрик Фрёберг ALGOL 60 SMIL в Lund University GIER ALGOL 1962 Питер Наур, Йорн Йенсен ALGOL 60 GIER в Regnecentralen Dartmouth ALGOL 30 1962 Томас Юджин Куртц, Стивен Дж. Гарланд, Роберт Ф. Харгрейвс, Энтони У. Кнапп, Хорхе Льясер ALGOL 60 LGP 30 Alcor Mainz 2002 1962 Урсула Хилл Самэльсон, Ханс Лангмаак Siemens 2002 ALCOR Illinois 7090 1962 Манфред Пауль, Ханс Рюдигер Виле, Дэвид Гриз, и Рудольф Байер ALGOL 60 Реализовано в Illinois и TH München 1962 1964 IBM 7090 USS 90 Algol 1962 Л. Петроне Elliott ALGOL 1962 C. A. R. Hoare Обсуждалось в его лекции 1980 года, удостоенной премии Тьюринга Elliott 803 & the Elliott 503 ALGOL 60 1962 Роланд Штробель Реализовано Институтом прикладной математики, Германской академией наук в Берлине Zeiss Rechenautomat ZRA 1 ALGOL 60 1962 Бернар Вокуа, Луи Боллие Institut d'Informatique et Mathématiques Appliquées de Grenoble (IMAG) и Compagnie des Machines Bull Bull Gamma 60 Algol Translator 1962 G. van der Mey и W. L. van der Poel Staatsbedrijf der Posterijen, Telegrafie en Telefonie ZEBRA Kidsgrove Algol 1963 F. G. Duncan English Electric Company KDF9 SCALP 1963 Стивен Дж. Гарланд, Энтони У. Кнапп, Томас Юджин Куртц Self Contained Algol Processor для подмножества ALGOL 60 LGP 30 VALGOL 1963 Вал Шорре Тест компилятора META II FP6000 Algol 1963 Роджер Мур Написано для Saskatchewan Power Corp FP6000 Whetstone 1964 Брайан Рэнделл и Лоуфорд Джон Рассел Atomic Power Division of English Electric Company. Предшественник Ferranti Pegasus, National Physical Laboratories ACE и English Electric DEUCE реализаций English Electric Company KDF9 ALGOL 60 1964 Жан-Клод Буссар fr IBM 7090 ALGOL 60 1965 fr Centre de calcul de la Faculté des Sciences de Nancy IBM 1620 Dartmouth ALGOL 1965 Стивен Дж. Гарланд, Сарр Блумсон, Рон Мартин ALGOL 60 Dartmouth Time Sharing System для GE 235 NU ALGOL 1965 UNIVAC ALGOL 60 1965 F. E. J. Kruseman Aretz MC компилятор для EL X8 Electrologica X8 ALGEK 1965 Минск 22 АЛГЭК, основанный на ALGOL 60 и поддержке COBOL, для экономических задач MALGOL 1966 Публ. A. Viil, M Kotli & M. Rakhendi, Минск 22 ALGAMS 1967 Группа автоматизации программирования для машин среднего класса (ГАМС), сотрудничество Академий наук Comecon Comecon Минск 22, позже ES EVM, BESM ALGOL/ZAM 1967 Польский компьютер ZAM Китайский Algol 1972 Китайские символы, выраженные через систему символов DG/L 1972 DG Eclipse семейство компьютеров NASE 1990 Эрик Шенфельдер Интерпретатор Linux и MS Windows MARST 2000 Андрей Махорин ALGOL 60 to C транслятор Все CPU, поддерживаемые GNU Compiler Collection; MARST является частью проекта GNU Диалекты Burroughs включали специальные диалекты системного программирования, такие как ESPOL и NEWP.

Свойства

ALGOL 60, как официально определено, не имел средств ввода/вывода; реализации определяли их самостоятельно, зачастую несовместимым друг с другом образом. В отличие от него, ALGOL 68 предлагал обширную библиотеку транспаутов (термин ALGOL 68 для обозначения ввода/вывода). ALGOL 60 предоставлял две стратегии вычисления для передачи параметров: общепринятый вызов по значению и вызов по имени. Объявление процедуры определяло для каждого формального параметра, какая из них должна использоваться: `value` указывалось для вызова по значению, а опускалось для вызова по имени. Вызов по имени имеет некоторые эффекты, отличающиеся от вызова по ссылке. Например, без явного указания параметров как передаваемых по значению или по ссылке, невозможно разработать процедуру, которая поменяет местами значения двух параметров, если фактические параметры, передаваемые в процедуру, – это целочисленная переменная и массив, индексируемый этой же целочисленной переменной. Представьте себе передачу указателя на функцию `swap(i, A[i])`. Теперь, каждый раз при обращении к `swap`, происходит его повторное вычисление. Допустим, `i := 1` и `A[i] := 2`, тогда при каждом обращении к `swap` будет возвращаться другая комбинация значений ([1, 2], [2, 1], [1, 2] и так далее). Аналогичная ситуация возникает при передаче случайной функции в качестве фактического аргумента. Вызов по имени известен многим разработчикам компиляторов благодаря интересным "прослойкам" (thunks), используемым для его реализации. Дональд Кнут разработал "тест «мужчина или мальчик»" для отделения компиляторов, правильно реализовавших "рекурсию и нелокальные ссылки". Этот тест содержит пример вызова по имени.

LEAP (полное название)

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