Category: it

Category was added automatically. Read all entries about "it".

инспектор

Алгол жив!

Люди моего поколения еще помнят, что компьютеры появились не сразу в виде смартфонов и планшетов. Когда-то они были очень большие и занимали целый зал. Несколько сотен операций в секунду считалось высокой скоростью. И языки программирования - это не только Си и Visual Basic. Люди еще постарше (я - исключение) помнят такой язык Алгол-60. Число 60 в его названии - год официального опубликования описания этого языка. Причем, синтаксис его был описан с помощью формального языка БНФ - Нормальной Формы Бэкуса. В 60-е годы для этого языка создали массу трансляторов для самых разных машин. В СССР трансляторы с Алгола ТА-1М и ТА-2М работали на ЭВМ с системой команд М-20: М-220, М-222, БЭСМ-4. На советской транзисторной супер-ЭВМ было несколько трансляторов этого языка: ГДР-Алгол, БЭСМ-Алгол, система "Альфа" и др. В книгах и журналах публиковалась масса алгоритмов для решения самых разных (но большей частью вычислительных) задач на языке Алгол. Я уже упоминал книгу Уилкинсона и Райнша "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра", который содержит программы непревзойденного качества.

Алгол-60 имеет, среди прочих, особенность, которая не встречается в современных языках. Это передача параметра в процедуру по наименованию. Нынешние программисты знают два способа: по значению (единственный способ в Си) и по ссылке. Передача по имени отличается и от того, и от другого, потому что в процедуру передается не значение переменной и не указатель на место в оперативной памяти. Передача выполняется так, как будто фактический параметр подставляется в процедуру вместо формального. С непривычки трудно уловить разницу. Но вот вам пример использования такой передачи под названием "трюк Йенсена":

begin
  
  procedure p(a, b);
    integer a,b;
  begin
    for a:=1 step 1 until 10 do
      b := 0
  end p;

  integer i; integer array s[1:10];
  p(i,s[i])

end

Процедура p имеет два параметра, которые передаются по имени (в противном случае они были бы специфицированы как "value a,b;"). Первый параметр используется в качестве переменной цикла, а второму в этом цикле присваивается нулевое значение. При передача по ссылке (не говоря уже о передаче по значению) такой цикл лишен смысла. Зачем, в самом деле, 10 раз записывать в одно и то же место в памяти нуль? Но в том и фокус, что место это не одно и то же! При вызове процедуры фактическими параметрами являются i и s[i]. Способ передачи по наименованию предполагает подстановку параметров в тело процедуры. И получается, что выполняется следующий цикл:

for i:=1 step 1 until 10 do
      s[i] := 0

Согласитесь, это совсем другое дело. Кстати, хорошая задача для студентов-программистов: как можно реализовать такую передачу в трансляторе?

Но, казалось бы, время этого языка прошло. Ориентированный исключительно на вычисления, он непригоден для решения всех прочих задач. В частности, язык не содержит никаких средств для работы с символами, нет в нем и средств для создания интерфейса с пользователем. А откуда они могли взяться, если в 60-е гг. интерфейсом были устройство ввод перфокарт и АЦПУ (так тогда называли принтеры)? В то же время масса записанных на нем алгоритмов по-прежнему востребована, только перед употреблением эти алгоритмы переписываются на другие, современные языки: на тот же Си, например, или Фортран (в его нынешнем, не историческом виде).

И вот недавно я узнаю, что пациент еще не умер! Частью проекта GNU является конвертер marst с Алгола-60 на Си. Очень компактная программа прекрасно работает у меня в операционных системах на базе Linux, FreeBSD и даже под Windows в окружении CygWin. Конвертер прошел замечательный тест на зрелось - Man or Boy. А вот самый известный рабочий транслятор прошлого ТА-1М такой тест не пройдет, поскольку вообще не допускает рекурсию. С помощью marst я успешно транслировал оригинальный интегратор Булирша и Штёра и проверил некоторые недавние работы, касающиеся выявления устойчивых орбит в системе α Centauri. Если справлюсь с ленью, напишу об этом позже. :)