ALGOL 68, основа всех современных языков
Цель этого листа - дать обзор синтаксиса ALGOL 68 и показать, как язык повлиял на его преемников, включая C, Pascal и все C-подобные языки, особенно Go. Подробное описание языка см. в руководствах, ссылки на которые приведены в нижней части страницы.
Первый компилятор ALGOL 68 был разработан в 1970 году Пеком, Костером, Майю и Вейнгаарденом в рабочей группе IFIP. Никлаус Вирт и Тони Хоар уже разработали ALGOL W, другой преемник ALGOL 60, в 1966 году.
ALGOL W был основой для языка Pascal, который также появился в 1970 году и занял, по сути, место универсального языка, который авторы предназначали для ALGOL 68. Однако последний вдохновил все C-подобные языки.
Описание языка ALGOL 68
Сложность ALGOL 68 фактически затруднит понимание современного программиста, что не очевидно в коде ниже, который ограничен простейшим синтаксисом.
Типы
- int: Целое число.
- bool.
- реал: Реальное число.
- compl: Комплексное число.
- чар.
- строка: строка.
- байты: пара символов.
- struct.
- пустота.
- bits: Битовая строка.
- файл: Файл.
Следует отметить, что, логически, вещественное число представляется вещественным типом, принятым Паскалем, в то время как C использует float, что является названием представления памяти: «floating point» или «floating point». А за C по глупости следовали большинство последующих языков.
Строковый тип также заменяется в C на char *, но позже он вернётся в C++ и современных языках.
Для числовых типов модификаторы long и short задают количество байтов представления памяти, которое принимается В.
Предварительно определенные значения:
- nil: Nothing, сокращение от «nihil» (ничто) или акроним от «Not In List» в языке Лисп.
- true, false.
Операторы
Большинство из них найдены в C.
- ( )
- , Разделитель.
- ; Терминатор.
- :Терминатор.
- =,: = Назначение.
- [] Объявление среза, индекса или массива.
- +, -, * ,/, ^,%,% *: Арифметика.
- + также является оператором конкатенации строк.
- * может также умножать символ или строку.
- >, >=, <, <=,
- =, eq: Равно.
- ~ = ,/=, ne: не равно .
- + =, * = ,/=: Упрощенное назначение .
- #, co, comment: Comment, заканчивается тем же символом .
- &, и, или: логические операторы.
Не равный оператор - самый спорный. ALGOL 68 имеет несколько вариантов, Паскаль использует <>, C использует! = вместо, что принято всеми C-подобными операторами. ~ = позже вновь появляется в Lua.
Назначение и декларация
Задания:
a := 10;
a := b := c := 10; // 10 assigned to a, b, and c.
a + := b; // equivalent to a := a + b
+ можно заменить любым другим арифметическим оператором.
Декларации:
int i = 10;
real r = 1.2;
[]int ai = (2,5,89,6,3);
[]string astr = ("a", "b", "hello");
[1:2,4:5]int mi = ((10,20), (100,200)); // Two-dimensional array.
Постоянный и переменный
int i = 10;
int j := 20;
i - константа, в то время как j - переменная. Это не использовалось ни в одном другом языке.
Индексирование и нарезка
[]int ai = (10,20,30,40,50);
ai [2] возвращает 30.
ai [2:3] возвращает 40,50.
Язык имеет сложный синтаксис доступа к содержимому многомерного массива, или строки, что излишне усложняет разработку компилятора.
Динамический массив
Модификатор flex позволяет определить массив как массив переменного размера.
Структура
Объявление аналогично заголовку функции.
struct (int i, real r) s;
i of s := 10;
r of s := 1.23;
Эквивалент C будет:
struct s {
int i = 10;
real r = 1.23;
}
Паскаль решил использовать конструкцию записи, которая происходит от ALGOL 60, которая в свою очередь унаследовала её от COBOL. Оба являются сложными типами и предками классов.
Союз
В объединении переменные совместно используют одну и ту же область памяти, и поэтому одно и то же значение может быть доступно для различных типов .
union(int i, real r) u;
Если структура управления
Терминатор - это слово, если назад. Странный синтаксис, не встречающийся ни в одном другом последовавшем языке, даже в Паскале.
if condition then
...
[else ... ]
fi
или
if condition then
...
elif condition then
...
[else ...]
fi
для структуры управления
Он делает много вещей сразу.
for variable from start [by increment] to end [while condition] do
...
od
Пример:
for i from 1 to 10 while i ne 11 do
...
od
Различные части являются необязательными. Например
to 10 do ... od
выполняет цикл десять раз. Принимая во внимание, что:
for i while i < 11 do ... od
Выполняет цикл, пока выполняется условие.
Тенденция тогда заключалась в том, чтобы разделить структуру на несколько других: for, while, do until, for in. Однако язык го вернулся к этой компартментализованной структуре.
Позже Foreach был добавлен в ALGOL 68 компиляторами.
Структура контроля вариантов
Предок структуры управления кейсом коммутатора был более ограничен:
case variable in
statements,
statements,
...
esac;
Пример количества дней в месяцах года, с января по декабрь.
Переменная month имеет значение от 1 до 12.
case month in
31,
if year % 4 = 0 and year % 100 ~= 0 or year % 400 = 0 then 29 else fi;
31,30,31,30,31,31,30,31,30,31
esac;
Процедура
Возвращаемый тип помещается в конце заголовка, в отличие от C и встречается в некоторых современных языках; оно происходит от АЛГОЛ.
proc p = (int a, real b) real:
begin
...
end;
Параметры указаны в скобках; возвращаемый тип размещается после.
Возвращаемое значение является значением последнего выражения, вычисленного в теле процедуры. Идея, принятая языком Юлия.
Формат процедуры без параметров и без возвратов:
proc q = void:
begin
...
end;
Паскаль считал, что было бы хорошей идеей усложнить ситуацию, различая функции, которые возвращают значение, и процедуры, которые ничего не возвращают, двойственность, которая также существует в Фортране. Это регресс и ничего не добавляет. Кроме того, подпрограмма Fortran может возвращать сразу несколько значений, чего не хватает Паскалю.
Параллелизм
Процедуры могут выполняться параллельно с командой par:
par begin
...
end;
Сопрограммы го довольно похожи.
Заключение
Язык, кажется, был определен дискуссионной группой, где каждый хочет внести свои идеи для завершения языка и где никого не волнует конструкция компилятора, который будет его реализовывать. Это побудило Никлауса Вирта, чтобы получить мощный компилятор, создать Pascal на основе ALGOL, но избавившись от большой части элементов языка.
Тем не менее, многие из концепций, присутствующих в ALGOL, встречаются в его языках-преемниках, а некоторые, от которых отказались, вновь появляются в недавних языках, таких как Go и Julia. И наоборот, различные синтаксис и понятия других старых языков, таких как Tcl, Rebol и т. д. были забыты.
Ссылки: