vak: (Default)
[personal profile] vak
Заинтересовал [personal profile] spamsink меня алголами, я потыркался и вытащил на свет божий компилятор Algol W. Это исторический язык, разработанный легендарным Никлаусом Виртом в 1966 году как продолжение Алгола-60. Язык вполне развитый и имевший практическую полезность. Но в титанической борьбе Вирта с ван Вейнгаарденом победил Алгол-68, крайне сложный и бестолковый. На нём линия Алгола сникла и ушла в небытие.

После этого Вирт бросил Алгол и начал делать Паскаль. Дальнейшую историю вы знаете.

Изначальный компилятор Algol W был написан на ассемблере IBM/360. Исходники сохранились, но мало кого нынче интересуют. Нынешний компилятор Algol W был создан девять лет назад Глином Вебстером. Написан он в основном на языке OCaml и немного Си. Компилятор преобразует исходник на Алголе W в Си, и дальше компилирует его посредством GCC. Причём CLANG не годится, поскольку используются вложенные процедуры, не реализованные в кланге.

Из нетривиальных примеров на языке Algol W есть игра Wumpus: wumpus.alw

Date: 2021-07-15 04:01 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Ты уже понял, к чему я клоню?
begin
    procedure foo; begin a := b + c end;
    integer a, b, c;
    b := 3; c := 5;
    begin
        integer a, b, c;
        b := 30; c := 50;
        foo; write(a)
    end;
    foo; write(a)
end


Или ты будешь сразу смеяться, или после того, как я тебе скажу, что делает marst и бэсмовские компиляторы.

Date: 2021-07-15 06:22 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Всё честно. Просто тела процедур парсятся не сразу, а в конце объявлений блока. Поэтому foo работает с переменными верхнего уровня, откуда бы она ни вызывалась.

Date: 2021-07-15 07:06 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Но печатается-то локальная a!