Оберон (язык программирования)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Oberon
OberonLogo.png
Класс языка:

императивный, структурированный, модульный

Появился в:

1986

Автор(ы):

Никлаус Вирт

Система типов:

статическая, сильная

Испытал влияние:

Modula-2, Pascal

Повлиял на:

Java[1][2], Component Pascal, Oberon-2, Zonnon, Go

Сайт:

http://www.oberon.ethz.ch/

Оберон — язык программирования высокого уровня, разработанный Никлаусом Виртом, для исполнения программ на котором предназначена одноимённая операционная система, авторами которой являются Никлаус Вирт и Юрг Гуткнехт (нем.)русск..

Системы и среды[править | править вики-текст]

Программы, написанные на языке программирования Оберон, требуют определённой поддержки во время выполнения — им необходим динамический загрузчик и централизованно выполняемый автоматический сборщик мусора, для этого программам на языке Оберон нужна специальная операционная среда. Обычным способом её реализации является добавление в систему набора библиотек, реализующих необходимые компоненты, хотя, вообще говоря, операционной среде вовсе не обязательно нужна отдельная операционная система: она сама по себе может представлять собой операционную систему. Таковы системы Native Oberon для первоначального Оберона и A2 для Активного Оберона. На данный момент существуют компиляторы Оберон в байт-код виртуальной Java-машины и CLI для виртуальной машины .NET.

Операционные системы и среды для исполнения программ на языках семейства Оберон, развившихся из первоначальной Системы Оберон, являются ETH Oberon, BlackBox Component Builder, WinOberon, A2 и др.

На основе Оберона были разработаны проекты Оберон-0, Оберон-X и другие[3]. Простота Оберона и наличие исходных текстов оригинальной реализации позволяют легко адаптировать его для специальных классов задач. Но все эти Обероны очень близки между собой, поскольку и первоначальный Оберон очень прост.

История языка[править | править вики-текст]

Основой для Оберона послужил язык Модула-2, выросший из Паскаля, (по словам Вирта[4], первоначально систему хотели писать непосредственно на Модуле, но пришли к выводу о необходимости её доработки и сокращения, что и привело к появлению Оберона). Целью проекта (Project Oberon) Никлауса Вирта и Юрга Гуткнехта в 1986—1989 годы[5] было создание с нуля обозримой и надежной операционной системы для однопользовательской рабочей станции.

Для реализации этого проекта в 1988 году Никлаусом Виртом был спроектирован язык программирования высокого уровня общего назначения, также названный Оберон[6].

В 1989 году в Швейцарской высшей технической школе Цюриха (ETH) была выпущена первая реализация Оберона для процессоров семейства NS32000. Он был создан в качестве компонента операционной среды Оберон. Этот компилятор требует менее 50 Кбайт памяти, состоит из 6 модулей общим объёмом около 4000 строк и сам себя компилирует за 15 секунд на компьютере с процессором NS32532 (тактовая частота — 25 МГц).

Язык Оберон[править | править вики-текст]

Нововведения[править | править вики-текст]

« Просто невозможно поблагодарить всех тех, кто так или иначе подпитывал своими идеями то, что теперь называется Oberon. Большинство идей пришло от использования и изучения существующих языков, таких как Modula-2, Ada, Smalltalk и Cedar, которые часто предостерегали нас от того, как не надо делать.
»

Язык сохранил основные черты синтаксиса Модулы и был объектным расширением. Это позволило отказаться от механизма вариантных записей Модулы, являющихся отступлением от первоначальной строгой статической типизации, что дало возможность ввести механизм автоматического управления памятью — сборку мусора: из языка исключена возможность освобождения динамически выделенной памяти с помощью особого оператора, а вместо него сама среда исполнения содержит модуль, возвращающий неиспользуемую память системе. Автоматическое управление памятью является средством повышения надёжности программ с динамическими структурами данных, так как исключает человеческие ошибки, свойственные, например, таким языкам, как С/C++.

Упрощение синтаксиса[править | править вики-текст]

