четверг, 13 января 2022 г.

Шеркало 05.05: любимые системы программирования (Паскаль)

 - Ну так вот, Шеркало, после Фортрана, который мне не слишком понравился, особых вкусностей по сравнению с Алголом не давал, я увлёкся языком Паскаль. Сейчас уже точно не помню, не то это опять была моя личная инициатива, попробовать новый язык, не то моя учительница мне продвинутое обучение запланировала. Скорее всего было и то и другое одновременно - я захотел (уже сознательно, без влияния болезненно-высокой температуры), а учительница изо всех своих возможностей мне содействовала.

Тем более, что никаких проблем с Паскалем там и не было. Трансляторы этого языка имелись практически на всех компьютерах института, причём вполне рабочие трансляторы, вполне качественно исполняющие программы в рамках утверждённого стандарта языка. В том числе и на БЭСМ-6 компилятор работал. Вот только большинство сотрудников ИОА Паскаль в грош не ставили, оценивали его исключительно "детско-учебным" языком программирования. Писать на нём программы в среде учёных считалось как бы слегка дурным тоном для приличного взрослого человека, примерно как куличики лепить в песочнице детского сада.

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

 Критика была с виду вполне справедливая, авторы были весьма именитые. Только что-то странно покалывало мне глаза при чтении. Почему-то казалось, что "родные" Алгол-60 и Фортран-IV точно так же не выдерживают той самой критики, как и Паскаль. А те положительные примеры, на которые ссылались умные авторы, были либо гораздо более современными разработками, либо вообще сугубо умозрительны. Захотелось попробовать самостоятельно. Здесь, кажется уместно привести картинки с текстом программы на Паскале:

- Здесь, правда, картинки слегка анахроничные - сделаны в TurboPascal 4.0, который появился только после 1987 года, спустя пятилетку после описываемого процесса моей школьной учёбы. Но это неважно, сам текст программы вполне аутентичен на то давнее время (кстати, прогонял эту же программу и в более ранних реализациях языка, доступных на сегодня в режиме эмуляции - успешно работает везде, но скриншоты хуже получаются). 

- Эээ, Ёж... С каким там тембром голоса принято у людей изображать скучающе-вопросительную интонацию? Ну и как там дальше было-то с любовью?
- Не подкалывай, Шеркало! Не мешай, дай рассказать!
Что видно при взгляде на паскалевскую программу? Да, в общем, всё то же самое, что и в Алголе-60. Та же структура. Те же вложенные BEGIN - END. Те же описания переменных, те же массивы ARRAY, те же процедуры PROCEDURE с параметрами. Операторы очень похожие. Ничего особенного и не поменялось. Отличаются, вроде бы, только нюансы.
Да, раздражающий лес апострофов из текста исчез. Описания переменных немного упорядочились, сосредоточились в начале процедур, отдельные блоки и операторы самостоятельность потеряли, параметры в процедурах упорядочились, со строками чуть-чуть интереснее стало, константы появились, типы свои опять же. Но... Это всё - мелочи, вроде бы  Реально поразило меня другое.

- Знаешь, Шеркало, была у меня на тот момент одна школьно-учебная задача. Сама по себе не слишком сложная, вполне учебная, вполне с виду, мне посильная. Но и не совсем тривиальная, там нужно было какую-то продуманную структуру из нескольких вложенных процедур с несколькими циклами под системой условий реализовать. Суть задачи уже абсолютно не помню! Помню только, что сходу решить не смог - несколько попыток (на Алголе-60), всё время то ошибки, то зацикливания в результате. Взял паузу. На пару недель отвлёкся, делал другие задания. Потом снова вернулся к этой задаче. Переписал всё заново, на свежую голову. Снова - ошибка на ошибке, никакого приближения к работающей версии.
Самое обидное, что я суть задачи - прекрасно понимаю, никаких неясностей нет! Все инструменты - у меня под рукой, ничего необычного не требуется, всё решается знакомыми средствами. А вот - ПУТАЮСЬ постоянно, то в одном месте, то в другом!!! Один узел распутаю, в другой части алгоритма ошибка вылезает. Опять бросил задачу. перешёл к другим темам.
А тут как раз начал пробовать Паскаль. Ну и ту, неподдающуюся, путанную задачу переписал уже в третий раз ради шутки на Паскале. Программа выполнилась без ошибок с ПЕРВОЙ попытки!

- Серьёзно?
- Именно так, Шеркало! Все места, где я в Алголе путался, в Паскале оказались плоскими и прозрачными. Вроде бы никакой существенной разницы, кроме нюансов и апострофов, а вот за теми нюансами виден только тёмный лес, а вот за этими - чистое поле для любых твоих действий.

