Active Oberon — типобезпечна модульна об'єктно-орієнтована багатопотокова мова програмування загального призначення, яку розробила в 1996—1997 роках група професора [de] у Швейцарській вищій технічній школі Цюриха (ETHZ) з метою введення в мову Оберон властивостей для вираження паралелізму за допомогою активних об'єктів.
Active Oberon | |
---|---|
Дата появи | 1997 |
Особливості мови
Назва Active Oberon відбиває основну концепцію мови — концепцію активних об'єктів, виражену в реалізації багатопотоковості та механізмів синхронізації на рівні мови.
Active Oberon розширює мову Оберон, вводячи поняття об'єкт (Object) та активність (Activity), пов'язана з об'єктом. Такий зв'язок називають активним об'єктом (Active Object), що означає здатність примірника об'єкта мати активність — власний потік виконання.
Мова належить до модульних типобезпечних мов програмування зі сильною статичною типізацією, допускаючи у виразах неявне зведення скалярних типів без втрати даних (наприклад, використання цілого числа там, де передбачалося використання числа з рухомою комою).
Модулі забезпечують не тільки розділену компіляцію, інкапсуляцію, але й можливість реалізації динамічного завантаження/вивантаження скомпільованих (об'єктних) модулів, що використовується, наприклад, у операційній системі A2, написаній цією мовою. Певною мірою, аналогом модуля можна вважати динамічно приєднувану бібліотеку.
В Active Oberon, як і в інших спадкоємцях при зверненні до сутностей приєднаного (імпортованого) модуля потрібно обов'язково кваліфікувати приєднаний модуль. Наприклад, якщо модуль A приєднує модуль B і використовує змінну цього модуля, то звернення до змінної повинне мати форму B.v. Інакше кажучи, імпорт не дозволяє за замовчанням імпортувати з приєднаного модуля всі сутності, які він експортує.
Інкапсуляція побудована на концепції модуля — всі типи, оголошені в модулі, повністю прозорі один для о́дного, а для доступу зовнішніх клієнтів потрібні специфікатори доступу. Специфікатори доступу дозволяють експортувати сутності або з повним доступом (ідентифікатор позначається знаком «*» (зірочка)), або з доступом «тільки для читання» (ідентифікатор позначається знаком «-» (мінус)). Наприклад, конструкція:
VAR Example2 : PROCEDURE {REALTIME, C} ( VAR low, high: LONGINT ): BOOLEAN;
визначає тип запису (RECORD) Example1, експортований за межі модуля, що має три поля з типом «довге ціле», причому поле «x» оголошено зі специфікатором доступу «повний доступ», поле «y» — зі специфікатором «доступ тільки для читання» і поле z є прихованим полем, недоступним зовнішнім клієнтам.
Мова підтримує поліморфізм, перевантаження операцій (для структурних типів), , сумісні як із методами, так і з процедурами. Об'єктними типами є RECORD і посилальний тип OBJECT. Вони можуть мати методи та операції. У типу OBJECT можуть бути тіло та активність. Усі методи є віртуальними. Множинне успадкування відсутнє, замість нього використовують концепцію множинного успадкування інтерфейсів (DEFINITION у термінах мови).
Синтаксис та семантика
Синтаксис мови в процесі розвитку практично не змінюється — розробники воліють уточнювати семантику вже наявних синтаксичних конструкцій за допомогою введення семантичних модифікаторів, що дозволяє виключити значний обсяг змін при введенні нової функціональності, спростити компілятор, зробивши його код доступнішим для розуміння і модифікації, а також забезпечити легкість вивчення та використання мови. Модифікатори беруть у фігурні дужки {} після імені змінної, типу чи ключового слова. Наприклад, конструкція:
VAR Example2 : PROCEDURE {REALTIME, C} ( VAR low, high: LONGINT ): BOOLEAN;
оголошує процедурну змінну Example2, що вказує на процедуру реального часу, з домовленістю про виклик CCALL, яка приймає два параметри типу довге ціле і повертає значення логічного типу.
Опис об'єкта, в цілому, відповідає опису модуля, за винятком синтаксису заголовка та відсутності секції IMPORT. Методи повністю описуються всередині опису об'єкта, операції, за рідкісним винятком, можуть описуватися поза тілом об'єкта. Об'єкт може мати довільну кількість і не більше одного фіналізатора. Вбудована процедура NEW, що використовується для створення змінних посилального типу, викликає ініціалізатор, який компілятор вибирає за сигнатурою параметрів. Ініціалізатор позначають символом & перед назвою методу. Фіналізатор — метод без параметрів, перед іменем якого стоїть знак ~, — автоматично викликається для утилізації об'єкта.
Послідовність операторів, укладену в операторні дужки BEGIN END, називають блоком операторів. Блок операторів також може містити список модифікаторів та секцію гарантованого завершення (FINALLY).
Змінну, а також поле запису або об'єкта, можна ініціалізувати константним виразом при оголошенні:
TYPE Point = RECORD x := 0, y := 0 : LONGINT; END; VAR i := 0, j := 10, k := 100 : INTEGER; Point : Point; (* поля x, y запису ініціалізовано значенням 0 *)
Типи даних
Мова пропонує багатий набір вбудованих типів:
- Базові типи
- логічний: BOOLEAN;
- символьні: CHAR8, CHAR16, CHAR32 та псевдонім CHAR для типового символьного типу;
- (цілочисельні знакові): SIGNED8, SIGNED16, SIGNED32, SIGNED64 та псевдоніми SMALLINT, INTEGER, LONGINT, HUGEINT;
- (цілочисельні беззнакові): UNSIGNED8, UNSIGNED16, UNSIGNED32, UNSIGNED64;
- дійсні: REAL, LONGREAL;
- комплексні: COMPLEX, LONGCOMPLEX;
- машинозалежні: SIZE, ADDRESS;
- множини: SET, SET8, SET16, SET32, SET64;
- розширювані переліки: ENUM;
- структурні
- Спеціальні
- процедурні;
- [en]: процедурні змінні, сумісні як із процедурами, і з методами;
- типізовані вказівники на структурні типи;
- узагальнені вказівники: ANY, OBJECT, ARRAY;
- системні: SYSTEM.BYTE
Багатопотоковість
В Active Oberon реалізовано дві моделі багатопотоковості, засновані на роботах Брінча Гансена та Тоні Гоара:
- Витискальна багатопотоковість, з блокувальною синхронізацією;
- Кооперативна багатопоточність, з неблокувальною (lock-free) синхронізацією. Компілятор у певних місцях автоматично генерує код перемикання потоків. У цьому разі активності (потоки), фактично, є співпрограмами. Середовище виконання надає можливість ручного перемикання на необхідну активність.
Сирцевий код, написаний з використанням синтаксису блокувальних примітивів синхронізації мови Active Oberon, можна використовувати для обох моделей багатопотоковості — компілятор генеруватиме код, потрібний для конкретної моделі. За такого підходу немає потреби у переписуванні програмного забезпечення під різні моделі. Лише невеликі ділянки сирцевого коду вимагають адаптації (наприклад, обробка переривань), щоб придушити автоматичне генерування перемикань у цій ділянці машинного коду. Для цього блок операторів позначають модифікатором {UNCOOPERATIVE}.
Активні об'єкти
Потік інкапсульовано в об'єкті і, як його невід'ємна частина, він створюється в момент інстанціювання активного об'єкта. Для вказівки на активність об'єкта його тіло позначають модифікатором ACTIVE.
Після розміщення примірника об'єкта виконується ініціалізатор (якщо є), потім тіло об'єкта (якщо є). Якщо об'єкт позначено активним, створюється активність, у якій асинхронно виконується тіло об'єкта, в іншому разі виконання відбувається синхронно в потоці, в якому створено примірник.
Активність об'єкта завершується після виконання тіла об'єкта. Поки виконується тіло, об'єкт продовжує існувати, навіть якщо на нього немає посилань. Після цього об'єкт стає пасивним і може бути утилізований відповідно до звичайних правил.
Приклад опису та використання активного об'єкта:
MODULE Example3; TYPE ActiveObject = OBJECT VAR state : SET; PROCEDURE &New; BEGIN state := {}; END New; PROCEDURE &Init*( state : SET ); BEGIN SELF.state := state; END Init; PROCEDURE ~Finalize; BEGIN ... END Finalize; BEGIN {ACTIVE} ... END ActiveObject; VAR object : ActiveObject; BEGIN NEW( object ); object.Init( {0..7, 9, 12, 30..31} ); NEW( object, {} ); END Example3.
Міжпроцесова взаємодія
Виклики методів спільно використовуваних активних та неактивних об'єктів діють як комунікаційний механізм між активними об'єктами. Оскільки активні об'єкти існують у багатопотоковому середовищі, надається механізм для координування паралельного доступу до їхнього стану. Взаємодія через обмін повідомленнями може здійснюватися з використанням спеціальних програмних каркасів.
Захист від одночасного виконання
Блок операторів, позначений модифікатором EXCLUSIVE, називають монопольною ділянкою (exclusive region). Монопольна ділянка в Active Oberon відповідає концепції критичної ділянки Гансена. Якщо монопольна ділянка охоплює все тіло методу, його називають монопольним методом (exclusive method) і він поєднує концепцію Гансена з процедурою монітора Гоара. На відміну від процедури монітора, метод об'єкта може бути монопольним — у такому разі він може спостерігати неузгоджені стани об'єкта. У монопольній ділянці може бути не більше однієї активності одночасно.
Таким чином, модель захисту в Active Oberon — монітор, розміщений у примірнику об'єкта (instance-based monitor). Модуль вважають об'єктним типом з єдиним примірником (singleton instance) і його процедури теж можуть бути монопольними, захищаючи модуль загалом.
Головна ідея монітора (і активного об'єкта) у тому, що з монітором пов'язується якийсь інваріант — вираз, що визначає несуперечливий внутрішній стан об'єкта і доводить правильність його поведінки. Ініціалізатори та монопольні методи є інструментами, які мова надає для підтримки інваріантів об'єкта та приховування його внутрішнього стану. Ініціалізатор об'єкта встановлює його інваріант, а монопольні методи його підтримують. Коли поняття монітора об'єднано з поняттям модуля, формується потужний механізм для структурування операційних систем.
Приклад використання монопольної секції:
(* Процедури Set і Reset взаємно виключені *) TYPE MyContainer = OBJECT VAR x, y: LONGINT; (* Інваріант: y = f(x) *) PROCEDURE Set(x: LONGINT); BEGIN {EXCLUSIVE} (* змінення x та y атомарно *) SELF.x := x; y := f(x) END Set; PROCEDURE Reset; BEGIN ... BEGIN {EXCLUSIVE} (* змінення x та y атомарно *) x := x0; y := y0; END; .... END Reset; END MyContainer;
Синхронізація
На відміну від більшості реалізацій моніторів, що використовують для синхронізації (умовні змінні Гоара) (на основі черг подій Брінча Гансена), синхронізацію активностей забезпечує оператор AWAIT, що приймає як аргумент логічний вираз — умову продовження виконання програми в тілі об'єкта. Щоб гарантувати правильність синхронізації, AWAIT має міститись у монопольній ділянці. У разі невиконання умови продовження AWAIT призупиняє (suspend) активність і, якщо міститься в монопольній ділянці, відпускає захоплену ділянку на час припинення, що дозволяє іншим активностям змінити стан об'єкта і зробити умову продовження істинною. Зупинена активність продовжить роботу лише в тому разі, якщо зможе повторно увійти до монопольної ділянки.
Приклад синхронізації всередині розділюваного буфера:
TYPE Synchronizer = OBJECT VAR awake: BOOLEAN PROCEDURE Wait; BEGIN {EXCLUSIVE} AWAIT(awake); awake := FALSE; END Wait; PROCEDURE WakeUp; BEGIN {EXCLUSIVE} awake := TRUE; END WakeUp; END Synchronizer;
Обробка помилок та виняткових ситуацій
В Active Oberon відсутні засоби структурної обробки виняткових ситуацій — їх обробляє централізоване середовище часу виконання.
Оператор ASSERT приймає як обов'язковий аргумент логічний вираз, у разі порушення якого відбувається переривання програми і, як і при виконанні оператора безумовної зупинки HALT, керування передається в централізований обробник винятків. Якщо умову оператора ASSERT можна обчислити на етапі компіляції, то, в разі невиконання умови, генерується помилка компіляції. Оператор ASSERT і HALT можуть мати необов'язковий параметр — специфікатор винятку, який можна проаналізувати в обробнику.
Після обробки винятку керування передається в найближчу за стеком викликів секцію гарантованого завершення FINALLY, якщо вона є. Потім, якщо тіло активного об'єкта позначено модифікатором SAFE, активність буде перезапущено, інакше її робота завершується.
Середовище часу виконання
Інформація про типи часу виконання
Тільки структурні типи (масиви, записи, об'єкти) мають інформацію про типи часу виконання (метаінформацію). Метаінформація зберігається у спеціальній структурі, званій дескриптором типу. Дескриптор типу містить дані про типи та назви змінних і полів, таблицю успадкування, таблицю віртуальних методів та таблиці реалізованих .
Керування пам'яттю
В Active Oberon застосовується автоматичне керування пам'яттю з використанням переривного (витискального) збирача сміття реального часу, заснованого на методі позначок (Mark and Sweep). Збирач сміття виконується в окремому потоці, і активності (потоки), з вищим пріоритетом, ніж пріоритет активності збирача сміття, можуть призупинити його виконання. При цьому дерево об'єктів заморожується. На даний момент тільки сутності реального часу можуть переривати активність збирача сміття, в них заборонено динамічне виділення пам'яті, за цим стежить компілятор.
Керування пам'яттю ґрунтується на використанні типізованих ділянок пам'яті. Така ділянка зберігає вказівник на дескриптор типу. Використовуючи інформацію про типи часу виконання, розміщену в дескрипторі типу, збирач сміття знаходить змінні і поля посилального типу і позначає блоки, на які вони вказують. Іншими словами, збирачеві сміття немає необхідності перевіряти кожне значення, схоже на вказівник, чи воно є коректним вказівником у купі — використовуючи інформацію, яку надає дескриптор типу, він точно знає, які елементи обробляти, що істотно збільшує швидкість і точність роботи і знижує навантаження на процес збирання сміття. Для прискорення виділення пам'яті вільні ділянки поміщаються в списки вільних блоків, які містять блоки пам'яті певних розмірів.
Змінні посилального типу, позначені модифікатором UNTRACED належать до [en]. Такі вказівники не відстежує збирач сміття і ділянки пам'яті, на які вони посилаються, можуть бути утилізовані в будь-який момент часу, в разі, якщо їх виділило середовище часу виконання та на них немає досяжних посилань, які враховує збирач сміття. Часто такі модифікатори використовують для роботи з ділянками пам'яті, виділеними поза середовищем часу виконання Active Oberon, або з небезпечними вказівниками.
Керування активністю об'єктів
Середовище часу виконання відповідає за розподіл процесорного часу, гарантує (разом з компілятором), що в монопольній ділянці міститься не більше однієї активності, забезпечує своєчасну перевірку умов оператора AWAIT і відновлення роботи призупинених активностей. Вирази умов продовження всередині об'єкта перераховуються в усіх точках виходу з монопольних ділянок. Це означає, що зміна стану об'єкта поза монопольною ділянкою не призводить до перерахунку умов. Коли кілька активностей змагаються за ту саму монопольну ділянку, то активності з виконаними умовами розглядаються раніше від тих, які тільки хочуть увійти в захищену ділянку.
Підключення та ініціалізація модулів
В Active Oberon відсутні засоби для прямого керування динамічним завантаженням та вивантаженням модулів. Мова пропонує лише секцію імпорту (IMPORT), у якій вказано список модулів, що підключаються, і секцію ініціалізації модуля. Середовище часу виконання має забезпечити підключення та ініціалізацію модулів до ініціалізації поточного модуля. Динамічне підключення модуля здійснюється через механізм динамічного зв'язування. Модуль не можна вивантажити доти, доки на нього є посилання зі списку підключення іншого завантаженого модуля. Таким чином, щоб унеможливити проблему циклічних посилань, модулі слід вивантажувати в порядку, зворотному до порядку завантаження.
Обробка помилок та виняткових ситуацій
Модуль Traps забезпечує централізовану обробку виняткових ситуацій. Параметри, які приймають оператори ASSERT і HALT, можуть використовуватися для класифікації виняткової ситуації.
Після обробки виняткової ситуації в модулі Traps середовище часу виконання здійснює пошук секцій гарантованого завершення FINALLY та передає на них керування для виконання завершальних операцій.
У випадку, якщо активність позначена модифікатором SAFE і в тілі об'єкта відсутня секція FINALLY, відбувається перезапуск активності, інакше виконання активності завершується.
Програмний інтерфейс середовища виконання надає можливість встановлення власного обробника виняткових ситуацій.
Приклади програм
Hello, World!
MODULE HelloWorld; IMPORT KernelLog; BEGIN KernelLog.String( "Hello, World!" ); END HelloWorld.
Розв'язок класичної задачі постачальника та споживача
MODULE BoundedBuffers; TYPE Item* = OBJECT; Buffer* = OBJECT VAR h, n: INTEGER; B: ARRAY * OF Item; PROCEDURE Get*(): Item; VAR x: Item; BEGIN {EXCLUSIVE} AWAIT(n # 0); (* буфер не порожній *) x := B[h]; h := (h+1) MOD LEN(B); DEC(n); RETURN x END Get; PROCEDURE Put*(x: Item); BEGIN {EXCLUSIVE} AWAIT(n # LEN(B)); (* буфер не повний *) B[(h+n) MOD LEN(B)] := x; INC(n) END Put; PROCEDURE &Init(max: INTEGER); BEGIN (* ініціалізатор *) NEW(B, max); h := 0; n := 0 END Init; END Buffer; END BoundedBuffers.
Див. також
Примітки
- J. Gutknecht. Do the Fish Really Need Remote Control? A Proposal for Self-Active Objects in Oberon., 1997.
- P.J. Muller. Active Object System. Design and Multiprocessor Implementation. — ETH Zurich, 2002., Diss. ETH № 14755.
- Florian Negele. Combining Lock-Free Programming with Cooperative Multitasking for a Portable Multiprocessor Runtime System, ETH Zurich, 2014, Diss. ETH №. 22298
- Florian Negele. A2 Concurrency Framework, ETH Zurich, June 3, 2009
- P. Brinch Hansen. Structured Multiprogramming. Communications of the ACM, 15(7), July 1972
- P. Brinch Hansen. Operating System Principles. Prentice-Hall, 1973.
- C.A.R. Hoare. Monitors: An Operating System Structuring Concept. Communications of the ACM, 17(10):549-557, October 1974.
- O. J. Dahl. Monitors Revisited. In A.W. Roscoe, editor, A Classical Mind — Essays in Honour of C.A.R. Hoare. Prentice-Hall,
1994. - J.L. Keedy. On Structuring Operating Systems With Monitors. ACM Operating Systems Review, 13(1), January 1979.
- N. Wirth. Modula: A Language for Modular Multiprogramming. Software — Practice and Experience, 7:3-35, 1977.
- N. Wirth. The Use of Modula. Software — Practice and Experience, 7:37-65, 1977.
- Ulrike Glavitsch. Real-time Garbage Collection in A2. Institute of Computer Systems, ETH Zurich
- P. Reali. Active Oberon Language Report. — ETH Zurich, 2004.
Посилання
- Повідомлення про мову Active Oberon (2019)(англ.)
- Спільнота Операційної Системи A2 та мови Active Oberon у Telegram
- Відео про спосіб програмування під ОС A2(англ.)
- «Active Oberon for NET: An Exercise in Object Model Mapping.» Jurg Gutknecht(англ.)
- Архів (англ.)
- Архів (англ.)
- Архів Welcome to A2(англ.)
- Архів
- Архів (англ.)
- Архів (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Active Oberon tipobezpechna modulna ob yektno oriyentovana bagatopotokova mova programuvannya zagalnogo priznachennya yaku rozrobila v 1996 1997 rokah grupa profesora de u Shvejcarskij vishij tehnichnij shkoli Cyuriha ETHZ z metoyu vvedennya v movu Oberon vlastivostej dlya virazhennya paralelizmu za dopomogoyu aktivnih ob yektiv Active OberonData poyavi1997Osoblivosti moviNazva Active Oberon vidbivaye osnovnu koncepciyu movi koncepciyu aktivnih ob yektiv virazhenu v realizaciyi bagatopotokovosti ta mehanizmiv sinhronizaciyi na rivni movi Active Oberon rozshiryuye movu Oberon vvodyachi ponyattya ob yekt Object ta aktivnist Activity pov yazana z ob yektom Takij zv yazok nazivayut aktivnim ob yektom Active Object sho oznachaye zdatnist primirnika ob yekta mati aktivnist vlasnij potik vikonannya Mova nalezhit do modulnih tipobezpechnih mov programuvannya zi silnoyu statichnoyu tipizaciyeyu dopuskayuchi u virazah neyavne zvedennya skalyarnih tipiv bez vtrati danih napriklad vikoristannya cilogo chisla tam de peredbachalosya vikoristannya chisla z ruhomoyu komoyu Moduli zabezpechuyut ne tilki rozdilenu kompilyaciyu inkapsulyaciyu ale j mozhlivist realizaciyi dinamichnogo zavantazhennya vivantazhennya skompilovanih ob yektnih moduliv sho vikoristovuyetsya napriklad u operacijnij sistemi A2 napisanij ciyeyu movoyu Pevnoyu miroyu analogom modulya mozhna vvazhati dinamichno priyednuvanu biblioteku V Active Oberon yak i v inshih spadkoyemcyah pri zvernenni do sutnostej priyednanogo importovanogo modulya potribno obov yazkovo kvalifikuvati priyednanij modul Napriklad yaksho modul A priyednuye modul B i vikoristovuye zminnu cogo modulya to zvernennya do zminnoyi povinne mati formu B v Inakshe kazhuchi import ne dozvolyaye za zamovchannyam importuvati z priyednanogo modulya vsi sutnosti yaki vin eksportuye Inkapsulyaciya pobudovana na koncepciyi modulya vsi tipi ogolosheni v moduli povnistyu prozori odin dlya o dnogo a dlya dostupu zovnishnih kliyentiv potribni specifikatori dostupu Specifikatori dostupu dozvolyayut eksportuvati sutnosti abo z povnim dostupom identifikator poznachayetsya znakom zirochka abo z dostupom tilki dlya chitannya identifikator poznachayetsya znakom minus Napriklad konstrukciya VAR Example2 PROCEDURE REALTIME C VAR low high LONGINT BOOLEAN viznachaye tip zapisu RECORD Example1 eksportovanij za mezhi modulya sho maye tri polya z tipom dovge cile prichomu pole x ogolosheno zi specifikatorom dostupu povnij dostup pole y zi specifikatorom dostup tilki dlya chitannya i pole z ye prihovanim polem nedostupnim zovnishnim kliyentam Mova pidtrimuye polimorfizm perevantazhennya operacij dlya strukturnih tipiv sumisni yak iz metodami tak i z procedurami Ob yektnimi tipami ye RECORD i posilalnij tip OBJECT Voni mozhut mati metodi ta operaciyi U tipu OBJECT mozhut buti tilo ta aktivnist Usi metodi ye virtualnimi Mnozhinne uspadkuvannya vidsutnye zamist nogo vikoristovuyut koncepciyu mnozhinnogo uspadkuvannya interfejsiv DEFINITION u terminah movi Sintaksis ta semantika Sintaksis movi v procesi rozvitku praktichno ne zminyuyetsya rozrobniki voliyut utochnyuvati semantiku vzhe nayavnih sintaksichnih konstrukcij za dopomogoyu vvedennya semantichnih modifikatoriv sho dozvolyaye viklyuchiti znachnij obsyag zmin pri vvedenni novoyi funkcionalnosti sprostiti kompilyator zrobivshi jogo kod dostupnishim dlya rozuminnya i modifikaciyi a takozh zabezpechiti legkist vivchennya ta vikoristannya movi Modifikatori berut u figurni duzhki pislya imeni zminnoyi tipu chi klyuchovogo slova Napriklad konstrukciya VAR Example2 PROCEDURE REALTIME C VAR low high LONGINT BOOLEAN ogoloshuye procedurnu zminnu Example2 sho vkazuye na proceduru realnogo chasu z domovlenistyu pro viklik CCALL yaka prijmaye dva parametri tipu dovge cile i povertaye znachennya logichnogo tipu Opis ob yekta v cilomu vidpovidaye opisu modulya za vinyatkom sintaksisu zagolovka ta vidsutnosti sekciyi IMPORT Metodi povnistyu opisuyutsya vseredini opisu ob yekta operaciyi za ridkisnim vinyatkom mozhut opisuvatisya poza tilom ob yekta Ob yekt mozhe mati dovilnu kilkist i ne bilshe odnogo finalizatora Vbudovana procedura NEW sho vikoristovuyetsya dlya stvorennya zminnih posilalnogo tipu viklikaye inicializator yakij kompilyator vibiraye za signaturoyu parametriv Inicializator poznachayut simvolom amp pered nazvoyu metodu Finalizator metod bez parametriv pered imenem yakogo stoyit znak avtomatichno viklikayetsya dlya utilizaciyi ob yekta Poslidovnist operatoriv ukladenu v operatorni duzhki BEGIN END nazivayut blokom operatoriv Blok operatoriv takozh mozhe mistiti spisok modifikatoriv ta sekciyu garantovanogo zavershennya FINALLY Zminnu a takozh pole zapisu abo ob yekta mozhna inicializuvati konstantnim virazom pri ogoloshenni TYPE Point RECORD x 0 y 0 LONGINT END VAR i 0 j 10 k 100 INTEGER Point Point polya x y zapisu inicializovano znachennyam 0 Tipi danih Mova proponuye bagatij nabir vbudovanih tipiv Bazovi tipi logichnij BOOLEAN simvolni CHAR8 CHAR16 CHAR32 ta psevdonim CHAR dlya tipovogo simvolnogo tipu cilochiselni znakovi SIGNED8 SIGNED16 SIGNED32 SIGNED64 ta psevdonimi SMALLINT INTEGER LONGINT HUGEINT cilochiselni bezznakovi UNSIGNED8 UNSIGNED16 UNSIGNED32 UNSIGNED64 dijsni REAL LONGREAL kompleksni COMPLEX LONGCOMPLEX mashinozalezhni SIZE ADDRESS mnozhini SET SET8 SET16 SET32 SET64 rozshiryuvani pereliki ENUM strukturni masivi ARRAY statichni dinamichni vidkriti matematichni rozshiryuvani strukturi RECORD ob yektni OBJECT Specialni procedurni en procedurni zminni sumisni yak iz procedurami i z metodami tipizovani vkazivniki na strukturni tipi uzagalneni vkazivniki ANY OBJECT ARRAY sistemni SYSTEM BYTE Bagatopotokovist V Active Oberon realizovano dvi modeli bagatopotokovosti zasnovani na robotah Brincha Gansena ta Toni Goara Vitiskalna bagatopotokovist z blokuvalnoyu sinhronizaciyeyu Kooperativna bagatopotochnist z neblokuvalnoyu lock free sinhronizaciyeyu Kompilyator u pevnih miscyah avtomatichno generuye kod peremikannya potokiv U comu razi aktivnosti potoki faktichno ye spivprogramami Seredovishe vikonannya nadaye mozhlivist ruchnogo peremikannya na neobhidnu aktivnist Sircevij kod napisanij z vikoristannyam sintaksisu blokuvalnih primitiviv sinhronizaciyi movi Active Oberon mozhna vikoristovuvati dlya oboh modelej bagatopotokovosti kompilyator generuvatime kod potribnij dlya konkretnoyi modeli Za takogo pidhodu nemaye potrebi u perepisuvanni programnogo zabezpechennya pid rizni modeli Lishe neveliki dilyanki sircevogo kodu vimagayut adaptaciyi napriklad obrobka pererivan shob pridushiti avtomatichne generuvannya peremikan u cij dilyanci mashinnogo kodu Dlya cogo blok operatoriv poznachayut modifikatorom UNCOOPERATIVE Aktivni ob yekti Potik inkapsulovano v ob yekti i yak jogo nevid yemna chastina vin stvoryuyetsya v moment instanciyuvannya aktivnogo ob yekta Dlya vkazivki na aktivnist ob yekta jogo tilo poznachayut modifikatorom ACTIVE Pislya rozmishennya primirnika ob yekta vikonuyetsya inicializator yaksho ye potim tilo ob yekta yaksho ye Yaksho ob yekt poznacheno aktivnim stvoryuyetsya aktivnist u yakij asinhronno vikonuyetsya tilo ob yekta v inshomu razi vikonannya vidbuvayetsya sinhronno v potoci v yakomu stvoreno primirnik Aktivnist ob yekta zavershuyetsya pislya vikonannya tila ob yekta Poki vikonuyetsya tilo ob yekt prodovzhuye isnuvati navit yaksho na nogo nemaye posilan Pislya cogo ob yekt staye pasivnim i mozhe buti utilizovanij vidpovidno do zvichajnih pravil Priklad opisu ta vikoristannya aktivnogo ob yekta MODULE Example3 TYPE ActiveObject OBJECT VAR state SET PROCEDURE amp New BEGIN state END New PROCEDURE amp Init state SET BEGIN SELF state state END Init PROCEDURE Finalize BEGIN END Finalize BEGIN ACTIVE END ActiveObject VAR object ActiveObject BEGIN NEW object object Init 0 7 9 12 30 31 NEW object END Example3 Mizhprocesova vzayemodiya Vikliki metodiv spilno vikoristovuvanih aktivnih ta neaktivnih ob yektiv diyut yak komunikacijnij mehanizm mizh aktivnimi ob yektami Oskilki aktivni ob yekti isnuyut u bagatopotokovomu seredovishi nadayetsya mehanizm dlya koordinuvannya paralelnogo dostupu do yihnogo stanu Vzayemodiya cherez obmin povidomlennyami mozhe zdijsnyuvatisya z vikoristannyam specialnih programnih karkasiv Zahist vid odnochasnogo vikonannya Blok operatoriv poznachenij modifikatorom EXCLUSIVE nazivayut monopolnoyu dilyankoyu exclusive region Monopolna dilyanka v Active Oberon vidpovidaye koncepciyi kritichnoyi dilyanki Gansena Yaksho monopolna dilyanka ohoplyuye vse tilo metodu jogo nazivayut monopolnim metodom exclusive method i vin poyednuye koncepciyu Gansena z proceduroyu monitora Goara Na vidminu vid proceduri monitora metod ob yekta mozhe buti monopolnim u takomu razi vin mozhe sposterigati neuzgodzheni stani ob yekta U monopolnij dilyanci mozhe buti ne bilshe odniyeyi aktivnosti odnochasno Takim chinom model zahistu v Active Oberon monitor rozmishenij u primirniku ob yekta instance based monitor Modul vvazhayut ob yektnim tipom z yedinim primirnikom singleton instance i jogo proceduri tezh mozhut buti monopolnimi zahishayuchi modul zagalom Golovna ideya monitora i aktivnogo ob yekta u tomu sho z monitorom pov yazuyetsya yakijs invariant viraz sho viznachaye nesuperechlivij vnutrishnij stan ob yekta i dovodit pravilnist jogo povedinki Inicializatori ta monopolni metodi ye instrumentami yaki mova nadaye dlya pidtrimki invariantiv ob yekta ta prihovuvannya jogo vnutrishnogo stanu Inicializator ob yekta vstanovlyuye jogo invariant a monopolni metodi jogo pidtrimuyut Koli ponyattya monitora ob yednano z ponyattyam modulya formuyetsya potuzhnij mehanizm dlya strukturuvannya operacijnih sistem Priklad vikoristannya monopolnoyi sekciyi Proceduri Set i Reset vzayemno viklyucheni TYPE MyContainer OBJECT VAR x y LONGINT Invariant y f x PROCEDURE Set x LONGINT BEGIN EXCLUSIVE zminennya x ta y atomarno SELF x x y f x END Set PROCEDURE Reset BEGIN BEGIN EXCLUSIVE zminennya x ta y atomarno x x0 y y0 END END Reset END MyContainer Sinhronizaciya Na vidminu vid bilshosti realizacij monitoriv sho vikoristovuyut dlya sinhronizaciyi umovni zminni Goara na osnovi cherg podij Brincha Gansena sinhronizaciyu aktivnostej zabezpechuye operator AWAIT sho prijmaye yak argument logichnij viraz umovu prodovzhennya vikonannya programi v tili ob yekta Shob garantuvati pravilnist sinhronizaciyi AWAIT maye mistitis u monopolnij dilyanci U razi nevikonannya umovi prodovzhennya AWAIT prizupinyaye suspend aktivnist i yaksho mistitsya v monopolnij dilyanci vidpuskaye zahoplenu dilyanku na chas pripinennya sho dozvolyaye inshim aktivnostyam zminiti stan ob yekta i zrobiti umovu prodovzhennya istinnoyu Zupinena aktivnist prodovzhit robotu lishe v tomu razi yaksho zmozhe povtorno uvijti do monopolnoyi dilyanki Priklad sinhronizaciyi vseredini rozdilyuvanogo bufera TYPE Synchronizer OBJECT VAR awake BOOLEAN PROCEDURE Wait BEGIN EXCLUSIVE AWAIT awake awake FALSE END Wait PROCEDURE WakeUp BEGIN EXCLUSIVE awake TRUE END WakeUp END Synchronizer Obrobka pomilok ta vinyatkovih situacij Div takozh Obrobka vinyatkiv V Active Oberon vidsutni zasobi strukturnoyi obrobki vinyatkovih situacij yih obroblyaye centralizovane seredovishe chasu vikonannya Operator ASSERT prijmaye yak obov yazkovij argument logichnij viraz u razi porushennya yakogo vidbuvayetsya pererivannya programi i yak i pri vikonanni operatora bezumovnoyi zupinki HALT keruvannya peredayetsya v centralizovanij obrobnik vinyatkiv Yaksho umovu operatora ASSERT mozhna obchisliti na etapi kompilyaciyi to v razi nevikonannya umovi generuyetsya pomilka kompilyaciyi Operator ASSERT i HALT mozhut mati neobov yazkovij parametr specifikator vinyatku yakij mozhna proanalizuvati v obrobniku Pislya obrobki vinyatku keruvannya peredayetsya v najblizhchu za stekom viklikiv sekciyu garantovanogo zavershennya FINALLY yaksho vona ye Potim yaksho tilo aktivnogo ob yekta poznacheno modifikatorom SAFE aktivnist bude perezapusheno inakshe yiyi robota zavershuyetsya Seredovishe chasu vikonannyaInformaciya pro tipi chasu vikonannya Tilki strukturni tipi masivi zapisi ob yekti mayut informaciyu pro tipi chasu vikonannya metainformaciyu Metainformaciya zberigayetsya u specialnij strukturi zvanij deskriptorom tipu Deskriptor tipu mistit dani pro tipi ta nazvi zminnih i poliv tablicyu uspadkuvannya tablicyu virtualnih metodiv ta tablici realizovanih Keruvannya pam yattyu V Active Oberon zastosovuyetsya avtomatichne keruvannya pam yattyu z vikoristannyam pererivnogo vitiskalnogo zbiracha smittya realnogo chasu zasnovanogo na metodi poznachok Mark and Sweep Zbirach smittya vikonuyetsya v okremomu potoci i aktivnosti potoki z vishim prioritetom nizh prioritet aktivnosti zbiracha smittya mozhut prizupiniti jogo vikonannya Pri comu derevo ob yektiv zamorozhuyetsya Na danij moment tilki sutnosti realnogo chasu mozhut pererivati aktivnist zbiracha smittya v nih zaboroneno dinamichne vidilennya pam yati za cim stezhit kompilyator Keruvannya pam yattyu gruntuyetsya na vikoristanni tipizovanih dilyanok pam yati Taka dilyanka zberigaye vkazivnik na deskriptor tipu Vikoristovuyuchi informaciyu pro tipi chasu vikonannya rozmishenu v deskriptori tipu zbirach smittya znahodit zminni i polya posilalnogo tipu i poznachaye bloki na yaki voni vkazuyut Inshimi slovami zbirachevi smittya nemaye neobhidnosti pereviryati kozhne znachennya shozhe na vkazivnik chi vono ye korektnim vkazivnikom u kupi vikoristovuyuchi informaciyu yaku nadaye deskriptor tipu vin tochno znaye yaki elementi obroblyati sho istotno zbilshuye shvidkist i tochnist roboti i znizhuye navantazhennya na proces zbirannya smittya Dlya priskorennya vidilennya pam yati vilni dilyanki pomishayutsya v spiski vilnih blokiv yaki mistyat bloki pam yati pevnih rozmiriv Zminni posilalnogo tipu poznacheni modifikatorom UNTRACED nalezhat do en Taki vkazivniki ne vidstezhuye zbirach smittya i dilyanki pam yati na yaki voni posilayutsya mozhut buti utilizovani v bud yakij moment chasu v razi yaksho yih vidililo seredovishe chasu vikonannya ta na nih nemaye dosyazhnih posilan yaki vrahovuye zbirach smittya Chasto taki modifikatori vikoristovuyut dlya roboti z dilyankami pam yati vidilenimi poza seredovishem chasu vikonannya Active Oberon abo z nebezpechnimi vkazivnikami Keruvannya aktivnistyu ob yektiv Seredovishe chasu vikonannya vidpovidaye za rozpodil procesornogo chasu garantuye razom z kompilyatorom sho v monopolnij dilyanci mistitsya ne bilshe odniyeyi aktivnosti zabezpechuye svoyechasnu perevirku umov operatora AWAIT i vidnovlennya roboti prizupinenih aktivnostej Virazi umov prodovzhennya vseredini ob yekta pererahovuyutsya v usih tochkah vihodu z monopolnih dilyanok Ce oznachaye sho zmina stanu ob yekta poza monopolnoyu dilyankoyu ne prizvodit do pererahunku umov Koli kilka aktivnostej zmagayutsya za tu samu monopolnu dilyanku to aktivnosti z vikonanimi umovami rozglyadayutsya ranishe vid tih yaki tilki hochut uvijti v zahishenu dilyanku Pidklyuchennya ta inicializaciya moduliv V Active Oberon vidsutni zasobi dlya pryamogo keruvannya dinamichnim zavantazhennyam ta vivantazhennyam moduliv Mova proponuye lishe sekciyu importu IMPORT u yakij vkazano spisok moduliv sho pidklyuchayutsya i sekciyu inicializaciyi modulya Seredovishe chasu vikonannya maye zabezpechiti pidklyuchennya ta inicializaciyu moduliv do inicializaciyi potochnogo modulya Dinamichne pidklyuchennya modulya zdijsnyuyetsya cherez mehanizm dinamichnogo zv yazuvannya Modul ne mozhna vivantazhiti doti doki na nogo ye posilannya zi spisku pidklyuchennya inshogo zavantazhenogo modulya Takim chinom shob unemozhliviti problemu ciklichnih posilan moduli slid vivantazhuvati v poryadku zvorotnomu do poryadku zavantazhennya Obrobka pomilok ta vinyatkovih situacij Modul Traps zabezpechuye centralizovanu obrobku vinyatkovih situacij Parametri yaki prijmayut operatori ASSERT i HALT mozhut vikoristovuvatisya dlya klasifikaciyi vinyatkovoyi situaciyi Pislya obrobki vinyatkovoyi situaciyi v moduli Traps seredovishe chasu vikonannya zdijsnyuye poshuk sekcij garantovanogo zavershennya FINALLY ta peredaye na nih keruvannya dlya vikonannya zavershalnih operacij U vipadku yaksho aktivnist poznachena modifikatorom SAFE i v tili ob yekta vidsutnya sekciya FINALLY vidbuvayetsya perezapusk aktivnosti inakshe vikonannya aktivnosti zavershuyetsya Programnij interfejs seredovisha vikonannya nadaye mozhlivist vstanovlennya vlasnogo obrobnika vinyatkovih situacij Prikladi programHello World MODULE HelloWorld IMPORT KernelLog BEGIN KernelLog String Hello World END HelloWorld Rozv yazok klasichnoyi zadachi postachalnika ta spozhivacha MODULE BoundedBuffers TYPE Item OBJECT Buffer OBJECT VAR h n INTEGER B ARRAY OF Item PROCEDURE Get Item VAR x Item BEGIN EXCLUSIVE AWAIT n 0 bufer ne porozhnij x B h h h 1 MOD LEN B DEC n RETURN x END Get PROCEDURE Put x Item BEGIN EXCLUSIVE AWAIT n LEN B bufer ne povnij B h n MOD LEN B x INC n END Put PROCEDURE amp Init max INTEGER BEGIN inicializator NEW B max h 0 n 0 END Init END Buffer END BoundedBuffers Div takozhA2 operacijna sistema en Oberon mova programuvannya ZonnonPrimitkiJ Gutknecht Do the Fish Really Need Remote Control A Proposal for Self Active Objects in Oberon 1997 P J Muller Active Object System Design and Multiprocessor Implementation ETH Zurich 2002 Diss ETH 14755 Florian Negele Combining Lock Free Programming with Cooperative Multitasking for a Portable Multiprocessor Runtime System ETH Zurich 2014 Diss ETH 22298 Florian Negele A2 Concurrency Framework ETH Zurich June 3 2009 P Brinch Hansen Structured Multiprogramming Communications of the ACM 15 7 July 1972 P Brinch Hansen Operating System Principles Prentice Hall 1973 C A R Hoare Monitors An Operating System Structuring Concept Communications of the ACM 17 10 549 557 October 1974 O J Dahl Monitors Revisited In A W Roscoe editor A Classical Mind Essays in Honour of C A R Hoare Prentice Hall 1994 J L Keedy On Structuring Operating Systems With Monitors ACM Operating Systems Review 13 1 January 1979 N Wirth Modula A Language for Modular Multiprogramming Software Practice and Experience 7 3 35 1977 N Wirth The Use of Modula Software Practice and Experience 7 37 65 1977 Ulrike Glavitsch Real time Garbage Collection in A2 Institute of Computer Systems ETH Zurich P Reali Active Oberon Language Report ETH Zurich 2004 PosilannyaPovidomlennya pro movu Active Oberon 2019 angl Spilnota Operacijnoyi Sistemi A2 ta movi Active Oberon u Telegram Video pro sposib programuvannya pid OS A2 angl Active Oberon for NET An Exercise in Object Model Mapping Jurg Gutknecht angl Arhiv angl Arhiv angl Arhiv Welcome to A2 angl Arhiv Arhiv angl Arhiv angl