Введение
Язык программирования Oberon 2 является расширением оригинального языка программирования Oberon, добавляющим ограниченное рефлексивное программирование (рефлексию) и средства объектно-ориентированного программирования, открытые массивы в качестве базовых типов указателей, экспорт полей только для чтения и повторное введение цикла FOR из Modula 2. Он был разработан в 1991 году в ETH Zurich Никлаусом Виртом и Ханспетером Мёссенбёком, который в настоящее время работает в Институте системного программного обеспечения (SSW) Университета Линца, Австрия. Oberon 2 является надмножеством Oberon, полностью совместим с ним и являлся переработкой Object Oberon. Oberon 2 унаследовал ограниченную рефлексию и единичное наследование ("расширение типа") без интерфейсов или миксинов из Oberon, но добавил эффективные виртуальные методы ("процедуры, связанные с типом"). Вызовы методов разрешались во время выполнения с использованием виртуальных таблиц методов в стиле C++. По сравнению с полностью объектно-ориентированными языками, такими как Smalltalk, в Oberon 2 базовые типы данных и классы не являются объектами, многие операции не являются методами, отсутствует передача сообщений (её можно эмулировать в некоторой степени с помощью рефлексии и расширения сообщений, как продемонстрировано в ETH Oberon), а полиморфизм ограничен подклассами общего класса (нет "утиной типизации", как в Python, и невозможно определить интерфейсы, как в Java). Oberon 2 не поддерживает инкапсуляцию на уровне объектов или классов, но модули могут использоваться для этой цели. Рефлексия в Oberon 2 не использует метаобъекты, а просто считывает данные из дескрипторов типов, скомпилированных в исполняемые файлы и представленных в модулях, определяющих типы и/или процедуры. Если формат этих структур представлен на уровне языка (как это, например, в случае с ETH Oberon), рефлексия может быть реализована на уровне библиотек. Таким образом, её можно реализовать почти полностью на уровне библиотеки, не изменяя код языка. Действительно, ETH Oberon широко использует возможности рефлексии как на уровне языка, так и на уровне библиотек. Oberon 2 предоставляет встроенную поддержку во время выполнения для сборки мусора, аналогичную Java, и выполняет проверки границ и индексов массивов, что устраняет потенциальные проблемы перезаписи стека и границ массивов, а также проблемы ручного управления памятью, свойственные C и C++. Раздельная компиляция с использованием файлов символов и пространств имен посредством модульной архитектуры обеспечивает быструю перекомпиляцию, поскольку перекомпилировать необходимо только модули с измененными интерфейсами. Язык Component Pascal является усовершенствованием (надмножеством) Oberon 2.
Oberon 2 is an extension of the original Oberon programming language that adds limited reflective programming (reflection) and object oriented programming facilities, open arrays as pointer base types, read only field export, and reintroduces the FOR loop from Modula 2. It was developed in 1991 at ETH Zurich by Niklaus Wirth and Hanspeter Mössenböck, who is now at Institut für Systemsoftware (SSW) of the University of Linz, Austria. Oberon 2 is a superset of Oberon, is fully compatible with it, and was a redesign of Object Oberon. Oberon 2 inherited limited reflection and single inheritance ("type extension") without the interfaces or mixins from Oberon, but added efficient virtual methods ("type bound procedures"). Method calls were resolved at runtime using C++ style virtual method tables. Compared to fully object oriented languages like Smalltalk, in Oberon 2, basic data types and classes are not objects, many operations are not methods, there is no message passing (it can be emulated somewhat by reflection and through message extension, as demonstrated in ETH Oberon), and polymorphism is limited to subclasses of a common class (no duck typing as in Python, and it's not possible to define interfaces as in Java). Oberon 2 does not support encapsulation at object or class level, but modules can be used for this purpose. Reflection in Oberon 2 does not use metaobjects, but simply reads from type descriptors compiled into the executable binaries, and exposed in the modules that define the types and/or procedures. If the format of these structures are exposed at the language level (as is the case for ETH Oberon, for example), reflection could be implemented at the library level. It could thus be implemented almost entirely at library level, without changing the language code. Indeed, ETH Oberon makes use of language level and library level reflection abilities extensively. Oberon 2 provides built in runtime support for garbage collection similar to Java and performs bounds and array index checks, etc., that eliminate the potential stack and array bounds overwriting problems and manual memory management issues inherent in C and C++. Separate compiling using symbol files and namespaces via the module architecture ensure fast rebuilds since only modules with changed interfaces need to be recompiled. The language Component Pascal is a refinement (a superset) of Oberon 2.
Процедуры, связанные с типом
Процедуры могут быть связаны с типом записи (или указателем). Они эквивалентны методам экземпляров в объектно-ориентированном программировании.
Экспорт только для чтения
Использование экспортируемых переменных и полей записи может быть ограничено доступом только для чтения. Это обозначается флагом видимости " ".
Открытые массивы
Открытые массивы, которые ранее можно было объявлять только в качестве типов формальных параметров, теперь могут быть объявлены как базовые типы указателей.
Заявление FOR
Оператор FOR языков Pascal и Modula 2 не был реализован в Oberon. Он вновь введен в Oberon 2.
Проверка типа во время выполнения
Oberon 2 предоставляет несколько механизмов для проверки динамического типа объекта. Например, если объект типа Bird может быть создан как Duck или Cuckoo, Oberon 2 позволяет программисту реагировать на фактический тип объекта во время выполнения программы. Первый, наиболее распространенный подход – полагаться на систему привязки типов. Второй подход – использовать оператор WITH, который позволяет напрямую проверять динамический подтип переменной. В обоих случаях, после определения подтипа, программист может использовать любые процедуры или переменные, связанные с этим типом, которые подходят для данного подтипа. Примеры этих подходов приведены ниже. Следует отметить, что форма оператора WITH, используемая в Oberon 2, не связана с оператором WITH в Pascal и Modula 2. Этот способ сокращения доступа к полям записи не реализован в Oberon или Oberon 2.
Оператор ИС
Третий подход возможен с использованием оператора IS. Это оператор отношения, имеющий такой же приоритет, как операторы равенства (=), больше (>), и другие, но который проверяет динамический тип. Однако, в отличие от двух других подходов, он не предоставляет программисту доступ к обнаруженному подтипу.
Реализация
Компиляторы Oberon 2, поддерживаемые ETH, включают версии для Windows, Linux, Solaris и macOS. Компилятор Oxford Oberon 2 компилирует в машинный код и может использовать JIT-компиляцию в Windows, Linux и macOS. Он разработан и поддерживается Майком Спайви и использует виртуальную машину Keiko. Существует сканер Lex для Oberon 2 и парсер Yacc, разработанные Стивеном Дж. Беваном из Манчестерского университета (Великобритания) на основе справочника Мёссенбёка и Вирта. Это версия 1.4. Существует релиз под названием Native Oberon, включающий операционную систему и способный к прямой загрузке на аппаратном обеспечении класса PC. В ETHZ разработана реализация Oberon для платформы .NET с добавлением некоторых незначительных расширений, связанных с .NET. Programmer's Open Workbench (POW!) – это очень простая интегрированная среда разработки, поставляемая с редактором, компоновщиком и компилятором Oberon 2. Компиляция осуществляется в исполняемые файлы Windows. Предоставляется полный исходный код; компилятор написан на Oberon 2. Компилятор Java to Oberon (JOB) был разработан в Вологодском университете (Россия). Он генерирует объектный код в виде файлов классов Java (байт-код). Предоставляются некоторые классы, специфичные для JOB, которые совместимы с Java, но используют иерархию компонентов, более характерную для Oberon. Компилятор Optimizing Oberon 2 компилирует в C, используя инструментарий GNU Compiler Collection (GCC) для генерации программ. Oberon Script – это компилятор, который транслирует полный язык Oberon в JavaScript. Компилятор написан на JavaScript и может вызываться из веб-страниц для обработки скриптов, написанных на Oberon. XDS Modula2/Oberon2 – это система разработки компании Excelsior LLC (Новосибирск, Россия). Она содержит оптимизирующий компилятор для Intel Pentium или транслятор "via C" для разработки кроссплатформенного программного обеспечения. Доступна для Windows и Linux. Компилятор написан на Oberon 2 и компилирует сам себя. Oberon Revival – это проект по переносу Oberon 2 и Component Pascal (BlackBox Component Builder) на Linux и Win32. Ранее порт BlackBox для Linux был недоступен, и изначально он работал только на Microsoft Windows. XOberon – это операционная система реального времени для PowerPC, написанная на Oberon 2. Портативный компилятор Oberon 2 (OP2) был разработан для переноса системы Oberon на коммерчески доступные платформы.
Байт-код Keiko
Оберон-2 может быть ориентирован на виртуальную машину Кейко. Например, подобно некоторым другим языковым компиляторам (см. O-код, p-код и т.д.), компилятор Oxford Oberon 2 сначала компилирует в промежуточный байт-код (байт-код Keiko), который может быть интерпретирован интерпретатором байт-кода или скомпилирован в реальном времени (just-in-time компиляция).
the Oxford Oberon 2 compiler first compiles to an intermediate bytecode (Keiko bytecode) which can be interpreted with a byte code interpreter or use just in time compilation.