вторник, 4 января 2022 г.

Шеркало 05.03: любимые системы программирования (Алгол-60 ч.2)

 - Подъём в погранистических войсках! Давай, Ёж, просыпайся и рассказывай, чем тебя тогда Алгол-60 разочаровал? Все же его вроде всегда хвалили, говорили, что он на кучу современных языков программирования прямо чуть ли не решающее влияние оказал? Что, врали?

- Нет, конечно не врали, влияние точно оказал... Дело в том, что Алгол изначально создавался не как практически реализуемое на компьютерах средство написания реальных программ, а скорее как удобная форма обмена (на бумаге в первую очередь) алгоритмами между учёными-математиками разных стран мира. Такой, вроде, алгоритмический язык "Эсперанто", псевдо-код для интуитивного понимания. А его практическое использование конечно подразумевалось, но только во вторую очередь. Наверное надо привести для примера картинку с текстом программы на Алголе:

Это не реальный текст с компьютера, это картинка из книжки. Можно сразу обратить внимание на несколько моментов:

1. Некоторые слова выделены жирным шрифтом - это ключевые слова языка (служебные слова). Разработчики Алгола считали, что служебные слова всегда должны ЯВНО отличаться от остальных слов. При бумажных публикациях их выделяли шрифтом, как в этом примере. А на реальных компьютерах, где не предусмотрено несколько различных шрифтов?

2. Программа (точнее процедура) красиво оформлена пробелами. Каждый оператор, каждый блок, выделяется своим уровнем отступа от левого края текста - так легче читать.

3. Меня лично немного фрустрирует заголовок процедуры (первая строка). Я с первой (да и со второй тоже) попытки не могу понять, что в контексте процедуры означают слова "Absmax, Size, Result, Subscripts". В каких случаях и для чего каждое из этих слов можно использовать, почему они не разделены запятыми или другими знаками препинания, в каком отношении друг к другу состоят? Почему "(n,m)" следует после "Size" кажется вроде понятно, но почему тогда "(a)" следует именно за "Absmax"? В этом какой-то скрытый смысл или случайное совпадение? А пара "n, m" в описании повторяется аж три раза. Это важно? Можно было повторить больше или меньше раз? А если описания в другом порядке переставить, что-то сломается или нет?

А теперь приведу другой пример, уже не из книжки. Это пример реального текста программы на Алголе-60 для реального компьютера. Мы запускали на БЭСМ-6 примерно вот такие программы:

'PROCEDURE'EULER(FCT,SUM,EPS,TIM);'VALUE'EPS,TIM;'INTEGER'TIM;'REAL' 'PROCEDURE'FCT;'REAL'SUM,EPS;
'COMMENT' EULER COMPUTES THE SUM OF FCT (I) FOR I FROM ZERO UP TO INFINITY BY MEANS OF A SUITABLY REFINED EULER TRANSFORMATION;'BEGIN''INTEGER'

          I,K,N,T;'ARRAY' M(/0:15/); 'REAL'MN, MP, DS;        I:=N:=T:=0;M(/0/):=FCT(0);SUM:=M(/0/)/2;NEXTTERM:I:=I+1;MN:=FCT(1);'FOR' K:=0'STEP'1'UNTIL'N'DO''BEGIN'MP:=(MN+M(/K/))/2;M(/K/):=MN;

            MN:=MP'END'MEANS;
    'IF' (ABS(MN)'LESS' ABS (M(/N/))'AND'N'LESS'15)'THEN'
 'BEGIN'DS:=MN/2;N:=N+1;M(/N/):=MN'END'ACCEPT'ELSE' DS:=MN;SUM:=SUM+DS; 'IF'ABS(DS)'LESS'EPS'THEN'T:=T+1'ELSE'T:=0; 'IF'T'LESS'TIM'THEN''GOTO'NEXTTERM'END'EULER;

Что в этом тексте бросается в глаза, по сравнению с первой картинкой?