Чтобы добиться наибольшей надёжности и производительности трансляции, было предпринято значительное упрощение языка за счёт его отказа от средств, которые были сочтены ненужными (исходя из опыта разработки, реализации и применения других языков), либо усложняли компилятор без достаточного оправдания с точки зрения производительности, либо были достаточно сложны, чтобы быть отправленными во внешние библиотеки, либо плохо совмещались с механизмами модульности и автоматического управления памятью: записи с вариантами, перечислимые типы, типы-диапазоны, множества общего вида, беззнаковый целый тип, локальные модули, модули определений, списки экспорта, оператор for, прежний вариант оператора with, специальный синтаксис определения главной программы. Рудиментарные средства поддержки параллельного программирования, имевшиеся в Модуле-2, не вошли в язык, так как он обслуживал однопользовательскую операционную систему. В целях упрощения отказались от обработки исключений.

Было упрощено описание массивов (индексы массивов могут быть только целочисленными и всегда начинаются с нуля, подобно языку Си), ограничено использование указателей — указатели могут существовать только на записи и массивы, в списках импорта указывается только импортируемый модуль, а при использовании импортированных имён требуется обязательная квалификация (явное указание имени модуля-экспортёра). В статье «От Модулы к Оберону»[4] Вирт подробно пояснил причины удаления каждого из элементов.

Из соображений «достаточного минимума» в язык не были включены в качестве явного синтаксического понятия методы (процедуры и функции, связанные с типом), так как этот механизм в самом общем виде легко смоделировать, создавая в объектах (записях в языке Оберон) поля процедурного типа и присваивая им процедуры, соответствующие методам. Таким образом, в Обероне минимальными средствами поддерживается объектно-ориентированное программирование для упрощения процесса трансляции кода и ускорения этого процесса.

Благодаря внесённым изменениям, Оберон стал синтаксически проще. Описание его синтаксиса поместилось на одной странице, полное описание языка занимает около 20 страниц, что вдвое меньше, чем описание Модулы-2. Оберон является если не минимальным, то, во всяком случае, одним из самых малых по объёму универсальных языков программирования высокого уровня.

Синтаксис Оберона в РБНФ[править | править вики-текст]

Определён в следующих предложениях РБНФ[7]:

Модуль           = MODULE идент ";" [СписокИмпорта] ПослОбъявл [BEGIN ПослОператоров] END идент ".".
СписокИмпорта    = IMPORT [идент ":="] идент {"," [идент ":="] идент} ";".
ПослОбъявл       = { CONST {ОбъявлКонст ";" } | TYPE {ОбъявлТипа ";" } | VAR {ОбъявлПерем ";" }}
  {ОбъявлПроц ";" | ОпережающееОбъяв";"}.
ОбъявлКонст      = ИдентОпр "=" КонстВыраж.
ОбъявлТипа       = ИдентОпр "=" Тип.
ОбъявлПерем      = СписокИдент ":" Тип.
ОбъявлПроц       = PROCEDURE [Приемник] ИдентОпр [ФормальныеПарам]";" ПослОбъявл [BEGIN ПослОператоров] END идент.
ОпережающееОбъяв = PROCEDURE "^" [Приемник] ИдентОпр [ФормальныеПарам].
ФормальныеПарам  = "(" [СекцияФП {";" СекцияФП}] ")" [":" УточнИдент].
СекцияФП         = [VAR] идент {"," идент} ":" Тип.
Приемник         = "(" [VAR] идент ":" идент ")".
Тип              = УточнИдент | ARRAY [КонстВыраж {"," КонстВыраж}] OF Тип
  | RECORD ["("УточнИдент")"] СписокПолей {";" СписокПолей} END | POINTER TO Тип | PROCEDURE [ФормальныеПарам].
