spamsink: (Default)
[personal profile] spamsink
Знаковый для мирового программирования язык Алгол-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(|<XXXXXX|>);

_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 - его тогда ещё не придумали. Зато в этой кодировке был символ ⏨, специально введённый в Алгол для обозначения порядка чисел с плавающей точкой. А то что это ещё за фортрановское Е? Е - это основание натуральных логарифмов.

Date: 2024-07-30 09:15 pm (UTC)
From: [personal profile] dijifi
Фортрановское E от слова экспонента, разве нет?
Edited Date: 2024-07-30 09:15 pm (UTC)

Date: 2024-07-30 09:18 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Кабы будь у них ещё место в памяти, они могли б там виртуальный диск держать, и не надо было бы одну и ту же перфоленту втыкать каждый раз. Мы с Гришей так сделали когда-то на М6000, пока ещё ни магнитных лент, ни дисков не было у нас. Сильно облегчилась тогда жизнь программистов. Тем более, что ленты рвутся.

Page generated Mar. 21st, 2026 03:42 pm
Powered by Dreamwidth Studios