Оберон-2

редактировать
Оберон-2
OberonLogo.svg
Парадигма императивный, структурированный, модульный, объектно-ориентированный
Разработан Никлаус Вирт,
Впервые появился1991
Печатная дисциплина сильная, статическая
Под влиянием
Оберон, Модула-2, Паскаль
Под влиянием
Компонентный Паскаль, Go

Оберон-2 является расширением оригинальный Oberon язык программирования, который добавляет ограниченные возможности отражения и объектно-ориентированного программирования, открытые массивы в качестве базовых типов указателей, поле только для чтения экспорт и повторное введение цикла FOR из Modula-2.

. Он был разработан в 1991 году в ETH Zurich Никлаусом Виртом и Ханспетером Мессенбеком, которые сейчас находится в Институте системного программного обеспечения (SSW) Университета Линца ,, Австрия. Оберон-2 является расширенным набором Оберона и полностью с ним совместим. Оберон-2 был переработкой Объекта Оберон.

Оберон-2 унаследовал ограниченное отражение и одиночное наследование («расширение типа») без интерфейсов или миксинов от Оберона, но добавил эффективные виртуальные методы (" процедуры, связанные с типом "). Вызов методов разрешался во время выполнения с использованием таблиц виртуальных методов в стиле C ++.

По сравнению с полностью объектно-ориентированными языками программирования, такими как Smalltalk, в Oberon-2 базовые типы не являются объектами, классы не являются объектами, многие операции не являются методами, нет передача сообщений (в определенной степени это может быть эмулировано путем отражения и расширения сообщений, как показано в ETH Oberon), а полиморфизм ограничен подклассами общего класса (нет утка, набирающего, как в Python, и невозможно определить интерфейсы, как в Java ). Оберон-2 не поддерживает инкапсуляцию на уровне объекта / класса, но для этой цели можно использовать модули.

Отражение в Обероне-2 не использует метаобъекты, а просто читает из дескрипторов типов, скомпилированных в исполняемые двоичные файлы и представленных в модулях, которые определяют типы и / или процедуры. Если формат этих структур представлен на уровне языка (как, например, в случае с ETH Oberon), отражение может быть реализовано на уровне библиотеки. Таким образом, его можно было реализовать почти полностью на уровне библиотеки без изменения языкового кода. Действительно, ETH Oberon широко использует возможности отражения на уровне языка и библиотеки.

Oberon-2 обеспечивает встроенную поддержку сборки мусора во время выполнения, аналогичную Java, и выполняет проверки границ, индекса массива и т. Д., Что устраняет потенциальные проблемы перезаписи границ стека и массива и проблемы ручного управления памятью, присущие C / C ++. Раздельная компиляция с использованием файлов символов и пространств имен через модульную архитектуру обеспечивает быструю перекомпиляцию, поскольку необходимо перекомпилировать только модули с измененными интерфейсами.

Язык Component Pascal является усовершенствованием (надмножеством) Oberon-2.

Содержание

  • 1 Пример кода Оберон-2
  • 2 Расширения Оберон-2 для Оберона
    • 2.1 Процедуры с привязкой к типу
    • 2.2 Экспорт только для чтения
    • 2.3 Открытые массивы
    • 2.4 ДЛЯ Оператор
    • 2.5 Проверка типа во время выполнения
      • 2.5.1 Привязка типа
      • 2.5.2 Оператор WITH
      • 2.5.3 POINTER
      • 2.5.4 Оператор IS
  • 3 Синтаксис
  • 4 Реализации
  • 5 См. Также
  • 6 Ссылки
    • 6.1 Развитие Оберона и Оберона-2
    • 6.2 Подробные статьи
    • 6.3 Книги
  • 7 Внешние ссылки

Пример кода Оберон-2

Следующий код Оберона-2 будет реализовывать очень минимальный класс списка :

