[personal profile] waspagv
Люди моего поколения еще помнят, что компьютеры появились не сразу в виде смартфонов и планшетов. Когда-то они были очень большие и занимали целый зал. Несколько сотен операций в секунду считалось высокой скоростью. И языки программирования - это не только Си и 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. Если справлюсь с ленью, напишу об этом позже. :)
Date: 21 January 2015 19:12 (UTC)

From: [identity profile] 2born.livejournal.com
Помню, в учебнике алгебры за 8 (или даже 7?) класс последние три параграфа были посвящены ЭВМ, причем самый последний - алголу!!!
Date: 21 January 2015 19:20 (UTC)

From: [identity profile] waspagv.livejournal.com
Да-да! 8-й класс. Там рассматривалась алгол-программа решения квадратного уравнения.
Date: 21 January 2015 19:21 (UTC)

From: [identity profile] 2born.livejournal.com
Да-да-да! И как-то сразу стало понятно, что ЭВМ - это не что-то потусторонее)))
Date: 21 January 2015 19:59 (UTC)

From: [identity profile] nicolas-alan.livejournal.com
может я невнимательно читал и что-то пропустил, но подобное обращение к функции и в FORTRAN-е и в С++ - вполне распостранённое и обычное явление

не могу понять вашего восторга АЛГОЛ-ом

уж если неудовлетворяет С++, то есть FORTRAN90 с вполне современными компиляторами под Виндоуз (только не говорите мне, что в Люниксе программировать и работать удобнее чем в Винде - подобные высказывания я считаю пустыми понтами)
Date: 22 January 2015 00:56 (UTC)

From: [identity profile] nicolas-alan.livejournal.com
внимательно перечитал это ещё раз

подобная процедура в С++ решается с использование класса и его метода.

в фортране-90 тоже самое можно реализовать простой записью

a(1:10)=0.

параметры можно менять, как слева, так и справа, всё может являться пременными

в С++

реализуется класс, а в нём метод и вместо обозначения переменной с итератором передаётся только идентификатор объекта и значение итератора, или ссылка на итератор, или например обращение к функции, возвращающее объект обрабатываемого класса, вообщем вариантов масса

и да.

такой хитровыверт уже неактуален, достаточно современных средств.

Но если, конечно, вы любитель ретро и получаете кайф от ретро, то конечно же - why not?
Edited Date: 22 January 2015 00:59 (UTC)

Профиль

waspagv: (Default)
DCS Foyle

March 2025

M T W T F S S
     12
3456789
10111213141516
17181920212223
242526272829 30
31      

Style Credit

Expand Cut Tags

No cut tags
Page generated 04/07/2025 04:10
Powered by Dreamwidth Studios