July 12th, 2021

lenin

Перефразируя Скалигера-Прокоповича

Вместо эпиграфа:

Если в мучительские осужден кто руки,
Ждет бедная голова печали и муки,
Не вели томить его делом кузниц трудных,
Не посылать в тяжкие работы мест рудных:
Пусть компилятор делает – то одно довлеет,
Всех мук роды сей един труд в себе имеет.


Будучи созданным комитетом лиц из академической среды, язык Алгол-60, по выражению википедии, в остальном довольно разумно организованный, содержит особенности, примечательные удивительным сочетанием полной практической бесполезности с чрезвычайной сложностью и неэффективностью реализации.

Вот одна из этих особенностей, о которой я недавно узнал. Полная реализация языка в соответствии с "Пересмотренным сообщением об Алголе-60" от 1962 года должна была компилировать следующую программу (детали синтаксиса оператора вывода могли варьироваться):
begin
    procedure call(Q); procedure Q;
        begin Q(3); end;
    procedure jump(A); label A;
        begin goto A end;
    procedure out(B); real B;
        begin print(` value', b) end;
    call(out);
    if true then
        call(jump)
    else
        3: print(` label 3')
end


Эта программа должна была успешно выполняться и печатать что-то типа "value 3.00000 label 3".

(Для тех, кто не любитель птичьих языков: цифра 3 в конструкции Q(3) в этой программе означает не пойми что - то ли число, то ли метку - и компилятор этого не знает, пока не просмотрит всю программу. Когда он это узнает, то выясняется, что так можно было, и нужно порождать выполняемый код.)

Большинство западных авторов компиляторов решило на это дело забить, и или просто не допускало числовые метки, или диагностировало в этом случае какую-нибудь ошибку, но не таковы были советские программисты.

Алгол БЭСМ-6 имени В. М. Курочкина компилирует и выполняет программу правильно.

К чести стандартизаторов языка, это безумие было в конце концов устранено в "Модифицированном сообщении об Алголе-60" к середине 1970-х годов путём ликвидации меток, обозначаемых числами.

This entry was originally posted at https://spamsink.dreamwidth.org/1220252.html. Please comment there using OpenID.