Оберон Мертв, Да Здравствует Оберон! Часть 1. Некоторым Людям Нравится Быть Более Активными

Языкам программирования семейства Оберон не суждено было пробиться в мейнстрим, хотя они и оставили заметный след в ИТ-индустрии.

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

Этой обзорной статьей я открываю серию статей, посвященных языку Активный Оберон и операционная система A2, написанная на этом языке.



Итак, встречайте – Активный Оберон

Первая публикация об Active Oberon появилась в 1997 году, но видно, что язык и его реализация появились несколько раньше.

За прошедшие годы в язык было внесено множество изменений, была переработана среда выполнения, написана операционная система А2. Особенностью языка, отличающей его от других языков программирования, является концепция активных объектов — объектов, инкапсулирующих поток выполнения.

Active Oberon расширяет язык Oberon, вводя тип объекта Object, концепцию Activity, связанную с объектом (потоком), а также механизмы синхронизации и защиты параллелизма.

Реализация подобных механизмов на уровне языка упрощает разработку и реализацию многопоточных приложений и снижает количество ошибок, связанных с проблемами безопасности и синхронизации.

В разделе импорта плагины могут иметь псевдонимы, разные модули могут иметь один и тот же псевдоним, образуя своеобразное пространство имен из нескольких модулей.

В таких модулях имена экспортируемых сущностей не должны пересекаться.

Например:

  
  
   

IMPORT Example := Example1, Example := Example2;

Active Oberon реализует улучшенные массивы (математические и тензорные), структурные массивы (объекты, совместимые с улучшенными массивами), сложные типы, операции для объектов, улучшенные массивы и сложные типы, делегаты, совместимые как с процедурами модуля, так и с методами объекта.

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

Синтаксис языка практически не меняется во время разработки; вместо этого вводятся семантические модификаторы, изменяющие семантику синтаксических структур, присутствующих в языке.

Список модификаторов заключен в фигурные скобки {}.

Таким образом, для описания делегата используется модификатор процедуры DELEGATE:

Example1 : PROCEDURE{DELEGATE, REALTIME} ( VAR parameter : LONGINT ) : BOOLEAN;

В примере описана процедурная переменная Пример1, которая указывает на делегат — процедуру или метод реального времени, который принимает длинную целочисленную переменную по ссылке и возвращает логическое значение.

Методы описываются внутри объекта.

Все методы в Active Oberon виртуальные.

Методы, которым предшествует &, являются конструкторами и вызываются автоматически при создании объекта.

Компилятор выбирает необходимый конструктор на основе сигнатуры вызова встроенной процедуры NEW, предназначенной для создания сущностей ссылочного типа.

Объекты и методы также могут иметь модификаторы ABSTRACT и FINAL с четкой семантикой.

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



Активные объекты и модель многопоточности
Объект может иметь тело — последний блок операторов, выполняемый после инициализации объекта.

Если тело объекта отмечено модификатором ACTIVE (возможно, указывающим на приоритет), то такой объект называется активным.

Как уже упоминалось, активность (поток) инкапсулируется в объект и создается в момент создания экземпляра активного объекта.

Активность существует, пока выполняется тело активного объекта.

Активный объект продолжает существовать до тех пор, пока существует его активность, даже если на него нет ссылок, после чего он становится пассивным и от него можно избавиться обычным способом.

Связь между активностями осуществляется через вызовы методов активных и неактивных объектов.

Защита от одновременного доступа к состояниям объектов осуществляется за счет поддержки на уровне языка эксклюзивных регионов - последовательности операторов, заключенных в операторные скобки BEGIN.END, отмеченных модификатором EXCLUSIVE - соответствующих концепции критических регионов Бринч-Хансена.

Если эксклюзивная область покрывает все тело объекта, она называется эксклюзивной и сочетает в себе концепцию критических областей Хансена с концепцией процедуры мониторинга Хоара.

В отличие от процедур монитора Хоара, методы объекта не обязательно должны быть исключительными и могут наблюдать несинхронизированные состояния объекта.

Модуль считается объектом с одним экземпляром.

Компилятор и среда выполнения гарантируют, что в эксклюзивной области одновременно может находиться не более одного действия.

Таким образом, модель защиты в Active Oberon представляет собой монитор, расположенный в экземпляре объекта (instance-based Monitor).

Основная идея монитора в том, что с ним связан инвариант — выражение, определяющее внутреннее непротиворечивое состояние и доказывающее корректность его поведения.

Инициализаторы объектов устанавливают инвариант, а эксклюзивные методы поддерживают его.

Активный Оберон использует для синхронизации оператор AWAIT, тогда как большинство реализаций монитора используют переменные условия Хоара на основе очередей Хансена.

Оператор AWAIT принимает в качестве аргумента логическое условие продолжения выполнения; если оно не выполнено, действие приостанавливается, а захваченная эксклюзивная область освобождается до тех пор, пока условие выражения не станет истинным.

Активность продолжит работать, когда снова сможет войти в ранее выпущенный эксклюзивный раздел.

Условия продолжения пересчитываются только тогда, когда какое-либо действие выходит из эксклюзивного раздела.

Пример описания активного объекта и использования эксклюзивной секции:

TYPE Timer* = OBJECT VAR timer: Objects.Timer; handler: Objects.EventHandler; timeout, running: BOOLEAN; PROCEDURE &Init*; BEGIN NEW(timer); timeout := FALSE; running := TRUE; END Init; PROCEDURE SetTimeout*(h: Objects.EventHandler; ms: LONGINT); BEGIN handler := h; Objects.SetTimeout(timer, HandleTimeout, ms) END SetTimeout; PROCEDURE CancelTimeout*; BEGIN Objects.CancelTimeout(timer); END CancelTimeout; PROCEDURE HandleTimeout; BEGIN {EXCLUSIVE} timeout := TRUE END HandleTimeout; PROCEDURE Finalize*; BEGIN {EXCLUSIVE} Objects.CancelTimeout(timer); running := FALSE END Finalize; BEGIN {ACTIVE} WHILE running DO LOOP BEGIN {EXCLUSIVE} AWAIT(timeout OR ~running); IF ~running THEN EXIT END; timeout := FALSE END; handler() END END END Timer;

Управление памятью.

Active Oberon использует автоматическое управление памятью с помощью сборщика мусора в реальном времени.

Это означает, что действия в реальном времени могут приостановить процесс сборки мусора.

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

Процедуры, методы и действия реального времени отмечены модификатором REALTIME. Не все реализации компилятора и среды выполнения поддерживают процессы реального времени.

Переменные, отмеченные модификатором UNTRACED, являются неотслеживаемыми указателями и не отслеживаются механизмами автоматического управления памятью.

Язык синтаксически поддерживает оператор DISPOSE, но может не иметь реализации.

На этом завершается обзорная статья языка Active Oberon; Рекомендую начать знакомство с классическим Обероном.



Ссылки:



Содержание сериала

Теги: #oberon #оберон-технологии #язык программирования #многопоточное программирование #oberon #Системное программирование #компиляторы #Параллельное программирование
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.