Вход на лекцию был свободным. Я пришел за час до начала, но мне досталось место только в
пятом ряду. Зал рассчитан примерно на 200 сидячих мест. К началу лекции слушателей пришло
столько, что им пришлось приносить стулья из библиотеки и располагаться между рядов,
у стен и перед первым рядом, образовав еще пару новых первых рядов. Но все равно всем
стульев не хватило, поэтому несколько десятков человек слушало лекцию стоя. Опоздавшие
к раздаче свободных мест слушатели громоздились в дверях и коридоре — ведь войти в зал
было уже не возможно. Я заметил среди таких опоздавших несколько университетских
преподавателей. Организаторам пришлось провести их через другой вход, который шел со сцены.
Для них были зарезервированы первые два ряда, уже превратившиеся к тому времени из первых
во вторые или даже третьи ряды. Было очень много студентов младших курсов. Сначала мне
показалось, что подавляющая часть из них пришли просто так, но потом я подумал, что
просто так места за час до начала не занимают.
Вирт начал свой доклад с вступления на русском языке. Он объяснил, что учил русский язык
вместе с одной знакомой женщиной, которая училась у него немецкому языку. К сожалению,
сказал Вирт, она оказалась очень умной [смех в зале] и сейчас она говорит на немецком
гораздо лучше, чем он на русском. Извинился, что не будет делать доклад на русском, а
то «вы всё разбежитесь». Предложил сделать доклад на немецком языке, если мы захотим.
На немецком языке никто не захотел, и он стал говорить на английском.
Переводчик, видимо уже традиционно, не уставал веселить слушателей забавными переводами
фраз технического характера. Из наиболее смешных переводов: «Самой серьезной ошибкой,
сделанной в 1957 году, была ошибка игрек равно икс» — весь зал просто лёг от смеха.
В это время Вирт ругал обозначение “x = y”, используемое в некоторых языках
программирования в качестве инструкции присваивания. Смехом, правда, дело не
ограничивалось. Я заметил несколько неправильных переводов, искажающих смысл. Зал
на это никак не реагировал, быть может, не совсем понимая, в чем суть (было много
студентов младших курсов). В частности, рассказывая про разницу между нисходящим и
восходящим синтаксическим анализом, Вирт сказал, что пытался пользоваться восходящим
анализом. Но, поняв, что тех же результатов можно достичь с помощью более простого
нисходящего синтаксического анализа, стал пользоваться только им. Переводчик, естественно,
понятия не имел, что нисходящий синтаксический анализ более прост, чем восходящий, а
Вирт сказал об этом очень быстро. В результате, переводчик выдал нечто такое, что
понять в отрыве от оригинала было бы не реально. Спасибо Евгению Зуеву. Он сидел
недалеко от переводчика и иногда приходил тому на помощь, подсказывая, как следует
правильно переводить технические термины.
Вирт рассказывал о «хороших идеях», которые по прошествии некоторого времени уже
переставали быть хорошими или даже никогда ими не были. Начал он с аппаратуры. Достаточно
долго рассказывал о борьбе между десятичной и двоичной системами исчисления (и о
представлении отрицательных чисел), а затем о борьбе между двоичной и восьмеричной или
шестнадцатеричной системами представления чисел с плавающей точкой (были машины,
работающие с такими представлениями). Представьте себе, оказывается, надо было доказывать,
что двоичная система лучше восьмеричной или шестнадцатеричной (в них возникают аномалии
при умножении чисел с плавающей точкой — результат произведения чуть-чуть меньше чем надо).
Это сейчас данный вопрос кажется тривиальным, а тогда машины делали по таким «хорошим
идеям».
Затем подробно рассказал о виртуальной адресации. О том, почему она была
необходима (вкратце: был очень мал объем оперативной памяти, и фрагменты не используемой
в данный момент памяти можно было хранить на жестком диске). Выразил удивление, почему эта
«хорошая идея» эксплуатируется до сих пор, ведь сейчас память исчисляется гигабайтами, а
виртуальная адресация была необходима лишь тогда, когда «за тридцать килобайт люди
готовы были вырвать глотку друг другу». Один гигабайт и тридцать килобайт — ну очень
сильно отличаются. Следующим пунктом была «хорошая идея» о расширенном наборе
инструкций (instruction set — переводчик сначала как-то очень забавно перевел этот термин,
но Зуев шепнул ему что-то на ухо и далее это переводилось как система инструкций).
В академическом мире уже давно понятно, что RISC — лучше. В частности, компания-производитель
процессоров с самым плохим набором инструкций — x86, заполонивших весь мир,
захватила мировое господство как раз благодаря тому, что внутри их процессоров
скрыта RISC-архитектура, которая только снаружи оформлена под x86. Печально то, что
производители чипов не собираются что-либо менять, аргументируя это тем, что их чипы
и так покупают [грустный смех в зале].
Наконец, зашла речь о «хороших идеях» в языках
программирования. Тут сильно досталось Си-образному синтаксису. Досталось языкам
программирования с переопределяемыми синтаксическими правилами (мы-то понимаем, что
Вирт имел в виду сишные макросы и перегружаемые операторы). Естественно, про GOTO тоже
было сказано. Досталось конструкции if-then / if-then-else: «Какой же недалекий был
создатель Паскаля, взявший конструкцию if-then / if-then-else из Алгола и перенесший ее
без изменений в Паскаль. [смех в зале] Признаю свою ошибку. В Модуле конструкция была
исправлена до однозначной инструкции if-then-end / if-then-else-end». Переводчику
(не понимающему смысл данной конструкции) пришлось очень трудно, когда он пытался
перевести, почему данная конструкция была неоднозначна, и ему просто пришлось сказать,
обращаясь к слушателям что-то вроде: «ну вы сами это понимаете лучше меня».
Далее речь
пошла о компиляторах. Вирт рассказал о следующих «хороших идеях». Написание
компилятора, генерирующего ассемблерный код вместо машинных команд. Написание
компилятора на не подходящем для этого языке программирования. Например, была попытка
создания компилятора Паскаля на языке Фортран, в котором кроме массивов никаких
структур данных не предусмотрено (тут переводчик тоже чуток поблуждал в трех соснах,
не понимая, что на чем пишут). К тому времени, когда Вирт стал рассказывать о тонкостях
создания компиляторов, а именно о «хорошей идее» использовать дерево для таблицы
символов (хотя использование простого списка приводит к более быстрому компилятору),
мне показалось, что основная часть слушателей (студенты младших курсов) начинают
скучать, не понимая о чем речь.
Был затронут вопрос о функциональных языках
программирования, тоже в контексте еще одной «хорошей идеи». Далее выяснилось,
что времени остается не очень много, поэтому несколько пунктов было рассмотрено
вскользь или вовсе пропущено (рассказ о «хороших идеях» в ООП был пропущен, но
после доклада вопрос об ООП всё-таки был задан и Вирт на него подробно ответил).
Когда слайды кончились, Вирт еще довольно продолжительное время рассказывал об общей
философии «хороших идей», которые вовсе не такие уж и хорошие. О том, что университеты
должны вести индустрию, т.е. быть лидерами, а не наоборот — идти на поводу у индустрии.
И тому подобное.
Проф. Гуткнехту в это время нездоровилось. Он выпил воду, которая стояла около него на
столе, зажал голову в обе руки так, чтобы закрыть ими глаза, и уснул. Спать было неудобно,
приходилось постоянно менять позу. Мне было страшно на него смотреть. Страшно за него.
Под конец доклада Вирта он всё-таки стал оживать.
В конце стали задавать вопросы. Я их все уже не помню. Задали вопрос про ООП. Вирт ответил,
что, по его мнению, ООП является лишь надстройкой над обычным процедурным программированием.
И никакой такой революцией не является. Сравнил словари "процедура = посылка сообщения",
"аргумент процедуры = само сообщение", "наследование = расширение типа" и т.д. Произнес
свою коронную фразу на счет того, насколько американцы любят антропоцентризм и называют
расширение типа словом «наследование», но, мол, дескать, вообще-то наследство обычно
переходит к потомку только тогда, когда предок умирает.
Один молодой человек задал вопрос
о том, что Вирт думает о Java и C#, акцентируя особое внимание на то, что в них есть
сборщик мусора и всё такое, и что вообще писать программы на них гораздо лучше. Он
говорил на очень хорошем английском языке, так что переводчик не потребовался. Интонация
вопроса была таковой, что, как я понял, задававший вопрос молодой человек был абсолютно
не в курсе относительно Оберонов и Оберон-систем (видимо знал только Паскаль 1970 года)
и поэтому сделал такой сильный акцент на том, что вот мол, хе-хе, в Java и C# есть сборщики
мусора, прогрессивные языки-то, не то, что там какой-то допотопный Паскаль!!! Вирт
попросил разрешения сначала ответить на второй вопрос — про сборщики мусора. Он сказал,
что сборщики мусора — это, конечно, хорошо, и программисты о них, конечно, должны знать.
Но не стоит их так вот сильно выпячивать. Дескать, что тут такого-то? Ну, обычный
сборщик мусора, кого этим можно удивить? Далее ответил про Java. Вирт очень спокойно
так рассказал, что создатели Java за семь лет до ее создания очень подробно изучили
исходные коды Оберона и, в частности, исходные коды оберонистых сборщиков мусора они
тоже очень хорошо изучили. Далее испортили (corrupted) Оберон сишным синтаксисом и
обозвали получившееся словом Java. Кстати, заметил Вирт, то, что они испортили его сишным
синтаксисом, был хороший маркетинговый ход с их стороны. Что касается .Net, то она
появилась в результате конкуренции, и в принципе они (Java и .Net) более-менее одинаковые.
Другой молодой человек задал вопрос о работе Дейкстры, в которой предлагались инструкции
циклов с несколькими точками входа или что-то в этом роде. Вопрос был задан на русском,
и переводчику понадобилось много времени, чтобы Вирт понял о чем речь. Наконец, Вирт
догадался, о какой работе Дейкстры идет речь, и ответил (насколько я помню), что это
всё дело легче просто заменить цепочкой инструкций if-then-end. И тут произошло чудо —
неожиданно Гуткнехт проснулся!!! Юрий Эрнстович [псевдоним Юрга Гуткнехта в кругах российского
Оберон-сообщества — прим. ред.] попросил, чтобы ему тоже разрешили ответить на этот вопрос.
И что-то долго и активно рассказывал. Честно говоря, я не очень понял, но вроде речь
шла о том, что нужно сделать так, как проще, а у Дейкстры сложновато.
Задали вопрос
про отсутствующую в Обероне обработку исключений (exception handling). Вирту пришлось
рассказывать о том, что в Оберон-системах это дело, собственно, не нужно. Оберон-система
выполняет команды (а не программы), и если в процессе выполнения команды происходит нечто
плохое, то команда просто прерывается, а сама система при этом продолжает работать,
как ни в чем не бывало. То есть exception handling по большому счету нужно только
в монолитных самостоятельно исполняющихся программах, а в Оберон-системах нет программ,
там — команды. Спросили о гипотетической возможности объединения всех парадигм
программирования в едином унифицированном языке программирования. Вирт ответил, что он
не рекомендовал бы так делать. Пусть уж лучше будут специализированные системы. Да и
в конце концов просто есть программисты, хорошо владеющие (являющиеся экспертами) только
одной парадигмой, пусть в ней и работают. Другие вопросы я уже забыл или они были не очень
интересными.
В завершение лекции проф. Гергель (ННГУ) заявил, что в будущем останется только один язык
программирования, а называется он — Zonnon. И о нем речь пойдет завтра 27 сентября в докладе
Евгения Зуева.