Технологии
Оберон – воплощение мечты Никлауса Вирта
Сергей Свердлов
Кое-кто сегодня полагает, что Н. Вирт и Г. Буч имеют теперь повод позавидовать крутым парням из Borland, так здорово усовершенствовавшим Паскаль. Не берусь говорить про Буча, но Никлаус Вирт (Nicklaus Wirth) мечтал, уж точно, совсем о другом. В то время как Borland превращала простой и изящный Паскаль в его собственную противоположность, Вирт предложил язык программирования Оберон, который является развитием Модулы-2, но по сути гораздо проще и в то же время мощнее Модулы (бывает и так!). Более того, некоторые нововведения, появившиеся в Object Pascal в 1995 году, Вирт включил в Оберон еще в 1987-м.
Мне кажется, что разработчики из Borland в середине 90-х .были-таки знакомы с маленьким шедевром великого швейцарца. Так что кто кому должен завидовать – еще вопрос...
Что такое хорошо
Принято считать, что «хорошо» именно то, что предлагают нам в своих коммерческих разработках монополисты компьютерной отрасли. Но ведь они руководствуются своими, а отнюдь не нашими интересами! Me выпустив в свое время полностью готовый компилятор Турбо Модула-2, а продолжив расширение Паскаля, компания Borland ориентировалась на прогноз своей, а вовсе не нашей будущей прибыли.

В то же время всегда существовали и существуют разработки, которые создаются не в обстановке сумасшедшей спешки и не в условиях гонки на выживание, а являются продуктом обстоятельной и вдумчивой работы.
Мне, конечно, возразят. Скажут: «Все решает рынок. То, что имеет успех на рынке, – хорошо. Остальным – так им и надо». Полно. Разве вы не помните, как доведенные до исступления американские домашние хозяйки в ночь на 24 августа 1995 года стояли в очередях в компьютерные магазины за вожделенной коробочкой с белыми облаками? Или, может, вы не мыли голову шампунем Head & Shoulders? Реклама может все!
Самое ужасное, что страдают в первую очередь юные. Ведь им же не с чем сравнивать. И, когда молодой человек слышит: «Настоящие профессионалы выбирают Си++» – что ему остается? Кто же не хочет стать «настоящим профессионалом»! Сориентироваться молодым довольно трудно. Прилавки книжных магазинов забиты опусами вида «Освоение полными идиотами системы X версии Y для операционной системы W за Z дней». Когда я стал приносить на занятия книги Д. Кнута, Э.Дейкстры.Д. Ван Тассела, Г. Майер-са, Б. Мейера и К. Бодуэна, студенты были поражены в первую очередь самим фактом существования подобных книг. Признаюсь, что и сам, когда на книжном прилавке 20 лет назад рядом стояли трехтомник (как я теперь понимаю, классический) Д. Кнута «Искусство программирования для ЭВМ» и том К. Джермейна «Программирование на IBM/360», я выбрал Джермейна (издание третье, стереотипное -значит, не я один). Вспомните, сорокалетние!
Что в имени твоем
Язык программирования Оберон создан Виртом в 1987 году в ходе разработки одноименной операционной системы для однопользовательской рабочей станции Ceres. Язык и операционная система названы именем одного из спутников планеты Уран – Оберона, открытого английским астрономом Уильямом Гершелем ровно за двести лет до описываемых событий и носящего имя героя комедии Шекспира «Сон в летнюю ночь», царя эльфов и фей.
Внимание Вирта к спутнику далекой планеты было привлечено блистательным успехом экспедиции американского космического аппарата «Вояджер-2», который, стартовав в 1977 году, в январе 86-го передал на Землю высококачественные снимки пяти известных к тому времени и десяти вновь открытых спутников Урана. Новые спутники некоторое время спустя также были названы именами шекспировских героев. На Вирта произвели впечатление надежность и удивительная живучесть бортового компьютера «Вояджера», который при своей относительной простоте обеспечил проведение уникального эксперимента.