СписокПолей      = [СписокИдент ":" Тип].
ПослОператоров   = Оператор {";" Оператор}.
Оператор         = [ Обозначение ":=" Выраж
  | Обозначение ["(" [СписокВыраж] ")"]
  | IF Выраж THEN ПослОператоров {ELSIF Выраж THEN ПослОператоров} [ELSE ПослОператоров] END
  | CASE Выраж OF Вариант {"|" Вариант} [ELSE ПослОператоров] END
  | WHILE Выраж DO ПослОператоров END
  | REPEAT ПослОператоров UNTIL Выраж
  | LOOP ПослОператоров END
  | WITH Охрана DO ПослОператоров END
  | EXIT
  | RETURN [Выраж] ].
Вариант          = [МеткиВарианта {"," МеткиВарианта} ":" ПослОператоров].
МеткиВарианта    = КонстВыраж [".." КонстВыраж].
Охрана           = УточнИдент ":" УточнИдент.
КонстВыраж       = Выраж.
Выраж            = ПростоеВыраж [Отношение ПростоеВыраж].
ПростоеВыраж     = ["+" | "-"] Слагаемое {ОперСлож Слагаемое}.
Слагаемое        = Множитель {ОперУмн Множитель}.
Множитель        = Обозначение ["(" [СписокВыраж] ")"] | число | символ | строка | NIL | Множество
  | "(" Выраж ")" | " ~ " Множитель.
Множество        = "{" [Элемент {"," Элемент}] "}".
Элемент          = Выраж [".." Выраж].
Отношение        = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.
ОперСлож         = "+" | "-" | OR.
ОперУмн          = "*" | "/" | DIV | MOD | "&".
Обозначение      = УточнИдент {"." идент | "[" СписокВыраж "]" | "^" | "(" УточнИдент ")"}.
СписокВыраж      = Выраж {"," Выраж}.
СписокИдент      = ИдентОпр {"," ИдентОпр}.
УточнИдент       = [идент "."] идент.
ИдентОпр         = идент [ "*" | "-" ].

Основные элементы[править | править вики-текст]

Программа на Обероне представляет собой набор модулей. В общем виде модуль имеет вид:

  MODULE Имя;
    IMPORT СписокИмпорта;
    Определения;
  BEGIN
    Операторы
  END Имя.

Список импорта определяет, из каких модулей будут импортированы внешние имена. Определения включают определения типов, процедур, функций, переменных, констант. При этом определения имён, отмеченных звёздочкой, экспортируются данным модулем, то есть будут видны другим модулям, импортирующим данный. В Обероне-2 допустимо также помечать имена знаком минус, в этом случае они экспортируются в режиме «только для чтения».

Тело модуля исполняется при его загрузке. В Компонентном Паскале внутри тела модуля (в разделе BEGIN..END) появилась возможность добавить секцию CLOSE:

  BEGIN
    Операторы
  CLOSE
    Операторы
  END Имя.

Здесь операторы, расположенные между BEGIN и CLOSE, выполняются при загрузке модуля, а операторы, расположенные между CLOSE и END — при выгрузке его из памяти. Такое расширение было сочтено полезным для компонентных программ, которые загружают и выгружают модули динамически.

Создаваемые программистом типы данных ограничены следующим набором: типы-массивы ARRAY, типы-записи RECORD, процедурные типы PROCEDURE, типы-указатели POINTER. Указатель может быть объявлен только на массив или запись.

Синтаксис внутренней части программы достаточно традиционен и прост. Язык поддерживает традиционный набор конструкций: условный оператор IF, оператор выбора CASE, циклы (с предусловием — WHILE, с постусловием REPEAT..UNTIL, безусловный — LOOP). Подобно Модуле-2, прописные и строчные буквы в идентификаторах различаются, все зарезервированные слова пишутся большими буквами. Все языковые конструкции, кроме цикла REPEAT..UNTIL заканчиваются ключевым словом END и допускают расположение внутри нескольких операторов без использования составного оператора BEGIN..END. Естественно, как и в Модуле-2 нет безусловных переходов.

Парадигма объектно-ориентированного программирования поддерживается механизмом расширения записей (в языке нет отдельного ключевого слова для описания классов, вроде «class» или «object», сочтено, что обычного понятия «тип запись» вполне достаточно). По сути, каждый тип запись — это описание класса, а поля записи — это данные-члены класса.

