Вот были люди в своё время

Jul 30, 2024 12:51

Знаковый для мирового программирования язык Алгол-60 был впервые реализован в том же 1960 году двумя молодыми людьми из Нидерландов на нидерландском же компьютере Electrologica X1 (длина слова 27 бит, адресуемая память 32 Кслова, первоначально у машины было около 4К слов физической памяти).

Он был написан на примитивном ассемблере, и занимал в общей сложности около 4000 команд:

The compiler is about 2000 instructions long, another 2000
instructions support object-program execution. The latter 2000 instructions, constituting
the collection of organisational and arithmetic subroutines supporting object-program
execution, was baptized ‘the Complex’. All these 4000 instructions were written (and
tested) in no more than 9 months, quite a feat for a machine that was only put into use
at the Mathematical Centre in March 1960.

Язык при этом был реализован практически полностью, но
The greatest shortcoming of the system, however, was the almost complete absence of
syntax checks and run-time checks. At compile time most checks had to do with the
representation of the basic symbols on tape (mistrusting the proper functioning of the
Flexowriter punch and the X1 tape reader) and with store management; there was also a
check on undeclared identifiers.

Для получения выполняемой программы в процессе компиляции вводить различные перфоленты могло понадобиться вплоть до 9 раз.

Один из членов команды, написавшей впоследствии компилятор Алгола-60 для более новой модели машины (Electrologica X8), выйдя на пенсию, не поленился воспроизвести текст ассемблерной версии оригинального компилятора (несколько более новой, рассчитанной на машину с полной памятью, и не требовавшей вводить перфоленту с исходным текстом дважды, а сохранявшей текст программы в памяти; в остальном разница с оригиналом несущественна), с комментариями на голландском, а также переписать компилятор на Паскале (что потребовало около 2000 строк) и подробно описать историю создания и механизм работы компилятора.

Список ошибок, явно распознаваемых в процессе компиляции, невелик (стр. 319 PDF). Из забавного можно отметить
"A letter combination in the Algol text is underlined only in part". Дело в том, что авторы языка хотели позволить в качестве идентификаторов совершенно любые слова, в том числе и буквально совпадающие со служебными. Для этого служебные слова в типографском представлении программ выделялись подчеркиванием, например, begin integer i; i := 1 end, а для ввода их в машину, чтобы всё красиво печаталось на пишмашинке Flexowriter, Эдсгер Дейкстра и Яап Зонневельд решили так и предварять каждую букву служебных слов символом подчеркивания, например, _b_e_g_i_n _i_n_t_e_g_e_r i; i := 1 _e_n_d (впоследствии в других реализациях использовался преимущественно или один символ подчеркивания перед первой буквой служебных слов, _begin , или взятие их в кавычки, 'begin'). Сколько лишнего времени было убито на набивание этих избыточных подчеркиваний - бог весть.

Самое интересное то, что Паскаль-программу из статьи вполне можно достать и запустить, и она даже работает и производит какой-то разумный вывод объектного кода.

Например, из

_b_e_g_i_n
_i_n_t_e_g_e_r x;

_p_r_o_c_e_d_u_r_e A(s);
_s_t_r_i_n_g s;
_b_e_g_i_n
_e_n_d;

x := 1;
A(|);

_e_n_d

получается, после "дизассемблирования" кода, печатаемого в десятичном (!) виде,

023640: 0140 START
023641: 0522023645 2T 023645 A переход на начало программы
023642: 0422000001 2B 000001 A
023643: 0131 SCC начало процедуры
023644: 014 RET конец процедуры
023645: 0422000212 2B 000212 A адрес х
023646: 021 TIAS
023647: 0422023663 2B 023663 A константа 1
023650: 042 TIRS
023651: 0125 ST записали
023652: 0422023642 2B 023642 A адрес процедуры
023653: 0522023660 2T 023660 A перепрыг через строку
023654: 017036074 1A 036074 C Z XXX
023655: 077636074 Y 7A 036074 C E XX\377
023656: 015 EIS
023657: 04023654 0A 023654 B адрес строки
023660: 022000001 2A 000001 A
023661: 011 ETMP вызов процедуры
023662: 0141 STOP
023663: 01

Кодировка символов, разумеется, не ASCII - его тогда ещё не придумали. Зато в этой кодировке был символ ⏨, специально введённый в Алгол для обозначения порядка чисел с плавающей точкой. А то что это ещё за фортрановское Е? Е - это основание натуральных логарифмов.

retrocomputing

Previous post Next post
Up