1. Нет никаких выделений жирным шрифтом, зато есть масса рассыпанных по тексту знаков апострофа ('BEGIN''END''FOR''INTEGER' и т.п.). Всё правильно. Выделение служебных слов в Алгол-60 никто не отменял, а раз не получается выделять их шрифтом (ну нет такой возможности у БЭСМ-6!), значит будем выделять чем-нибудь другим, например апострофами спереди и сзади. А то,  что от этого леса кавычек рябит в глазах, и текст становится крайне плохо читаемым, ну так это мелкие побочные эффекты. просто нужно немного привыкнуть.

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

Вот ты - неопытный школьник. Тебя посадили за терминал ЭВМ. Включили тебе простейший текстовый редактор. У тебя на ввод и прогон своей учебной программы есть ровно 30 минут! Через 30 минут тебя просто вышвырнут из терминального класса за шкирку, независимо от результата работы, а там жди неделю до следующего захода в класс. Текстовый редактор обеспечивать автоформатирование текста ещё не научился, а ты сам работаешь на клавиатуре пока ещё в "двухпальцевом" режиме. И что ты будешь делать? Будешь старательно ручками выравнивать каждый оператор по началу строки нужным количеством пробелов (считая пробелы в уме), или постараешься как можно быстрее ввести текст программы без всякого форматирования, "лишь бы заработало"?  По-моему, ответ очевиден. Плюс к тому, даже если и попытаешься сначала соблюдать отступы, то при первом же исправлении ошибок всё форматирование всё равно съедет вкривь. А исправлений (по неопытности) будет много, а терминального времени катастрофически не хватает.

3. По третьему пункту, я там на верхней картинке придрался к структуре заголовка процедуры. Это понимание приходило с опытом. Постепенно даже мне (школьнику) становилось ясно, что Алгол-60 в некоторых местах - это просто какая-то дичайшая шизофрения группы разработчиков под девизом "Лебедь+Рак+Щука=Поехали". Недаром многие нормальные люди, включая Никлауса Вирта, из этой группы быстро сбежали.

Могу просто привести цитаты из официальной документации на Алгол-60:

4.7.6 Метки в качестве параметров

 Метка может вызываться значением, несмотря на то, что не существует переменных типа метка.

4.7.7 Ограничители параметров

Все ограничители параметров считаются эквивалентными. Не устанавливается никакого соответствия, между ограничителями параметров, используемыми в операторе процедуры, и ограничителями, фигурирующими в заголовке процедуры, кроме того лишь, что их количество должно быть одинаковым. Таким образом, вся информация, которая вносится употреблением сложных ограничителей, полностью избыточна. 

Перевожу на русский с брюссельского:

"Мы тут придумали очень красивые заголовки для передачи параметров в процедуры, но вы на них не обращайте внимания, поскольку они в нашем языке полностью избыточны и реализованы никогда не будут. А ещё у нас есть метки, которые являются переменными, поэтому могут передаваться по своему значению, но переменных которые бы принимали значения меток у нас в языке нет и не будет. Что? Куда можно присвоить значение того, для чего нет переменной? Гусары молчать! Его можно присвоить параметру процедуры, а уж он как-нибудь там сам внутри процедуры разберется, как передать своему формальному параметру значение, которого у того просто не может быть. Неувязочка получается, говорите? А нам пофигу на эту неувязочку. Мы здесь СТРАТЕГИЕЙ развития науки программирования занимаемся, вотъ! А над неувязочками пусть потом конечные пользователи головы ломают, им жить с того веселее будет.".

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

Понятно, что такие подробности я никак не мог заметить сразу, при начале обучения. Но постепенно, начал на подобные "неувязочки" натыкаться. В первую очередь стало мешать обилие апострофов, щедро рассыпанных по всему тексту, застилающих смысл решаемой задачи. Потом свою роль сыграла и синтаксическая сложность деклараций, которые в Алголе распределены по нескольким строкам, и далеко не всегда взаимоувязаны между собою.

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

Комментариев нет:

Отправить комментарий