Алгол-60 вдруг начал выглядеть передо мной в образе человека рассеянного с улицы Бассейной - из стихов Маршака: вроде бы умный, но тем не менее "...вместо шапки на ходу он надел сковороду, .. направился в буфет покупать себе билет..." В противоположность Паскалю, автором которого был Никлаус Вирт. 
Вирт сбежал из комитета по разработке Алгола далеко не сразу. Он очень активно участвовал в разработке Алгола-60. Активно критиковал этот стандарт (большей частью именно за нелогичную шизофрению), надеялся на то, что следующая версия Алгола (а никто и не сомневался, что будет новая версия, прежний Алгол-60 всем вменяемым учёным казался лишь промежуточным вариантом) будет намного более ясной и чистой. Вошёл в комитет по разработке новой версии языка Алгол-68.
И вот, когда Вирт убедился, что новый Алгол-68 получается лишь немного менее шизофреничным, чем Алгол-60, причём небольшое уменьшение шизофрении компенсируется огромным увеличением веса и сложности языка и трансляторов с него, вот в этот момент Никлаус Вирт окончательно разругался с "алгольщиками" и сбежал из этой группы разработчиков. И в пику им он создал Паскаль. Показал собственное видение успешного алгоритмического языка, а заодно и возможность его успешной реализации на современных компьютерах.

Нужно добавить, что Вирт терпеть не мог СЛОЖНЫХ компиляторов. В то время, оперативной памяти у компьютеров было крайне мало (десятки, очень редко сотни килобайт на современный счёт). Написать транслятор со сколь-нибудь сложного языка высокого уровня в машинный язык было достаточно трудно. Вопрос решался созданием много-проходных трансляторов. Они на первом этапе читали исходный текст программы, преобразуя его в набор промежуточных таблиц  - результат записывался в долговременную память, на ленты, барабаны, диски. Потом запускался второй прогон, который читал из файловой системы таблицы первого этапа, делал некие преобразования, на выходе писал в файлы новый комплект промежуточных таблиц, который читал компилирующий этап третьего прогона...
"... Потерпевший случайно сам упал на нож, получил смертельное ранение, внезапно поднялся, и этот процесс, снова и снова, повторялся аж восемь раз..." (с = анекдот) 
"Нормальные" трансляторы с Алгола, Фортрана, Кобола и т.п. в то время делали от 5 до 15 проходов с записью в долговременную память промежуточных результатов, и с вызовом многочисленных новых программ "частичных обработчиков" этих промежуточных результатов, которые, в свою очередь, читали входные таблицы из файлов внешней памяти, и писали новые выходные таблицы во внешнюю память, чтобы в итоге всё-таки после N+1 го частичного прохода компилятора получить исполняемый на конкретной ЭВМ двоичный объектный код (Уффф, не утомил никого этим предложением?). Для более громоздких языков (PL/1 на IBM/360) или для менее мощных (мини-)ЭВМ делали компиляторы и с бОльшим числом проходов, там и за двадцать-тридцать проходов, бывало, сильно зашкаливало. Аааа, забыл, извиняюсь, потом полученный объектный код ещё дополнительно линковать с внешними библиотеками и резидентными модулями Операционной Системы требовалось, это ещё от 1 до 5 прогонов программ-линковщиков, но это уже второстепенные издержки..

Большая сложность и много-проходность трансляторов обосновывалась объективной сложностью языков программирования: "Наш язык высокого уровня достаточно сложен и хорош, поэтому для него и требуется компилятор в N -проходов, а если меньше - будет сильно хуже!"
Вирт взялся доказать, что можно построить очень качественный и пригодный для реального программирования язык высокого уровня с компилятором, работающим в ОДИН проход. У него получилось!
Паскаль весь насквозь построен так, чтобы по первому же читаемому компилятором из входной строки символу было бы понятно, какая лексема далее ожидается, и чтобы никакая штуковина не использовалась бы в программе раньше, чем её интерфейс будет полностью известен. Компилятор Паскаля реально можно написать в однопроходном варианте Это - фантастика для тех времён! 
И одновременно... Реакция программистского сообщества: "Нуу.. И зачем вам такой однопроходный компилятор? Просто ради прикола? Стопяти-проходный транслятор у нас вышел бы ничуть не хужее, если бы мы только его вчерась дописали. И вообще, этот Вирт - просто академический теоретик, ничего сам не сделал, только по своим Швейцариям шлялся". 

- А ты, Ёж?
- Так я уже сказал, Шеркало! В Алголе - я откровенно запутался. А вот логика Паскаля - сразу мой мозг распрямила. Дальше учебные программы писал почти только на Паскале.

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

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