1. Представление языка
В противовес промышленным языкам (включение максимума средств, принцип сундука) исповедует принцип чемоданчика (только самое необходимое). Проще и при этом мощнее канонического Паскаля.
Поддерживает такие парадигмы (подходы) программирования:
- процедурное (procedural programming);
- модульное (modular programming);
- программирование абстрактных типов данных (ADT programming);
- расширяющее (проекционное, extensible programming);
- ООП (object-oriented programming);
- компонентное (component-oriented programming);
- системное (systems programming);
- рефлективное (reflective programming).
Весь ввод-вывод, параллельное программирование и обработка исключений вынесены на уровень внешних библиотек.
В основе языка лежат модули и расширение комбинированных типов (RECORD). Это позволяет Оберону выступать в качестве основы построения расширяемого каркаса программной системы (с подключением компонентов без перекомпиляции) и как ассемблеру ООП.
Крайне прост в изучении и освоении. Легко воспринимается теми, кто знаком с Паскалем. Поддерживает преемственность базовых идей программирования. Ниже приведен псевдокод, отражающий в синтаксисе языка эту преемственность и демонстрирующий ключевой механизм расширения (наследования) типов.
2. Визитная карточка языка
Специфика ООП в Обероне. Особенность языка состоит в механизме наследования через тип (RECORD), а не через модуль (CLASS). Этот механизм позволяет более аккуратно управлять областью видимости: несколько RECORD-классов можно включать в капсулу одного модуля, что дает возможность получать доступ к деталям реализации соседей без нарушения принципа сокрытия информации и без лишних накладных расходов. Методы в Обероне представляются полями процедурных типов (процедурные типы Оберона взяты в C# за основу представления делегатов).
Не нужны пространства имен — вместо этого есть восходящая к Дэвиду Парнасу четкая концепция модуля, оперирующего понятием экспорта-импорта сущностей языка (константы, типы, поля типов, переменные, процедуры).
Модули поддерживают полноценную раздельную компиляцию (интерфейсная часть извлекается автоматически по имеющейся маркировке экспорта), являются единицей загрузки и основой построения программных компонентов.
3. Отличия от Паскаля
A. Синтаксис
- Важен регистр букв в названии идентификаторов.
- Зарезервированные идентификаторы языка всегда пишутся большими буквами.
- Убраны скобки begin-end. Начало оператора определяется его именем, окончание — словом END. Для модулей и процедур требуется в конце повторять свое имя после слова END. Комментарии обозначаются связкой (* *).
B. Типы данных
- Убраны перечисления, диапазоны. Тип SET определяет набор (множество) целых в диапазоне от 0 до MAX(SET). Введен процедурный тип (PROCEDURE) с операциями вызова и присваивания.
- Индексы массивов нумеруются с нуля. Введены многомерные открытые массивы (ARRAY OF).
- Убраны вариантные записи. Они заменяются расширяемыми комбинированными типами (см. E.1).
C. Процедурное программирование
- Убрано деление на процедуры и функции: процедуры могут возвращать значения через свое имя.
- Убран оператор FOR как источник ошибок.
- Добавлен универсальный цикл LOOP-END с оператором выхода EXIT.
D. Модульное программирование
- Исключено понятие программы (Паскаль), как и деление на программные и библиотечные модули (Modula-2). Есть единое понятие модуля — единицы компиляции и исполнения (загрузки). Он может экспортировать сущности: константы, типы, поля типов, переменные, процедуры. Вложенные (локальные) модули запрещены. Экспортируемые процедуры без параметров называются командами и определяют точки вызова модуля (программы).
- экспорта используется значок * (звездочка) при определении сущности сразу после ее имени. Интерфейсный (описательный) модуль строится автоматически компилятором.
- Импортируются только модули (IMPORT). Допустимо введение псевдонима модуля. Импортируемые идентификаторы в тексте обязательно квалифицируются именем соответствующего модуля.
E. Объектно-ориентированное программирование
- Комбинированный тип (RECORD) может расширяться путем добавления полей записи (в том числе и процедурных типов). Это определяет механизм проекции типов, аналогичный наследованию в традиционном ООП.
- работы с расширяемыми типами введена операция принадлежности типу (IS), а также оператор WITH (привратник типа).
- Язык предусматривает механизм автоматической сборки мусора.
F. Системное программирование
- Введен псевдомодуль SYSTEM, который является интерфейсом между языком и низкоуровневыми средствами. Импортирование SYSTEM сигнализирует о привязке к конкретной операционной платформе.
- Введены процедуры адресной арифметики (ADR, BIT, LSH, ROT, CC), преобразования типа (VAL), работы с памятью (GET, PUT, MOVE) и резервирования области памяти (NEW).
- Введен тип BYTE. Формальный параметр вида ARRAY OF BYTE, передаваемый по ссылке, совместим с любым типом.
4. Краткая характеристика основных языков Оберон-семейства
- Оберон (Никлаус Вирт, 1988) — изящный компактный язык (меньше и проще Паскаля), идеален для преподавания основ информатики (computer science), концепций структурного, модульного и объектно-ориентированного программирования (ООП). Хорошо подходит для реализации малых и средних проектов. Имеет компиляторы внутри Oberon System и Juice. Блестящий кандидат на роль эсперанто программирования.
- Oberon-2 (Ханспетер Мессенбок, Никлаус Вирт, 1991) — развитие Оберона в сторону привычного ООП в связке с Modula-2 (как языка системного программирования) создает хорошую основу для реализации крупных проектов из макромира и микромира (встроенных систем, систем реального времени). Двуязыковая связка отлично реализована в системе XDS (Excelsior). Позволяет осуществлять кросс-разработку в Win32/Linux за счет трансляторов промышленного качества в Си и C++. Если нужно обобщение алгоритмов (задействование ООП), написание автономных программ, устойчивая работа с ОС на уровне системных вызовов, использование внешних библиотек на других языках, перенос на другие платформы через Cи/C++, эффективная реализация (оптимальный объектный код), то подходит Oberon-2 в исполнении XDS.
- Компонентный Паскаль/Component Pascal (Клеменс Шиперски, Куно Пфистер, 1997) — развитие Оберона и Oberon-2 в сторону компонентно-ориентированного программирования (КОП). Хорошо проявляет себя для программирования в большом (programming-in-a-large). Если требуется строить расширяемую систему с использованием КОП, подходов программной инженерии, иметь прямой выход на современные наработки для Win32, .NET и Java Platform, то нужен Component Pascal в реализациях BlackBox и GPCP. В реализации BlackBox обладает уникальной особенностью динамического расширения систем («на лету») за счет поддержки Оберон-компонентов, легко настраивается на решение задач любого уровня сложности (от преподавания информатики в школах до сложных исследовательских систем), имеет средство формирования COM-компонентов со сборкой мусора (Direct-To-COM Compiler), получившее на CeBIT приз за технологическое совершество.
- Active Oberon (Юрг Гуткнехт, Патрик Реали, 2000) — воплощение в Обероне идеи активных объектов (мультипроцессные системы для многопроцессорных конфигураций). Исследовательский проект, выполняемый группой проф. Гуткнехта (ETH, Цюрих). Базовый язык для реализации ОС Bluebottle — дальнейшего развития системы Oberon. Поддерживает работу в Win32, на «голой» машине (PC), сосуществует с Java и .NET. Показал отличную эффективность в специфических областях (мультимедиа, повсеместный компьютинг).
- Zonnon (Юрг Гуткнехт, Евгений Зуев, 2003) — ревизия Modula-2 и Оберона сквозь призму идей языка Mesa (Xerox PARC) и платформу Microsoft .NET. Исследовательский проект группы проф. Гуткнехта. Ориентирован в большей степени на особенности реализации новых языков и компиляторов для платформы .NET с последующей интеграцией в Microsoft Visual Studio .NET (2005). Представляет интерес в преподавании на старших курсах вузов, несколько сложен для начинающих программистов, но достаточно красиво решает проблемы «мирного сосуществования» модульного программирования, ООП и КОП. Представитель композиционного программирования.
5. Эталонные описания языков
Оберон-семейства
- Оберон
N. Wirth. The Programming Language Oberon (01.10.1990) - Oberon-2
H. Moessenboeck, N. Wirth. The Programming Language Oberon-2 (March 1995) - Component Pascal
Oberon microsystems. Component Pascal Language Report (March 2001) - Active Oberon
P. Reali. Active Oberon Language Report (27.10.2004) - Zonnon
J. Gutknecht, E. Zueff. Zonnon Language Report (October 2004)
6. Источники информации
Языки Никлауса Вирта ...................... http://www.oberon2005.ru
ETH Oberon ............................................... http://www.oberon.ethz.ch
Проект «Информатика-21» ........... http://www.inr.ac.ru/~info21
Королевство Delphi .... http://www.delphikingdom.ru/asp/talk.asp
Oberon microsystems ...................................... http://www.oberon.ch
Excelsior ................................................ http://www.excelsior-usa.com
QUT .............................................. http://www.plas.fit.qut.edu.au/gpcp
JOB ................................................ http://www.uni-vologda.ac.ru/~c3c
OO2C .............................................................. http://ooc.sourceforge.net
Active Oberon ...................................... http://www.bluebottle.ethz.ch
Zonnon .......................................................... http://www.zonnon.ethz.ch
Весь инструментарий представлен на «Мир ПК-диске» №9/05.
Табл. 1. Представление языка
Автор | Никлаус Вирт (Niklaus Wirth, р. 1934) |
Год рождения | 1988 |
Место рождения | Швейцария, Цюрих. Высшая Политехническая школа ETH |
Каноническое описание | Oberon Language Report. Revised Edition. 01.10.1990 |
Табл. 2. Визитная карточка языка
Базовые типы | BOOLEAN, CHAR, SET, SHORTINT, INTEGER, LONGINT, REAL, LONGREAL |
Операции | +, -, *, /, DIV, MOD, &, OR, ~, IN, IS, =, #, <, <=, >, >= |
Конструкторы типов | ARRAY, RECORD, POINTER, PROCEDURE |
Эквивалентность типов | Именная. Совместимость по включению для базовых числовых типов. Преобразование типов через процедуру VAL |
Операторы ветвления | IF (ELSIF), CASE |
Операторы цикла | LOOP, WHILE, REPEAT |
Операторы выхода | EXIT, RETURN |
Комментарии | (* *) |
Процедуры | Процедуры и процедуры-функции. Вложенность допустима |
Передача параметров | По ссылке (VAR) и по значению |
Стандартные процедуры | INC, DEC, INCL, EXCL, COPY, NEW, HALT ABS, ODD, CAP, ASH, LEN, MAX, MIN, SIZE ORD, CHR, SHORT, LONG, ENTIER |
Модули | Явный экспорт и импорт, псевдонимы, уточнение (квалифицирование) импортируемых идентификаторов. Вложенность недопустима |
Системные типы | BYTE |
Системные процедуры | ADR, BIT, CC, LSH, ROT, VAL, GET, PUT, MOVE, NEW |
Табл. 3. Основные системы программирования
Платформы | Oberon-2 | Component Pascal |
S=W32 T=W32 | XDS-Win | BlackBox |
S=W32, T=JAV | JOB | - |
S=W32, T=NET | - | GPCP-NET, GPCP-Studio |
S=W32, T= ANY | XDS-C-Win | - |
S=JAV, T=JAV | - | GPCP-JVM, GPCP-Eclipse |
S=LNX, T=LNX | XDS-Linux | - |
S=LNX, T=ANY | XDS-C-Linux, OO2C | - |