Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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 (операционная система)
  • Оберон (операционная система)
  • Оберон (язык программирования)

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

  1. ^ «Связанное чтение» . Доктора Добба .
  2. ^ Пфистер, Куно (2001). «Что нового в Component Pascal (изменения с Oberon-2 на CP)» (PDF) . Микросистемы Оберон . Архивировано из оригинального (PDF) 15 мая 2011 года . Проверено 10 января 2007 года .
  3. ^ Различия между Обероном и Обероном-2, Мессенбёком и Виртом (1993)
  4. ^ Коллингборн, Х. (февраль 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 и ее приложения