В исходном Обероне методов (процедур и функций, связанных с классом) нет вообще. Механизм методов может быть использован путём объявления в записи полей процедурного типа, которым при создании экземпляра класса присваиваются конкретные процедуры. Вызов таких процедур производится традиционным способом обращения к полю записи, по умолчанию процедура не знает об экземпляре класса, для которого она была вызвана (нет механизма, аналогичного this в C++ или Java), и если такие сведения ей необходимы, ссылка на экземпляр должна быть передана явно (например, через параметр). Отсутствие явно описываемых методов было одним из качеств исходного Оберона, вызвавшего критику привыкших к традиционным гибридным языкам программистов. С другой стороны, предлагаемый Обероном механизм позволяет реализовать всё, что реализуемо традиционными средствами языков с методами, и даже более того — в Обероне каждый экземпляр класса может иметь собственный вариант метода (значение поля процедурного типа), тогда как при описании методов как части класса все экземпляры работают с одним вариантом метода. В Обероне-2 методы были всё-таки введены. Методы описываются отдельно от типа запись, с указанием типа, с которым они связаны.

Новый тип запись может быть объявлен как расширение существующего. В этом случае тип, который расширяется, указывается в описании записи в скобках после ключевого слова RECORD. Расширенный тип автоматически получает все поля расширяемого типа и (в Обероне-2) связывается со всеми процедурами, связанными с расширяемым типом. Процедуры, связанные с новым типом, могут иметь ту же сигнатуру, что и процедуры, связанные с расширяемым типом — таким образом обеспечивается переопределение методов в порождённых типах. В Компонентном Паскале с целью более полного контроля за расширяемостью типов записи по умолчанию не являются расширяемыми, а методы не могут быть переопределены. Чтобы разрешить расширение записей и переопределение методов, используются специально введённые ключевые слова EXTENSIBLE, ABSTRACT, LIMITED, EMPTY.

Концепции программирования[править | править вики-текст]

Компонентное программирование

Оберон нацелен на компонентно-ориентированную разработку программного обеспечения[8]. Инкапсуляция поддерживается исключительно на уровне модуля — все типы, объявленные внутри модуля, друг для друга абсолютно прозрачны. Из других модулей доступно то, что объявлено при определении как экспортируемое.

Полиморфизм обеспечивается за счёт механизма методов (и процедурные поля в Обероне, и методы в Обероне-2 ведут себя как виртуальные, в терминологии большинства гибридных объектно-ориентированных языков), а также расширенной конструкцией WITH, позволяющей выполнять различные группы операторов в зависимости от того, к какому из расширенных типов относится её аргумент.

В языке отсутствует специальный механизм конструкторов. Рекомендуемым методом создания и инициализации объектов является описание порождающих модулей и процедур (в традиционной терминологии ООП — factory).

Программа в такой технологии представляет собой набор относительно самостоятельных компонентов (в данном случае — модулей), имеющих скрытую от внешнего мира внутреннюю структуру и чётко определённый интерфейс. Модули могут загружаться и выгружаться динамически, во время работы программы, система предоставляет развитые средства контроля типов во время выполнения, которые позволяют писать универсальные алгоритмы обработки данных, не зависящие от конкретных типов этих данных (например, библиотека для работы с СУБД может предоставлять методы, записывающие результат запроса из базы в запись произвольной структуры, если набор и типы полей этой записи соответствуют набору и типам полей в БД).

В компонентной парадигме считается неудачным архитектурное решение, связанное с широким использованием наследования реализации от типов, объявленных в другом компоненте, поскольку это приводит к явлению, известному как «хрупкость базового типа» — после того, как от базового типа порождено большое количество типов-наследников (причём часть из них может быть даже неизвестна разработчику базового типа), любые изменения в реализации базового типа становятся крайне рискованными, так как они могут непредсказуемым образом отразиться на типах-потомках.