Оберон, Оккам и Delphi
Английский философ XIV века Уильям Оккам выдвинул принцип, известный как «бритва Оккама»: «Сущности не следует умножать без необходимости». Именно такого подхода к разработке и совершенствованию языков программирования Вирт придерживается на протяжении всей своей деятельности, а вот его оппоненты делают обычно наоборот. Так было, когда Вирт вместе с Тони Хоаром вступил в конфликт с рабочей группой IFIP, занимавшейся усовершенствованием Алгола-60. Группа создала Алгол-68, а Вирт создал Паскаль. Кто оказался прав?
Так было в конце 70-х, когда почти одновременно появились Ада и Модула-2 – языки, сравнимые функционально, но насколько Модула проще! И, наконец, Си++ и Object Pascal, с одной стороны, и Оберон – с другой. Синтаксис Оберона целиком умещается на одной странице, а его исчерпывающее описание занимает около 20 страниц.
Создатели же Object Pascal сплошь и рядом пренебрегают принципом бритвы Оккама. Возьмем самое дорогое, к чему они так трепетно относятся, -объекты. Посмотрите, сколько слов потребовалось для обслуживания этого понятия: as, class, constructor, destructor, inherited, is, object, property, abstract, default, dynamic, message, nodefault, override, private, protected, public, published, stored, virtual (я, кажется, еще что-то пропустил). Это при том, что разница между object и class состоит лишь во внутренних механизмах реализации. А сможете ли вы быстро ответить, чем отличаются public и published, private и protected?
Как же обстоят дела с объектами в Обероне? А никак! Там этого слова вообще нет! Но есть и наследование, и полиморфизм, и динамический контроль, и приведение типов, некрытые поля... Сколько для всего этого потребовалось новых зарезервированных слов? Одно – is.
О слове «объект» хочется сказать особо. Слово это в последние годы превратилось в фетиш, ему придается какое-то магическое значение. Но ведь объекты – не самоцель. Согласитесь, что не существует потребности во что бы то ни стало употребить в программе объекты. А вот, скажем, поддерживать список из разнотипных элементов с индивидуальным поведением – реальная необходимость во многих задачах. Оберон содержит все, что требуется для создания таких списков.
Разные подходы к отбору языковых средств видны и на следующем примере. С самого начала (с 1988 года) в языке Оберон предусмотрены возможность проверки во время выполнения фактического типа объекта и безопасный способ манипулирования объектом в соответствии с его фактическим типом (охрана типа). Без этих средств объектная модель языка не может считаться полноценной. В то же время Турбо Паскаль в течение многих лет с 1989 (версия 5.5) как-то без этого обходился. И только в Delphi появились необходимые механизмы, названные RTTI (неумеренное использование аббревиатур свидетельствует, на мой взгляд, или о неадекватности вводимых в обиход понятий, или о неспособности их авторов придумать для своих творений название хотя бы из двух слов).
Алгол, Паскаль, Модула, Оберон
Оберон стал продолжением линии языков Алгол-60, Паскаль, Мо-дула-2. Как подчеркивает Вирт, язык получен исключением из Мо-дулы-2 большого числа средств, а добавлением лишь немногих.
В Обероне отсутствуют записи с вариантами, перечисляемые и ограниченные типы, множества общего вида, тип cardinal, нецелочисленные индексы массивов (нижняя граница индекса всегда 0), локальные модули и модули определений, списки экспорта, оператор for, прежний вариант оператора with и даже главная программа. Предусмотрены указатели только на записи и массивы. Упрощены списки импорта, в которых теперь перечисляются только названия модулей (в то же время в тексте программы импортированные имена сопровождаются явным указанием модуля-экспортера).
Очень изящно оформляется экспорт модулей. Те, кто пишет программы на Turbo (Borland, Object) Pascal, хорошо знают, как громоздко выглядят интерфейсные части модулей, особенно если там располагаются описания объектов. А поскольку все «внутренности» объектов вынужденно выставляются напоказ, возникает потребность в словах private и protected, public и published, что еще больше загромождает как текст, так и наше восприятие программы, а заодно и языка.
В Обероне экспортируемые имена просто помечаются звездочкой (*), а текст интерфейса формируется автоматически специальным инструментом Оберон-среды – смотрителем (это пушкинское слово мне кажется наиболее подходящим переводом для browser).
Основное добавление по сравнению с Модулой-2 – расширение типов (записей). Расширение типов (наследование) делает Оберон объектно-ориентированным языком. При этом, как уже говорилось, предусмотрены необходимые механизмы поддержки полиморфизма – проверка и охрана типа (их аналогом в Delphi является RTTI).
Очень естественно и просто решен в Обероне вопрос о совместимости числовых типов. Они образуют иерархию:
shortint<=integer<=longint<= <=real<=longreal.
Значения «меньших» типов могут присваиваться «большим».
Открытые массивы в Обероне в отличие от Модулы могут быть многомерными. (В Delphi одномерные открытые массивы проходят по разряду нововведений.)
Оберон и Оберон-2
«Сделай так просто, как возможно, но не проще того»-это высказывание А. Эйнштейна Вирт выбрал эпиграфом к описанию языка Оберон. Удивительно простой и даже аскетичный Оберон представляет собой, пожалуй, минимальный универсальный язык высокого уровня.
По прошествии некоторого времени, вероятно, не без сопротивления Вирт согласился с добавлениями к языку, предложенными его коллегами. Авторами описания Оберона-2 стали Никлаус Вирт и Ханспетер Мёссенбёк (Hanspeter Mossenbock) – профессор университета Иоганна Кеплера в австрийском городе Линце. Эпиграф Эйнштейна был снят.
В Оберон-2 возвращен оператор for, которому незадолго до того Вирт приписывал «маргинальное значение». (Если бы не зарезервированные слова for, to и by, вернувшиеся в язык, Оберон-2 можно было бы называть правильным расширением Оберона: любая программа на Обероне была бы и программой на Обероне-2.)
Другими нововведениями стали экспорт только для чтения (после имени объекта при таком его экспорте ставится не «*», а «-»); открытые массивы в качестве базового типа указателей; расширенный оператор with.
Главное же новшество – связанные процедуры (виртуальные методы – в терминах Турбо Паскаля). Объясняя их отсутствие в Обероне, Вирт находил довольно убедительные аргументы, отмечая, что определение действий, применимых к объектам некоторого типа непременно в составе определения самого этого типа, представляет собой догму, происходящую из концепции абстрактного типа данных и создающую некоторые препятствия при разработке больших систем. Решение, принятое в Обероне-2, несет черты компромисса – описания процедур-методов помещаются не в объявлении самого типа, а отдельно. Эти процедуры лишь «связаны» с типом.
Оберон-2 является сейчас фактическим стандартом языка и поддерживается большинством Оберон-систем, которых существует довольно много. Это, во-первых, семейство систем ЕТН – Федерального технического университета (Цюрих, Швейцария), организации, где работает Н. Вирт. Это Oberon/F (Oberon Microsystems Inc., Цюрих) – коммерческая Оберон-система, снабженная более традиционным, чем системы ЕТН, пользовательским интерфейсом (в мае 1996-го выпущена версия 1.2). Это реализация университета Кеплера в Линце. Наконец, можно назвать компиляторы Модулы-2 и Оберона-2 (система XDS), созданные в Новосибирске учениками Андрея Петровича Ершова.
И все же «улучшать» создание классика – дело неблагодарное. Все, что предлагается Виртом, продумано им очень детально и глубоко. Поэтому некоторые новации Оберона-2, по-моему, не бесспорны. Заметно усложняется компилятор в части, относящейся к трансляции связанных процедур. Интерфейс модуля теперь перестает быть просто перечнем цитат, взятых из текста реализации модуля, а работа смотрителя затрудняется. Экспорт только для чтения мог порождать бессмысленные варианты, когда «только для чтения» экспортируется константа, тип или процедура. Лишь совсем недавно эта неточность была замечена и исправлена.