MODULE Lists; (*** объявлять глобальные константы, типы и переменные ***) TYPE List * = УКАЗАТЕЛЬ НА ListNode; ListNode = значение ЗАПИСИ: целое число; следующий: Список; КОНЕЦ; (*** объявить процедуры ***) PROCEDURE (l: List) Add * (v: Integer); НАЧАТЬ ЕСЛИ l = NIL ТО НОВОЕ (l); (* создать экземпляр записи *) l.value: = v ELSE l.next.Add (v) (* рекурсивный вызов.add (n) *) END END Add; ПРОЦЕДУРА (l: Список) Получить * (): Целое число; VAR v: целое число; BEGIN IF l = NIL THEN RETURN 0 (*.get () всегда должен возвращать INTEGER *) ELSE v: = l.value; (* эта строка выйдет из строя, если l равно NIL *) l: = l.next; RETURN v END END Получить; КОНЕЦ списков.

Расширения Оберон-2 для Оберона

Процедуры с привязкой к типу

Процедуры могут быть привязаны к типу записи (или указателя). Они эквивалентны методам экземпляра в объектно-ориентированной терминологии.

Экспорт только для чтения

Использование экспортируемых переменных и полей записи может быть ограничено доступом только для чтения. Это отображается с пометкой видимости «-».

Открытые массивы

Открытые массивы, которые раньше можно было объявлять только как формальные типы параметров, теперь могут быть объявлены как базовые типы указателей.

Оператор FOR

Оператор FOR Паскаля и Модулы-2 не был реализован в Oberon. Он повторно введен в Оберон-2.

Проверка типа во время выполнения

Оберон-2 предоставляет несколько механизмов для проверки динамического типа объекта. Например, если объект Bird может быть создан либо для Duck, либо для Cuckoo, Oberon-2 позволяет программисту реагировать на фактический тип объекта во время выполнения.

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

Обратите внимание, что форма оператора WITH, используемого в Oberon-2, не связана с оператором WITH Pascal и Modula-2. Этот метод сокращения доступа к полям записи не реализован ни в Обероне, ни в Обероне-2.

Типовая привязка

МОДУЛЬ Птицы; ТИП Птица * = ЗАПИСЬ звук *: МАССИВ 10 символов; КОНЕЦ; КОНЕЦ Птицы. МОДУЛЬ Утки; ИМПОРТ Птицы; ТИП Утка * = ЗАПИСЬ (Птицы. Птица) КОНЕЦ; ПРОЦЕДУРА SetSound * (VAR bird: Duck); BEGIN bird.sound: = "Кряк!" END SetSound; КОНЕЦ Утки. МОДУЛЬ Кукушки; ИМПОРТ Птицы; ТИП Кукушка * = ЗАПИСЬ (Птицы. Птица) КОНЕЦ; ПРОЦЕДУРА SetSound * (VAR bird: Cuckoo); BEGIN bird.sound: = "Кукушка!" END SetSound; КОНЕЦ кукушки.

Соператором

MODULE Test; ИМПОРТ, птицы, кукушки, утки; ТИП SomeBird * = ЗАПИСЬ (Birds.Bird) END; VAR sb: SomeBird; c: Кукушка. Кукушка; d: Утки Утка; ПРОЦЕДУРА SetSound * (VAR bird: Birds.Bird); НАЧНИТЕ птица: Cuckoos.Cuckoo DO bird.sound: = "Кукушка!" | bird: Ducks.Duck DO bird.sound: = "Кряк!" ELSE bird.sound: = "Твитнуть!" КОНЕЦ КОНЕЦ SetSound; ПРОЦЕДУРА MakeSound * (VAR b: Birds.Bird); НАЧАТЬ Out.Ln; Out.String (b.sound); Out.Ln END MakeSound; НАЧАТЬ SetSound (c); SetSound (d); SetSound (сб); MakeSound (c); MakeSound (d); MakeSound (sb) КОНЕЦ теста.

