Языки программирования Оберон и Оберон-2

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

оператором выхода EXIT.

 

D. Модульное программирование

 

1. Исключено понятие программы (Паскаль), как и деление на программные и библиотечные модули (Modula-2). Есть единое понятие модуля единицы компиляции и исполнения (загрузки). Он может экспортировать сущности: константы, типы, поля типов, переменные, процедуры. Вложенные (локальные) модули запрещены. Экспортируемые процедуры без параметров называются командами и определяют точки вызова модуля (программы).

2. Для экспорта используется значок * (звездочка) при определении сущности сразу после ее имени. Интерфейсный (описательный) модуль строится автоматически компилятором.

3. Импортируются только модули (IMPORT). Допустимо введение псевдонима модуля. Импортируемые идентификаторы в тексте обязательно квалифицируются именем соответствующего модуля.

 

E. Объектно-ориентированное программирование

 

1. Комбинированный тип (RECORD) может расширяться путем добавления полей записи (в том числе и процедурных типов). Это определяет механизм проекции u1090 типов, аналогичный наследованию в традиционном ООП.

2. Для работы с расширяемыми типами введена операция принадлежности типу (IS), а также оператор WITH (привратник типа).

3. Язык предусматривает механизм автоматической сборки мусора.

 

F. Системное программирование

 

1. Введен псевдомодуль SYSTEM, который является интерфейсом между языком и низкоуровневыми средствами. Импортирование SYSTEM сигнализирует о привязке к конкретной операционной платформе.

2. Введены процедуры адресной арифметики (ADR, BIT, LSH, ROT, CC), преобразования типа (VAL), работы с памятью (GET, PUT, MOVE) и резервирования области памяти (NEW).

3. Введен тип BYTE. Формальный параметр вида ARRAY OF BYTE, передаваемый по ссылке, совместим с любым типом.

5 Различия между языками Oberon и Oberon-2

 

Язык Oberon-2 является чистым расширением языка Oberon [Wir88]. В этом работе представлены сделанные расширения языка и в ней предпринята попытка осветить причины этих изменений. Таким образом, мы надеемся упростить читателю задачу классификации языка Oberon-2. За более детальной информацией о языке читателю нужно обратиться к описанию непосредственно языка.

Одной из важнейших целей языка Oberon-2 было стремление упростить объектно-ориентировванное программирование без нарушения концептуальной простоты языка Oberon. После трех лет использования Oberonа и его экспериментального диалекта языка Object Oberon [MeT89] мы воплотили наш опыт в единую уточненную версию Oberonа.

Новыми особенностями языка Oberon-2 служат типизированные процедуры (type-bound procedures), экспорт переменных и полей записи только на чтение (read-only export), открытые массивы в роли ссылочных базовых типов, а также оператор WITH с вариантами. Помимо этого в язык был возвращен оператор FOR, который первоначально при переходе от Modula-2 к Oberon был изъят из языка.

Язык Oberon-2 является плодом многочисленных дискуссий, которые велись среди всех сотрудников Института компьютерных систем в ETH (Institute for Computer System at ETH). Особенно плодотворные идеи были высказаны Юргом Гуткнехтом (Juerg Gutknecht) и Йозефом Темплом (Josef Templ).

 

5.1 Типизированные процедуры

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

TYPE

Figure = POINTER TO FigureDesc;

FigureDesc = RECORD

x,y,w,h:INTEGER
END;

PROCEDURE(f:Figure)Draw;

BEGIN...

ENDDraw;

PROCEDURE (f: Figure) Move (dx,dy: INTEGER); BEGIN ... END Move;

 

Draw и Move связаны с типом Figure, из чего следует, что обе они могут быть применимы к объектам типа Figure. Эти процедуры рассматриваются как локальные по отношению к FigureDesc и к ним можно обращаться как к обычным полям записи, например:

f.Move(10,10), если f это переменная типа Figure.

Любая процедура, связанная с типом T, неявно также связана и со всеми расширениями типа T. Она может быть переопределена (перегружена) процедурой с тем же самым именем и точно таким же списком формальных параметров, как и та, что явным образом связана с расширением T. Взгляните на пример:

TYPE

Circle = POINTER TO CircleDesc;

CircleDesc = RECORD (FigureDesc)

radius: INTEGER

END;

PROCEDURE (c: Circle) Move (dx,dy: INTEGER); BEGIN ... END Move;

Тип Circle является расширением типа Figure. Процедура Move явным образом связана с Circle и переопределяет процедуру Move, которая была унаследована от Figure. Пусть f это переменная типа Figure, а c переменная типа Circle, тогда присваивание f := c меняет у переменной f ее динамический тип (ее тип) с Figure на Circle. В вызове

f.Move(10,10)

переменная f выполняет две функции: во-первых, она передается в качестве параметра-получателя процедуре Move, а во-вторых, ее динамический тип определяет то, какой вариант Move в действительности вызывается. Так как после присваивания f := c динамический тип переменной f уже Circle, то вызывается процедура Move, которая связана с типом Circle, а не та, что связана с типом Figure. Этот механизм называется динамическим связыванием (dynamic binding), поскольку динамический тип получателя используется для связывания имени процедуры с реальной процедурой.

Внутри переопределяющей (redefining) процедуры переопределяемая (redefined) процедура может вызываться с использованием значка ^, например: f.Move^(dx,dy).

Аргументация. Мы отказались от введения концепции класса, а вместо этого заменили его на хо