Оберон и Солнце, Кофе и Сок
В последнее время я с интересом наблюдаю, как одно за другим в печати появляются признания поклонников Си++, из которых вдруг выясняется, что любимый язык, оказывается, доставляет им массу проблем: сложен, механизмы контроля несовершенны, провоцирует на всякие опасные трюки (адресная арифметика и т. п.). Отчего такая откровенность? А дело в том, что компания Sun совершила трезвый поступок, предложив язык Java, который является модернизацией Си++, отличаясь от своего предшественника простотой и отказом от потенциально опасных возможностей. Все рукоплещут и каются. Но не кажется ли несколько неприличным такое запоздалое коллективное прозрение?
Направление модернизации Си++, приведшее к появлению языка Java, находится в русле тех принципов, которые Вирт исповедует на протяжении многих лет и блистательно воплотил в Обероне: простота, неизбыточность, безопасность. Я уж не говорю о таком решении, как сборщик мусора, который предусмотрен в Java и который Вирт использовал еще в языке Алгол W, а после того как избавился от записей с вариантами – и в Обероне. Так не отраженным ли светом маленького спутника по имени Оберон сияет огромная звезда Sun?
Язык Java (кофе – на американском жаргоне) является частью технологии распространения приложений в Интернете. Но и здесь не обошлось без Оберона. В июле 1996 года в телеконференции comp.lang.oberon опубликовано сообщение о новой технологии Juice (сок), предназначенной для распространения исполнимого кода через World Wide Web и основанной на использовании Оберона. Авторы технологии Михаэль Франц и Томас Кистлер отмечают три ключевых ком -понента Juice:
– архитектурно-независимый формат распространения программ;
– компилятор, транслирующий с Оберона в переносимый формат Juice;
– дополнение (plug-in), позволяющее Netscape browser'y (смотрителю) исполнять Juice-приложения.
Для пользователя Интернета преимущества технологии Juice проявляются в том. что. во-первых.
Juice-версия переданной по Сети программы будет скорее всего выполняться много быстрее аналогичного Java-апплета, поскольку код Java, как правило, интерпретируется, a Juice всегда компилирует приложение в родной код целевой машины перед его выполнением. Во-вторых, переносимый формат Juice компактнее байт-кода Java, и пользователи с медленным подключением к Сети сберегут время, загружая приложения Juice. Наконец, использование Juice позволяет избежать многих проблем безопасности, поскольку он, в отличие от Java, не требует выполнения потокового анализа, чтобы убедиться, что загруженный код не выполнит запрещенных действий.
Мне нравятся Delphi и Оберон
Вам может показаться, что я люто ненавижу Object Pascal, Borland и Delphi. Ничего подобного. Вот уже около восьми лет я использую Турбо-Borland-Object Паскаль. Причем теперь наряду с Delphi имею счастье благодаря некоторой технической отсталости нашего института и невероятной надежности японских компьютеров Yamaha (ни одной сколько-нибудь серьезной поломки у 20 компьютеров за 8 лет!) видеть в работе Турбо Паскаль 2.0. Поверьте, это классная программа. Что же касается Borland, то я не знаю другой компании, чьи программы были бы так же надежны, удобны, изящны, быстры и неприхотливы.
Я просто хочу, чтобы мы отдавали себе отчет в том, что направление, которое приняла эволюция языка Паскаль в системах Borland, далеко от идеала. Напротив, качество и проработка среды программирования систем Borland выше всяких похвал. В этом отношении Оберон-системам очень трудно (если вообще возможно) конкурировать с Borland. Системы, разработанные в ЕТН, имеют весьма своеобразный, хотя и концептуально очень простой пользовательский интерфейс. А среда разработки Oberon/F, хотя и оснащена интерфейсом традиционным, но, по крайней мере на первый взгляд, выглядит заметно беднее Delphi.
Вообще и разработчики, и некоторые аналитики придают очень большое значение самой идеологии построения Оберон-систем, употребляя всякие магические слова вроде «объектная прикладная среда», «компонентное программное обеспечение», «документоориентированные системы» и т. п. Мне же кажется, что основная ценность – в самом языке Оберон. Пользовательская парадигма видоизменяется довольно быстро, языки же более консервативны. Когда система навязывает человеку слишком многое в способе его существования в компьютерной среде, это может не устраивать творчески настроенного индивидуума. Утверждать же, что рядовые пользователи-непрограммисты когда-либо будут обитать в Оберон-среде, было бы опрометчиво.
Будущее Оберона предвидеть не просто. Мне, например, представляется, что Оберон – идеальный язык для изучения программирования. Сочетание простоты, строгости и неизбыточности предоставляет начинающему программисту великолепную возможность, не заблудившись в дебрях, выработать хороший стиль, освоив при этом и структурное, и объектно-ориентированное, и модульно-компонентное программирование. Но от слишком многих обстоятельств, часто не имеющих прямого отношения к достоинствам самого языка, зависит его судьба.
Автор благодарит профессора Н. Вирта (ЕТН) и
аспиранта ВМКМГУ М. Зырянова за содействие
в получении сведений, использованных в этой статье.
Те, кто заинтересуется Обероном, могут узнать о нем подробнее. Вот перечень известных мне публикаций на русском языке.
– Т. Джонсон, Р. Браун, Л. Содерблом. Спутники Урана. «8 мире науки», №6,1987.
– В. Ш. Кауфман. Языки программирования. Концепции и принципы. Москва, «Радио и связь», 1993.
– А. Д. Супрун. Oberon – новый продукт создателей Pascal и Modula-2. «Компьютеры+Программы», №5,1994.
– Р. Богатырев. Java и Juice: дуэль технологий?! «Компьютерра», №34,1996. А это работы Н. Вирта и его соратников:
– N. Wirth. The Programming Language Oberon. Software -Practice and Experience, 18,7 (July 1988), 671-690.
– N. Wirth and J. Gutknecht. The Oberon System. Software -Practice and Experience, 19, 9 (Sept 1989).
– M. Reiser. The Oberon System. Addison-Wesley, 1991.
– M.Reiser and N. Wirth. Programming in Oberon. Steps beyond Pascal and Modula. Addison-Wesley, 1992.
– N. Wirth and J. Gutknecht. Project Oberon. The Design of an Operating System and Compiler. Addison-Wesley, 1992.
– H. Mossenbock. Object-oriented Programming (in Oberon-2). Springer, 1993.
– N. Wirth. Theory and Techniques of Compiler Construction. Addison-Wesley, 1996.
Больше всего сведений можно найти, разумеется, в Интернете.
Чтобы получить описание языка Оберон-2 из первоисточника, вам достаточно отправить по адресу: ftpmail@relcom.ru письмо такого содержания:
open ftp.inf.ethz.ch
cd /pub/Oberon/Docu
get Oberon2. Report.Text
quit
На том же ftp-сервере находятся дистрибутивы нескольких Оберон-систем. В каталоге /pub/Oberon/Windows содержится ETH-Oberon V4 для Windows. Файл oberon.zip имеет размер 955185 байт. Это 32-битная система, которая будет работать с Windows 95 и Windows NT, а для запуска под управлением Windows3.1n3.1lTpe6yeTycTaHOBKH расширения-Win32s. Oberon/F для Windows версии 1.2 (май 1996 года) находится в каталоге/pub/Oberon/OberonF/WinObe-ronF12. Минимальный комплект состоит из файлов disk1.exe (1268843 байт) и disk2.exe (1292641 байт) и позволяет установить систему в Windows 95 и Windows NT.
Из каталога /pub/Oberon/Sources вы можете получить файл ProjectOberon.V4.tar.gz (178933 байт), содержащий исходный текст (на Обероне, естественно) Оберон-системы (включая компилятор, написанный лично Виртом) для компьютера Ceres. Этот файл представляет собой созданный утилитами Unix сжатый архив, для распаковки которого вам потребуются соответствующие программы.
Ну, а тем, кто имеет доступ к WWW, сообщаю такие адреса. Институт компьютерных систем Федерального технического университета (ЕТН), Цюрих, Швейцария: http://www.inf.ethz.ch/department/CS/Oberon.html.
Отечественная реализация языка Оберон (система XDS, Институт информационных систем, хТесh Ltd., Новосибирск) http://www.iis.nsk.su/xtech/xds/.
Информация о технологии Juice (Университет штата Калифорния, США) http://www.ics.uci.edu/-juice.
Много различных сведений, касающихся Оберона, можно найти и на Web-сайте http://www.math.tau.ac.il/~laden/Oberon/.