Известно, что одной из проблем применения объектно-ориентированного программирования в системном программировании является необходимость иметь группы маленьких классов, которые могли бы взаимодействовать без дополнительных накладных расходов. В Обероне этой проблемы нет — все типы, определённые в одном модуле, видят друг друга, а проблем с надёжностью это не создаёт, так как модуль всё равно разрабатывается, тестируется и сопровождается как единое целое.

Типичная система, разработанная на Обероне, представляет собой набор модулей с процедурными интерфейсами, через которые модули обмениваются данными, в том числе и объектами. При этом все средства инкапсуляции действуют только в межмодульном взаимодействии, что делает удобным системное программирование с использованием объектов.

Объектно-ориентированное программирование

Средства объектного программирования интерпретируются в Обероне как естественное развитие средств работы с записями в модульной системе, точнее, как технический инструментарий для решения конкретной архитектурной задачи: обеспечить эффективное «разделение труда» между различными модулями при работе с динамическими типами и структурами данных: например, работа с указателями в списке может быть скрыта (вместе с соответствующими полями) в одном модуле, а определение и работа с конкретным «наполнением» элементов списка — задаваться в другом (или, чаще, других). В этом смысле технология объектного программирования в Обероне подчинена концепции модульности: она здесь является, скорее, средством описания данных, чем средством построения архитектуры приложения в целом.

Влияние Оберона на другие языки[править | править вики-текст]

По утверждению Вирта[9], разработчики языка Java за несколько лет до её создания «изучили исходные коды Оберона и, в частности, исходные коды обероновских сборщиков мусора. Потом они испортили Оберон синтаксисом Си и назвали получившееся словом Java». Хотя от устного выступления нельзя требовать абсолютной точности формулировок, но во всяком случае несомненное сходство идеологий Оберона и Java (стремление к минимализму и строгой типизации, ограничение множественного наследования, автоматическое управление памятью) говорит о том, что здесь имеет место определённый консенсус относительно того, какие средства должны составлять ядро современного языка программирования общего назначения. Однако если в Обероне и его прямых наследниках минимализм остаётся во главе угла, разработчики Java пошли по пути экстенсивного наращивания возможностей языка.

В само семейство языков Оберон входят также Оберон-07, Оберон-2, Component Pascal (Компонентный Паскаль), Активный Оберон, OberonScript и др.

Версии языка[править | править вики-текст]

Исходная версия Оберона («классический Оберон») — наиболее краткая, с наименьшим количеством ключевых слов и синтаксических конструкций. Она была использована в качестве базы для создания семейства языков, каждый из которых расширяет классический в каком-либо направлении либо отличается от него некоторыми деталями.

Оберон-2[править | править вики-текст]

В 1992 году Никлаус Вирт и его ученик Ханспетер Мёссенбёк (нем.)русск. — ныне профессор Университета им. Иоганна Кеплера в Линце — опубликовали описание дополненного варианта Оберона, получившего название Оберон-2. Он представляет собой уточнённую версию классического Оберона. Дополнения, внесённые в Оберон-2 и оформленные очень экономно, заключаются в следующем:

  • добавлены процедуры, связанные с типом, допускающие переопределение для порожденных типов (приблизительный аналог виртуальных методов в других объектно-ориентированных языках);
  • в язык возвращён оператор цикла с шагом FOR;
  • добавлена возможность экспорта описаний в режиме «только для чтения»[10][11].

Любопытно, что несмотря на расширение языка, объём формального описания синтаксиса Оберона-2 меньше, чем у классического Оберона. Это произошло в результате оптимизации описания синтаксиса. Существует оптимизирующий компилятор XDS[12] для Oberon-2.

Есть также компилятор языка Оберон-2[13] в байт-код виртуальной машины Java (Java Virtual Machine). Разработанный С. Свердловым (Вологда, ВГПУ) в 1998 году компилятор работает в Windows 95/NT. Генерирует файлы классов (.class), которые могут загружаться и исполняться виртуальной машиной языка Java. Позволяет создавать приложения и аплеты. Содержит стандартные для Оберона, так называемые Дубовые требования библиотеки, а также интерфейсы для Java API.