УКАЗАТЕЛЬ
МОДУЛЬ PointerBirds; ИМПОРТ Out; ТИП BirdRec * = ЗАПИСЬ звук *: МАССИВ 10 символов; КОНЕЦ; DuckRec * = ЗАПИСЬ (BirdRec) КОНЕЦ; CuckooRec * = ЗАПИСЬ (BirdRec) КОНЕЦ; Bird = УКАЗАТЕЛЬ НА BirdRec; Cuckoo = УКАЗАТЕЛЬ НА CuckooRec; Duck = УКАЗАТЕЛЬ НА DuckRec; VAR pb: Bird; ПК: Кукушка; pd: Утка; ПРОЦЕДУРА SetDuckSound * (птица: Утка); BEGIN bird.sound: = "Кряк!" КОНЕЦ SetDuckSound; ПРОЦЕДУРА SetCuckooSound * (птица: кукушка); BEGIN bird.sound: = "Кукушка!" КОНЕЦ SetCuckooSound; ПРОЦЕДУРА SetSound * (птица: Bird); НАЧНИТЕ с птицы: Cuckoo DO SetCuckooSound (bird) | bird: Duck DO SetDuckSound (bird) ELSE bird.sound: = "Твитнуть!" КОНЕЦ КОНЕЦ SetSound; НАЧАТЬ НОВЫЙ (шт); НОВЫЙ (pd); SetCuckooSound (ПК); SetDuckSound (pd); Out.Ln; Out.String (pc ^.sound); Out.Ln; Out.Ln; Out.String (пд ^.звук); Out.Ln; SetSound (шт); SetSound (pd); Out.Ln; Out.String (pc ^.sound); Out.Ln; Out.Ln; Out.String (пд ^.звук); Out.Ln; (* -------------------------------------- *) (* Передать динамический тип в процедуру *) pb: = pd; SetDuckSound (PB (Утка)); Out.Ln; Out.String (pb ^.sound); Out.Ln; pb: = pc; SetCuckooSound (pb (Кукушка)); Out.Ln; Out.String (pb ^.sound); Out.Ln; (* -------------------------------------- *) SetSound (pb); Out.Ln; Out.String (pb ^.sound); Out.Ln; pb: = pd; SetSound (пб); Out.Ln; Out.String (pb ^.sound); Out.Ln; (* -------------------------------------- *) NEW (pb); SetSound (пб); Out.Ln; Out.String (pb ^.sound); Out.Ln END PointerBirds.

ISоператор

Третий подход возможен с использованием ISоператора . Это оператор отношения с таким же приоритетом, как равно (=), больше (>) и т. Д., Но который проверяет динамический тип. Однако, в отличие от двух других подходов, он не позволяет программисту получить доступ к обнаруженному подтипу.

Синтаксис

Развитие АЛГОЛА - Паскаль - Модула-2 - Оберон - Компонентное семейство языков Pascal отличается упрощением синтаксиса языка. Весь язык Оберон-2 описан (Mössenböck Wirth, март 1995) с использованием только 33 грамматических произведений в расширенной форме Бэкуса-Наура, как показано ниже.

