Эта статья поднимает множество проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалить эти сообщения-шаблоны ) ( Узнайте, как и когда удалить этот шаблон сообщения )
|
Парадигмы | Императивный , структурированный , модульный , объектно-ориентированный |
---|---|
Семья | Вирт Оберон |
Разработано | Никлаус Вирт Ханспетер Мёссенбёк |
Разработчик | ETH Цюрих |
Впервые появился | 1991 |
Печатная дисциплина | Сильный , гибридный ( статический и динамический ) |
Объем | Лексический |
Платформа | Церера ( NS32032 ), IA-32 , x86-64 |
Операционные системы | Windows , Linux , Solaris , macOS |
Интернет сайт | www |
Под влиянием | |
Оберон , Модуль-2 , Объект Оберон | |
Под влиянием | |
Оберон-07 , Зоннон , Активный Оберон , Компонентный Паскаль , Го , Ним |
Oberon-2 - это расширение исходного языка программирования Oberon, которое добавляет ограниченные средства отражения и объектно-ориентированного программирования , открытые массивы в качестве базовых типов указателей, экспорт полей только для чтения и повторно вводит цикл из Modula-2 .FOR
Он был разработан в 1991 году в ETH Zurich по Никлаус Вирт и Ханспетера Mössenböck , который сейчас находится в Институте für (SSW системное программное обеспечение) из университета Линца , Австрия. Оберон-2 является расширенным набором Оберона, полностью с ним совместим и представляет собой переработанный объект Оберон .
Оберон-2 унаследовал ограниченное отражение и одиночное наследование («расширение типа») без интерфейсов или миксинов от Оберона, но добавил эффективные виртуальные методы («процедуры, связанные с типом»). Вызов методов разрешался во время выполнения с использованием таблиц виртуальных методов в стиле C ++ .
По сравнению с полностью объектно-ориентированными языками, такими как Smalltalk , в Oberon-2 основные типы данных и классы не являются объектами , многие операции не являются методами, отсутствует передача сообщений (это можно отчасти эмулировать путем отражения и расширения сообщений, как показано в ETH Oberon), и полиморфизм ограничивается подклассы общего класса (не утиной типизации , как в Python , [1] , и это не представляется возможным определить интерфейсы , как в Java ). Оберон-2 не поддерживает инкапсуляцию на уровне объекта или класса, но для этой цели можно использовать модули.
Отражение в Oberon-2 не использует метаобъекты , а просто читает из дескрипторов типов, скомпилированных в исполняемые двоичные файлы и представленных в модулях, которые определяют типы и / или процедуры. Если формат этих структур представлен на уровне языка (как, например, в случае с ETH Oberon), отражение может быть реализовано на уровне библиотеки . Таким образом, его можно было реализовать почти полностью на уровне библиотеки без изменения языкового кода. Действительно, ETH Oberon широко использует возможности рефлексии на уровне языка и библиотеки.
Oberon-2 обеспечивает встроенную поддержку сборки мусора во время выполнения, аналогичную Java, и выполняет проверки границ, индекса массива и т. Д., Что устраняет потенциальные проблемы перезаписи границ стека и массива и проблемы ручного управления памятью, присущие C и C ++. Раздельная компиляция с использованием файлов символов и пространств имен через модульную архитектуру обеспечивает быструю перестройку, поскольку необходимо перекомпилировать только модули с измененными интерфейсами.
Компонентный язык Pascal [2] является усовершенствованием (расширенным набором) Oberon-2.
Пример кода [ править ]
Следующий код Оберона-2 будет реализовывать очень минимальный класс списка:
Списки МОДУЛЕЙ ; (*** объявить глобальные константы, типы и переменные ***) TYPE Список * = POINTER TO ListNode ; ListNode = значение ЗАПИСИ : целое число ; следующий : Список ; КОНЕЦ ; (*** объявить процедуры ***) ПРОЦЕДУРА ( l : Список ) Добавить * ( v : Целое число ); НАЧАТЬ ЕСЛИ l = NIL ТО НОВЫЙ ( l ); (* создать экземпляр записи *) l . значение : = v ELSE l . следующий . Add ( v ) (* рекурсивный вызов .add (n) *) END END Add ; ПРОЦЕДУРА ( l : Список ) Получить * () : Целое число ; VAR v : целое число ; BEGIN IF l = NIL THEN RETURN 0 (* .get () всегда должен возвращать INTEGER *) ELSE v : = l . значение ; (* эта строка выйдет из строя, если l равно NIL *) l : = l . следующий ; RETURN v END END Получить ;КОНЕЦ списков .
Оберон-2 расширения Оберона [3] [ править ]
Привязанные к типу процедуры [ править ]
Процедуры могут быть привязаны к типу записи (или указателя). Они эквивалентны методам экземпляра в объектно-ориентированной терминологии.
Экспорт только для чтения [ править ]
Использование экспортируемых переменных и полей записи может быть ограничено доступом только для чтения. Это отображается с пометкой видимости «-».
Открытые массивы [ править ]
Открытые массивы, которые раньше можно было объявлять только как формальные типы параметров, теперь могут быть объявлены как базовые типы указателей.
Заявление FOR [ править ]
FOR
Заявление Паскаль и Modula-2 не был реализован в Oberon. Он повторно введен в Оберон-2.
Проверка типа во время выполнения [ править ]
Оберон-2 предоставляет несколько механизмов проверки динамического типа объекта. Например, если объект Bird может быть создан как для Duck, так и для Cuckoo, Oberon-2 позволяет программисту реагировать на фактический тип объекта во время выполнения.
Первый, наиболее традиционный подход - полагаться на систему привязки типов . Второй подход заключается в использовании WITH
оператора , который позволяет напрямую проверять динамический подтип переменной. В обоих случаях, как только подтип был идентифицирован, программист может использовать любые связанные с типом процедуры или переменные, соответствующие подтипу. Примеры этих подходов показаны ниже.
Обратите внимание, что форма WITH
оператора, используемая в Oberon-2, не связана с оператором WITH Pascal и Modula-2. Этот метод сокращения доступа к полям записи не реализован ни в Обероне, ни в Обероне-2.
Привязка типов [ править ]
МОДУЛЬ Птицы ; ТИП Bird * = RECORD звук * : ARRAY 10 OF Char ; КОНЕЦ ; КОНЕЦ Птицы . МОДУЛЬ Утки ; ИМПОРТ Птицы ; ТИП Утка * = ЗАПИСЬ ( Птицы . Птица ) КОНЕЦ ; ПРОЦЕДУРА SetSound * ( VAR bird : Duck ); НАЧАТЬ птицу . звук : = "Кряк!" END SetSound ; КОНЕЦ Утки . МОДУЛЬ Кукушки ; ИМПОРТ Птицы ; ТИП Кукушка * = ЗАПИСЬ ( Птицы . Птица ) КОНЕЦ ; ПРОЦЕДУРА SetSound * ( VAR bird : Cuckoo ); НАЧАТЬ птицу . звук : = "Кукушка!" END SetSound ; КОНЕЦ кукушки .
WITH
заявление [ править ]
МОДУЛЬ Test ; ИМПОРТ Out , птицы , кукушки , Утки ; ТИП SomeBird * = ЗАПИСЬ ( Птицы . Птица ) КОНЕЦ ; VAR sb : SomeBird ; c : Кукушки . Кукушка ; d : Утки . Утка ; ПРОЦЕДУРА SetSound * ( VAR bird : Birds . Bird ); НАЧАТЬ С птицей : кукушки . Кукушка ДЕЙСТВИТЕЛЬНО птица . звук : = "Кукушка!" | птица : Утки . Утка ДЕЙСТВИТЕЛЬНО птица . звук : = "Кряк!" ИНАЧЕ птица . sound : = "Твитнуть!" КОНЕЦ КОНЕЦ SetSound ; ПРОЦЕДУРА MakeSound * ( VAR b : Birds . Bird ); НАЧАТЬ Out . Ln ; Out . Струна ( б . Звук ); Out . Ln END MakeSound ; НАЧАТЬ SetSound ( гр ); SetSound ( d ); SetSound ( сб ); MakeSound ( c ); MakeSound ( d ); MakeSound ( sb ) КОНЕЦ теста .
POINTER
[ редактировать ]
МОДУЛЬ PointerBirds ; ИМПОРТ Out ; ТИП BirdRec * = ЗАПИСЬ звук * : ARRAY 10 OF Char ; КОНЕЦ ; DuckRec * = ЗАПИСЬ ( BirdRec ) КОНЕЦ ; CuckooRec * = ЗАПИСЬ ( BirdRec ) КОНЕЦ ; Птица = POINTER TO BirdRec ; Кукушка = POINTER TO CuckooRec ; Утка = POINTER TO DuckRec ; VAR pb : Bird ; ПК : Кукушка ; pd : Утка ; ПРОЦЕДУРА SetDuckSound * ( птица : Утка ); НАЧАТЬ птицу . звук : = "Кряк!" КОНЕЦ SetDuckSound ; ПРОЦЕДУРА SetCuckooSound * ( птица : кукушка ); НАЧАТЬ птицу . звук : = "Кукушка!" КОНЕЦ SetCuckooSound ; ПРОЦЕДУРА SetSound * ( птица : Bird ); НАЧАТЬ С птицей : Кукушка DO SetCuckooSound ( птицы ) | птица : Утка DO SetDuckSound ( птица ) ELSE bird . sound : = "Твитнуть!" КОНЕЦ КОНЕЦ SetSound ; НАЧАТЬ НОВОЕ ( шт ); НОВЫЙ ( pd ); SetCuckooSound ( ПК ); SetDuckSound ( pd ); Out . Ln ; Out . Строка ( pc ^ . Sound ); Out . Ln ; Out . Ln ; Out . Строка ( pd ^ . Sound ); Out . Ln ; SetSound ( шт ); SetSound ( pd ); Out . Ln ; Out . Строка ( pc ^ . Sound ); Out . Ln ; Out . Ln ; Out . Строка ( pd ^ . Sound ); Out . Ln ; (* -------------------------------------- *) (* Передать динамический тип в процедуру * ) pb : = pd ; SetDuckSound ( рь ( Duck )); Out . Ln ; Out . Строка ( pb ^ . Sound ); Out . Ln ; pb : = pc ; SetCuckooSound ( pb ( Кукушка )); Out . Ln ; Out . Строка ( pb ^ . Sound ); Out . Ln ; (* -------------------------------------- *) SetSound ( пб ); Out . Ln ; Out . Строка ( pb ^ . Sound ); Out . Ln ; pb : = pd ; SetSound ( пб ); Out . Ln ; Out . Строка ( pb ^ . Sound ); Out . Ln ; (* -------------------------------------- *) NEW ( pb ); SetSound ( пб ); Out . Ln ; Out . Строка ( pb ^ . Sound ); Out . Ln END PointerBirds .
IS
оператор [ редактировать ]
Третий подход возможен с использованием IS
оператора . Это оператор отношения с тем же приоритетом, что и equals ( =
), больше ( >
) и т. Д., Но который проверяет динамический тип. Однако, в отличие от двух других подходов, он не позволяет программисту получить доступ к обнаруженному подтипу.
Синтаксис [ править ]
Развитие семейства языков ALGOL → Pascal → Modula-2 → Oberon → Component Pascal отмечено снижением сложности синтаксиса языка . Весь язык Оберон-2 описан ( Mössenböck & Wirth, март 1995 ) с использованием только 33 грамматических произведений в расширенной форме Бэкуса-Наура , как показано ниже.
Module = MODULE идентификатор ";" [ ImportList ] DeclSeq [ BEGIN StatementSeq ] END идентификатор "." . ImportList = ИМПОРТ [ идентификатор ": =" ] идентификатор { "," [ идентификатор ": =" ] идентификатор } ";" . DeclSeq = { ФИКСИР { ConstDecl ";" } | TYPE { TypeDecl ";"} | VAR {VarDecl ";" }} { ProcDecl ";" | ForwardDecl ";" }. ConstDecl = IdentDef "=" ConstExpr . TypeDecl = IdentDef "=" Тип . VarDecl = IdentList ":" Тип . ProcDecl = PROCEDURE [ Получатель ] IdentDef [ FormalPars ] ";" DeclSeq [ BEGIN StatementSeq ] КОНЕЦ идент .Вперед = ПРОЦЕДУРА "^" [ Получатель ] IdentDef [ FormalPars ]. FormalPars = "(" [ FPSection { ";" FPSection }] ")" [ ":" Qualident ]. FPSection = [ VAR ] identify { "," 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 identity ": =" Expr TO Expr [ 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 | Установить | "(" Выражение")" | Фактор "~" . Set = "{" [ Элемент { "," Элемент }] "}" . Элемент = Выражение [ ".." Выражение ]. Отношение = "=" | "#" | "<" | "<=" | ">" | "> =" | В | ЕСТЬ . AddOp = "+" | "-"| ИЛИ . MulOp = "*" | "/" | DIV | MOD | "&" . Обозначение = Qualident { "." идент | "[" ExprList "]" | "^" | "(" Qualident ")" }. ExprList = Expr { "," Expr }. IdentList = IdentDef { "," IdentDef }. Qualident = [ идент ""] идент . IdentDef = идент [ "*" | «-» ].
Реализации [ править ]
Компиляторы Oberon-2, поддерживаемые ETH, включают версии для Windows , Linux , Solaris , macOS .
В Oxford Оберон-2 компилятор компилирует в машинный код и может использовать JIT на Windows, Linux и Mac OS X. Он создан / поддерживается Mike Спайви и использует Кейко виртуальную машину .
Существует сканер Oberon-2 Lex и синтаксический анализатор Yacc, созданный Стивеном Дж. Беваном из Манчестерского университета, Великобритания, основанный на том, что упоминается в справочнике Мессенбека и Вирта. Это версия 1.4.
Существует выпуск под названием Native Oberon, который включает в себя операционную систему и может напрямую загружаться на оборудовании класса ПК.
.NET реализация Оберона с добавлением некоторых незначительных расширений .NET связанных также была разработана на ETHZ.
Programmer's Open Workbench (POW!) [4] - это очень простая интегрированная среда разработки, которая поставляется с редактором, компоновщиком и компилятором Oberon-2. Это компилируется в исполняемые файлы Windows . Предоставляется полный исходный код ; компилятор написан на Обероне-2.
Java для Oberon Compiler (JOB) была написана в Университете Вологды в России. Он создает объектный код в виде файлов классов Java ( байт-код ). Предоставляются некоторые специфические для JOB классы, совместимые с Java, но использующие иерархию компонентов, более похожую на Oberon.
Оптимизация Оберон-2 компилятор компилирует С, используя GNU Compiler Collection (GCC) для генерации набора инструментов программы.
Oberon Script - это компилятор, который полностью переводит язык Oberon в JavaScript . Компилятор написан на JavaScript, поэтому его можно вызывать с веб-страниц для обработки разделов сценария HTML, написанных на Oberon.
XDS Modula2 / Oberon2 - система разработки ООО «Эксельсиор», Новосибирск, Россия. Он содержит оптимизирующий компилятор для Intel Pentium или транслятор «via-C» для кроссплатформенной разработки программного обеспечения. Доступно для Windows и Linux. Компилятор написан на Обероне-2 и компилируется сам.
Oberon Revival - это проект по внедрению Oberon 2 и Component Pascal ( BlackBox Component Builder ) в Linux и Win32. Порт BlackBox для Linux раньше был недоступен, и изначально он работал только на Microsoft Windows.
XOberon - это операционная система реального времени для PowerPC , написанная на Oberon-2.
См. Также [ править ]
- A2 (операционная система)
- Оберон (операционная система)
- Оберон (язык программирования)
Ссылки [ править ]
- ^ «Связанное чтение» . Доктора Добба .
- ^ Пфистер, Куно (2001). «Что нового в Component Pascal (изменения с Oberon-2 на CP)» (PDF) . Микросистемы Оберон . Архивировано из оригинального (PDF) 15 мая 2011 года . Проверено 10 января 2007 года .
- ^ Различия между Обероном и Обероном-2, Мессенбёком и Виртом (1993)
- ^ Коллингборн, Х. (февраль 2000 г.). «Что изобретатель Паскаля сделал потом». ПК Плюс . № 160.
Эволюция Оберона и Оберона-2 [ править ]
- « Древо генеалогии языка Оберон » поддерживается в ETHZ
- "Вторая международная конференция" Модула-2 ", сентябрь 1991 г.
Подробные статьи [ править ]
- От Модулы до Оберона Вирта (1990)
- Программирование в Oberon - производное от программирования в Modula-2 Wirth (1982)
- Язык программирования Оберон Вирт (1990)
- Оберон 2 Отчет
- Язык программирования Oberon-2 H. Mössenböck, N. Wirth, Institut für Computersysteme, ETH Zurich , январь 1992 г. и структурированное программирование (1991) 12 (4): 179-195.
Книги [ править ]
В Викиучебнике есть книга на тему: Оберон. |
- Различные ссылки, включая электронные онлайн-версии
- Объектно-ориентированное программирование в Оберон-2 Ханспетер Мёссенбёк (1994). (Доступно в Университете Иоганнеса Кеплера в формате PDF с дружественного разрешения Springer-Verlag)
- Паттерны проектирования в Oberon-2 и Component Pascal
- Проект Оберон. Дизайн операционной системы и компилятора Никлаус Вирт и Юрг Гуткнехт (2005)
- Проект Оберон. Дизайн операционной системы и компилятора Никлаус Вирт и Юрг Гуткнехт (2013)
Внешние ссылки [ править ]
- Официальный сайт ETH Zürich
- Справочная страница Oberon в ETH Zürich
- Оберон в SSW, Линц
- Учебник Pow (на румынском языке), Дэн Попа
- ftp://ftp.inf.ethz.ch/pub/Oberon/
- Модель отражения Оберон-2 и ее приложения