ETH Oberon[править | править вики-текст]

ETH Oberon, реализации которого имеются для многих вычислительных платформ.

Oberon SA[править | править вики-текст]

Oberon SA — это версия языка Оберон, разработанная Н. Виртом для процессора Strong-ARM, используемого в беспилотном вертолете.

На основе опыта разработки Oberon SA Н. Вирт в 2007 году подготовил изменения и дополнения к классическому Оберону[14][15] для более строгой поддержки структурного программирования, чем, например, в Oberon-2 или Компонентном Паскале. Новая версия языка получила название Oberon-07[16]. Имеется перевод «The Programming Language Oberon, Revision 1.11.2008» на русский язык[17]. Но в отношении поддержки объектно-ориентированного программирования язык Oberon-07 не следует за Обероном-2, а продолжает минималистичную линию классического Оберона, включая отсутствие поддержки процедур, привязанных к типам записей.

Oberon-07[править | править вики-текст]

Oberon-07 имеет следующие основные отличия от классического Оберона:

  • в цикле WHILE разрешены несколько охраняемых ветвей (ELSIF … DO). Тем самым обеспечена полная явная поддержка цикла Дейкстры[18]. Ранее цикл Дейкстры моделировался при помощи цикла LOOP;
  • соответственно, исключен неструктурированный цикл LOOP вместе с оператором EXIT (выход из цикла);
  • в процедуре теперь может быть только одна точка выхода, фиксированная в конце тела процедуры: RETURN, в сущности, перестал быть оператором, превратившись в такую же синтаксическую часть описания процедуры, как ключевое слово PROCEDURE и т. д.;
  • добавлен оператор цикла FOR;
  • исключено неявное приведение типа INTEGER к REAL и типов с различной разрядностью друг к другу;
  • разрешены ссылки только на записи;
  • уточнено правило импорта/экспорта: экспорт переменных разрешён только для чтения, спецификатор экспорта один — «*»;
  • уточнены типы данных — CHAR поддерживает множество Latin-1, INTEGER — −2^31 — +2^31-1, REAL и LONGREAL — IEEE Standard, 32 и 64 бита соответственно, SET — множество целых между 0 и 31.

Австралийская компания CFB Software (г. Брисбен) при Университете штата Квинсленд разработала IDE Astrobe[19] для языка Oberon-07 для микроконтроллеров ARM7 компании NXP (Philips) и синтаксические диаграммы языка Oberon-07[20], а также рекомендации по стилю программ на Oberon-07[21].

Языки семейства Oberon[править | править вики-текст]

Компонентный Паскаль (Component Pascal)[править | править вики-текст]

Оберон-2 сразу после опубликования в 1992 году рассматривался как кандидат на роль стандарта языка (конференция Oakwood Conference, Croydon, 1993), но практический опыт, накопленный при создании больших программных комплексов, выявил некоторые слабости нововведений и желательность дальнейших уточнений (что лишний раз подчёркивает мудрость консерватизма, проявленного Виртом в определении классического Оберона). Эти уточнения были предприняты в варианте Оберона-2, названном Компонентный Паскаль и опубликованном в 1999 году, компанией Oberon microsystems[22], образованной в 1992 году учениками Вирта (сам Вирт стал членом совета директоров). Как и при переходе от Оберона к Оберону-2, эти уточнения сделаны наиболее экономно[23]. В частности, теперь язык полностью поддерживает методологию компонентно-ориентированного программирования. Благодаря последнему обстоятельству, Компонентный Паскаль на данный момент является, по-видимому, наиболее совершенным среди прямых потомков классического Оберона. Однако он может быть редуцирован не только к подмножеству, эквивалентному первоначальному Оберону, но и к другому полноценному минималистичному подмножеству, в котором наследование и переопределение методов допускается только для чисто интерфейсных типов и методов (определенных с атрибутом ABSTRACT). Это обстоятельство выявляет несколько промежуточный характер Оберона-2.

В Компонентный Паскаль добавлены средства, позволяющие разработчику полностью контролировать расширение экспортируемых типов и переопределение методов (атрибуты EXTENSIBLE, ABSTRACT, NEW, EMPTY, а также возможность ограниченного экспорта метода «только для реализации»). Добавлен блок завершения тела модуля (ключевое слово CLOSE) и предопределенный пустой метод FINALIZE. Система основных (элементарных) типов приведена в соответствие с типами Java. Введён неявный строковый тип. Компания Oberon Microsystems, определившая Компонентный Паскаль, выпустила также фреймворк BlackBox Component Framework и среду визуального программирования BlackBox Component Builder[24] — небольшие по размеру и нетребовательные к ресурсам, целиком построенные на Компонентном Паскале.

Впоследствии компилятор BlackBox был встроен в кросс-платформенную среду программирования Denia, в частности для операционной системы реального времени JBed, полностью написанной на Компонентном Паскале.

Активный Оберон (Active Oberon), Zonnon[править | править вики-текст]

Эти языки уже с полным основанием можно назвать не расширениями или версиями Оберона, а самостоятельными языками. В них существенно расширен синтаксис, введены конструкции для описания классических «свойств» (property) с контролем чтения/записи, числовых типов с задаваемым размером в битах. Введена поддержка активных объектов, обменивающихся сообщениями в формате, определяемом РБНФ-описанием, обработка исключений[25].

Интересные факты[править | править вики-текст]

  • Эпиграфом к описанию оригинального Оберона было выбрано высказывание Эйнштейна: «Делай настолько просто, насколько возможно, но не проще этого». В описании Оберона-2 этого эпиграфа нет.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. Идея динамической кодогенерации взята из диссертации ученика Вирта Микаэля Франца (PC World Russia CD, September 2005)
  2. Лекция Н. Вирта в Нижегородском государственном университете им. Н. И. Лобачевского
  3. Генеалогия языков семейства Оберон (англ.)
  4. 1 2 3 Никлаус Вирт. «От модулы к Оберону» (рус.). ИнфоАрт. Проверено 25 октября 2010. Архивировано из первоисточника 22 августа 2011.
  5. N. Wirth and J. Gutknecht. Project Oberon. Addison-Wesley, 1992.
  6. N. Wirth. The Programming Language Oberon. Software — Practice and Experience, Vol.18, No.7, p.671-690
  7. Wirth N. (1988) «The Programming Language Oberon» // Software — Practice and Experience, Vol.18, No.7, p.671-690.
  8. C. Szyperski. Component Software — Beyond Object-Oriented Programming. Addison-Wesley, 1998.
  9. Лекция Н. Вирта в Нижегородском государственном университете им. Н. И. Лобачевского
  10. Язык программирования Оберон-2, Х. Мёссенбёк, Н. Вирт
  11. A Description of the Oberon-2 Language, Paul Floyd  (англ.)
  12. XDS Family of Products
  13. компилятор Оберон-2 в байт-код виртуальной машины Java (Java Virtual Machine)
  14. Difference between Oberon-07 and Oberon
  15. Oberon at a glance
  16. The Programming Language Oberon, Revision 20.7.2011
  17. Перевод «The Programming Language Oberon, Revision 1.11.2008» на русский язык
  18. Э.Дейкстра. Дисциплина программирования. Мир, Москва, 1978
  19. IDE Astrobe для языка Oberon-07
  20. Синтаксические диаграммы языка Oberon-07
  21. Рекомендации по стилю программ на Oberon-07 в главе 10 Programming Conventions and Guidelines
  22. Oberon microsystems AG (нем.)
  23. Сообщение о языке Компонентный Паскаль
  24. BlackBox Component Builder
  25. Active Oberon for .NET:An Exercise in Object Model Mappin

Литература[править | править вики-текст]

На английском языке

Ссылки[править | править вики-текст]