Модуль = МОДУЛЬ идент. ";" [ImportList] DeclSeq [BEGIN StatementSeq] END идентификатор ".". ImportList = ИМПОРТ [идентификатор ": ="] идентификатор {"," [идентификатор ": ="] идентификатор} ";". DeclSeq = {CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}} {ProcDecl ";" | ForwardDecl ";"}. ConstDecl = IdentDef "=" ConstExpr. TypeDecl = IdentDef "=" Тип. VarDecl = IdentList ":" Тип. ProcDecl = PROCEDURE [Получатель] IdentDef [FormalPars] ";" DeclSeq [BEGIN StatementSeq] КОНЕЦ идент. ForwardDecl = PROCEDURE "^" [Получатель] IdentDef [FormalPars]. FormalPars = "(" [FPSection {";" FPSection}] ")" [":" Qualident]. FPSection = [VAR] ident {"," identify} ":" Тип. Получатель = "(" [VAR] идентификатор ":" идентификатор ")". Тип = Qualident | ARRAY [ConstExpr {"," ConstExpr}] OF Тип | ЗАПИСЬ ["(" Qualident ")"] FieldList {";" FieldList} END | УКАЗАТЕЛЬ НА Тип | ПРОЦЕДУРА [FormalPars]. FieldList = [IdentList ":" Тип]. StatementSeq = Заявление {";" Утверждение}. Заявление = [обозначение ": =" Выражение | Обозначение ["(" [ExprList] ")"] | IF Expr THEN StatementSeq {ELSIF Expr THEN StatementSeq} [ELSE StatementSeq] END | CASE Expr OF Case {"|" Case} [ELSE StatementSeq] END | WHILE Expr DO StatementSeq END | ПОВТОРИТЬ StatementSeq ДО Expr | FOR идентификатор ": =" Выражение TO Выражение [BY ConstExpr] DO StatementSeq END | LOOP StatementSeq END | С Guard DO StatementSeq {"|" Защитить DO StatementSeq} [ELSE StatementSeq] END | ВЫХОД | ВОЗВРАТ [Выражение]]. Case = [CaseLabels {"," CaseLabels} ":" StatementSeq]. CaseLabels = ConstExpr [".." ConstExpr]. Guard = Qualident ":" Qualident. ConstExpr = Выражение. Выражение = Простое выражение [Простое выражение отношения]. SimpleExpr = ["+" | "-"] Срок действия {Срок действия дополнения}. Срок = Фактор {MulOp Factor}. Фактор = Обозначение ["(" [ExprList] ")"] | номер | персонаж | строка | NIL | Установить | "(" Expr ")" | Фактор "~". Set = "{" [Элемент {"," Элемент}] "}". Элемент = Выражение [".." Выражение]. Отношение = "=" | "#" | «<" | "<=" | ">» | ">=" | В | ЯВЛЯЕТСЯ. AddOp = "+" | "-" | ИЛИ. MulOp = "*" | "/" | DIV | MOD | "". Обозначение = Qualident {"." идент | "[" ExprList "]" | "^" | "(" Qualident ")"}. ExprList = Expr {"," Expr}. IdentList = IdentDef {"," IdentDef}. Qualident = [идент "."] Идент. IdentDef = identity ["*" | «-»].

Реализации

Компиляторы Oberon-2, поддерживаемые ETH, включают версии для Windows, Linux, Solaris, Mac OS X.

The Oxford Oberon-2 компилятор компилируется в машинный код и может использовать JIT в Windows, Linux и Mac OS X. Он создан / поддерживается Майком Спайви и использует виртуальную машину Keiko.

Там представляет собой сканер Oberon-2 Lex и парсер Yacc Стивена Дж. Бевана из Манчестерского университета, Великобритания, на основе документа, приведенного в справочнике Мессенбека и Вирта. Это версия 1.4.

Существует выпуск под названием Native Oberon, который включает операционную систему и может напрямую загружаться на аппаратном обеспечении класса ПК.

A .NET реализация Oberon с добавлением некоторых незначительных расширений, связанных с.NET, также была разработана в ETHZ.

Programmer's Open Workbench (POW!) - очень простая интегрированная среда разработки, которая поставляется с редактором, компоновщиком и компилятором Oberon-2. Это компилируется в исполняемые файлы Windows. Предоставляется полный исходный код - компилятор написан на Оберон-2.

Компилятор Java to Oberon (JOB) был написан в Вологодском университете в России. Он создает объектный код в виде файлов классов Java (байт-код ). Предоставляются некоторые специфические для JOB классы, совместимые с Java, но использующие иерархию компонентов, более похожую на Oberon.

Оптимизирующий компилятор Оберон-2 компилируется на C, используя набор инструментов gcc для генерации программ.

Oberon Script - это компилятор, который полностью переводит язык Oberon в JavaScript. Собственно компилятор написан на JavaScript и поэтому может быть вызван с веб-страниц для обработки разделов HTML-скрипта, написанных на Oberon.

XDS Modula2 / Oberon2 - система разработки компании Excelsior LLC, Новосибирск, Россия. Он содержит оптимизирующий компилятор для Intel Pentium или переводчик «via-C» для кроссплатформенной разработки. Доступно для Windows и Linux. Компилятор написан на Оберон-2 и компилируется сам.

Oberon Revival - это проект по внедрению Oberon 2 и Component Pascal (BlackBox Component Builder ) в Linux и Win32. Порт черного ящика для Linux раньше был недоступен, и изначально он работал только в Microsoft Windows.

- это операционная система реального времени для PowerPC, написанная на Oberon-2.

См. Также

Ссылки

Эволюция Oberon и Oberon -2

Подробные статьи

Книги

Внешние ссылки

Последняя правка сделана 2021-06-01 07:16:41
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте