Оберон (мова програмування)
Оберон — мова програмування високого рівня, розроблена Ніклаусом Віртом. Для виконання програм цією мовою приназначена однойменна операційна система (автори Н. Вірт і Юрг Гуткнехт (Jurg Gutknecht)). Системи й середовищаПрограми, що написані мовою програмування Оберон, вимагають певної підтримки під час виконання — їм необхідний динамічний завантажувач і централізовано виконуваний автоматичний збирач сміття. Для цього програмам, що написані мовою Оберон, потрібне спеціальне операційне середовище. Звичайним способом його реалізації є додавання в систему набору бібліотек, що реалізують необхідні компоненти. Загалом кажучи, операційному середовищу зовсім не обов'язково потрібна окрема операційна система: воно само по собі може являти собою операційну систему. Такими є системи Native Oberon для первісного Оберона й Bluebottle для Active Oberon. У цей час існують компілятори Оберона в байт-код Віртуальної Java-машини і CLI для віртуальної машини .NET. Операційними системами й середовищами для виконання програм на мовах родини Оберон, що розвилися з первісної системи Оберон, є ETH Oberon, BlackBox Component Builder, WinOberon, Bluebottle тощо. На базі Оберона були розроблені проекти Оберон-0, Оберон-X та інші. Простота Оберона й наявність вихідних текстів оригінальної реалізації дозволяють легко адаптувати його для спеціальних класів завдань. Але всі ці Оберони дуже близькі між собою, оскільки й первісний Оберон дуже простий. Історія мовиОсновою для Оберона послужила мова Модула-2, що виросла з Паскаля, (за словами Вірта[1], спочатку систему хотіли писати безпосередньо на Модулі, але прийшли до висновку про необхідність її доробки й скорочення, що й привело до появи Оберона). Метою проекту (Project Oberon) Ніклауса Вірта і Юрга Гуткнехта в 1986–1989 роках[2] було створення з нуля доступної для розгляду й надійної операційної системи для однокористувальницької робочої станції. Для реалізації цього проекту в 1988 році Ніклаусом Віртом була спроектована мова програмування високого рівня загального призначення, також названа Обероном.[3] У 1989 році в ETH була випущена перша реалізація мови Оберон для процесорів родини NS32000. Вона була створена як компонент операційного середовища Оберон. Цей компілятор вимагає менше 50 Кбайт пам'яті, складається з 6 модулів загальним обсягом близько 4000 рядків і сам себе компілює за 15 секунд на комп'ютері із процесором NS32532 (тактова частота — 25 МГц). Мова ОберонНововведенняМова зберегла основні риси синтаксису Модули й була об'єктним розширенням. Це дозволило відмовитися від механізму варіантних записів Модули, що є відступом від первісної строгої статичної типізації, що дало можливість запровадити механізм автоматичного керування пам'яттю — збирання сміття: з мови виключена можливість звільнення динамічно виділеної пам'яті за допомогою особливого оператора, а замість нього саме середовище виконання містить модуль, що повертає невикористовувану пам'ять системі. Автоматичне керування пам'яттю є засобом підвищення надійності програм із динамічними структурами даних, тому що виключає людські помилки, властиві, наприклад, таким мовам, як С/C++. Спрощення синтаксисуЩоб досягти максимальної надійності та продуктивності трансляції, було здійснено значне спрощення мови за рахунок відмови від засобів, які було визнано непотрібними (виходячи з досвіду розробки, реалізації та експлуатації інших мов), або ускладнювали компілятор без належного виправдання з погляду продуктивності, або були занадто складними, аби передати в зовнішні бібліотеки, чи погано поєднувалися з механізмами модульності й автоматичного керування пам'яттю: записи з варіантами, перечислимі типи, типи-діапазони, множини загального виду, беззнаковий цілий тип, локальні модулі, модулі визначень, списки експорту, оператор for, колишній варіант оператора with, особливий синтаксис визначення головної програми. Рудиментарні засоби підтримки паралельного програмування, що були в Модулі-2, не ввійшли до мови, оскільки вона призначалася для однокористувацької операційної системи. З метою спрощення відмовилися від обробки винятків. Було спрощено опис масивів (індекси масивів можуть бути тільки цілими числами і завжди починаються з нуля, подібно до мови C), обмежено використання вказівників (можуть існувати вказівники лише на записи та масиви), у списках імпорту вказується тільки імпортований модуль, а при використанні імпортованих імен потрібна обов'язкова кваліфікація (явне зазначення імені модуля-експортера). У статті «Від Модули до Оберона»[1] Вірт докладно прокоментував причини вилучення кожного з елементів. З міркувань «достатнього мінімуму» до мови не було включено синтаксичного поняття методів (процедур і функцій), що пов'язані з типом, тому що цей механізм у найзагальнішому вигляді можна легко змоделювати, створюючи в об'єктах («записах» у мові Оберон) поля процедурного типу й надаючи їм значення процедур, що відповідають методам. Таким чином, в Обероні мінімальними засобами підтримується об'єктно-орієнтоване програмування для спрощення й прискорення процесу трансляції коду. Завдяки внесеним змінам, Оберон став синтаксично простішим. Опис його синтаксису вмістився на одній сторінці, повний опис мови має близько 20 сторінок, що вдвічі менше за опис Модули-2. Оберон є якщо не мінімальною, то, у будь-якому разі, однією з найменших за обсягом універсальних мов програмування високого рівня. Синтаксис у РБНФСинтаксис «Оберона-2» вирізняється компактністю. Він визначений у наступних 33 реченнях РБНФ (дається за Х. Месенбек, Н. Вірт, 1996):
Основні елементиПрограма на Обероні являє собою набір модулів. У загальному виді модуль має вигляд: MODULE Ім'я; IMPORT СписокІмпорту; Означення; BEGIN Оператори END Ім'я. Список імпорту визначає, з яких модулів будуть імпортовані зовнішні імена. Визначення включають визначення типів, процедур, функцій, змінних, констант. При цьому визначення імен, позначених зірочкою, експортуються даним модулем, тобто будуть видні іншим модулям, що імпортують даний. В Обероні-2 допустимо також позначати імена знаком мінус, у цьому випадку вони експортуються в режимі «тільки для читання». Тіло модуля виконується при його завантаженні. У Компонентному Паскалі всередині тіла модуля (у розділі BEGIN..END) появилася можливість додати секцію CLOSE: BEGIN Оператори CLOSE Оператори END Ім'я. Тут оператори, розташовані між BEGIN і CLOSE, виконуються при завантаженні модуля, а оператори, розташовані між CLOSE і END — при вивантаженні його з пам'яті. Таке розширення було признане корисним для компонентних програм, які завантажують і вивантажують модулі динамічно. Створювані програмістом типи даних обмежені наступним набором: типи-масиви ARRAY, типи-запису RECORD, процедурні типи PROCEDURE, типи-вказівники POINTER. Вказівник може вказувати тільки на масив або запис. Синтаксис внутрішньої частини програми досить традиційний і простий. Мова підтримує традиційний набір конструкцій: умовний оператор IF, оператор вибору CASE, цикли (з передумовою — WHILE, з постумовою REPEAT..UNTIL, безумовний — LOOP, з лічильником — FOR). Подібно до Модули-2, великі й малі літери в ідентифікаторах різняться, усі зарезервовані слова пишуться великими літерами. Усі мовні конструкції, крім циклу REPEAT..UNTIL закінчуються ключовим словом END і допускають розташування усередині декількох операторів без використання складеного оператора BEGIN..END. Природно, як і в Модулі-2, немає безумовних переходів. Парадигма об'єктно-орієнтованого програмування підтримується механізмом розширених записів (у мові немає окремого ключового слова для опису класів, таких, як «class» або «object», прийнято, що звичайного поняття «тип запис» цілком достатньо). По суті, кожний тип запис — це опис класу, а поля запису — це дані-члени класу. У вихідному Обероні методів (процедур і функцій, пов'язаних із класом) немає взагалі. Механізм методів може бути використаний шляхом оголошення в записі полів процедурного типу, яким при створенні екземпляра класу надаються значення конкретних процедур. Виклик таких процедур провадиться традиційним способом звертання до поля запису, за умовчанням процедура не знає про екземпляр класу, для якого вона була викликана (немає механізму, аналогічного Новий тип запис може бути оголошений як розширення існуючого. У цьому разі тип, що розширюється, вказується в описі запису в дужках після ключового слова RECORD. Розширений тип автоматично отримує всі поля розширюваного типу й (в Обероні-2) пов'язується з усіма процедурами, зв'язаними з розширюваним типом. Процедури, пов'язані з новим типом, можуть мати ту ж сигнатуру, що й процедури, пов'язані з розширюваним типом — у такий спосіб забезпечується перевизначення методів у породжених типах. У Компонентному Паскалі, з метою повнішого контролю за розширюваністю, типи запису за умовчанням не є розширюваними, а методи не можуть бути перевизначені. Щоб дозволити розширення записів і перевизначення методів, використовуються спеціально введені ключові слова EXTENSIBLE, ABSTRACT, LIMITED, EMPTY. Приклад програми Hello, World! мовою Оберон. Концепції програмування
Оберон націлений на компонентно-орієнтовану розробку програмного забезпечення[4] Інкапсуляція підтримується винятково на рівні модуля — усі типи, оголошені всередині модуля, один для одного абсолютно прозорі. З інших модулів доступно те, що оголошене при визначенні як експортоване. Поліморфізм забезпечується за рахунок механізму методів (і процедурні поля в Обероні, і методи в Обероні-2 поводяться як віртуальні, у термінології більшості гібридних об'єктно-орієнтованих мов), а також завдяки розширеній конструкції WITH, що дозволяє виконувати різні групи операторів залежно від того, до якого з розширених типів відноситься її аргумент. У мові відсутній спеціальний механізм конструкторів. Рекомендованим методом створення й ініціалізації об'єктів є опис породжуючих модулів і процедур (у традиційній термінології ООП — factory). Програма в такій технології є набором відносно самостійних компонентів (у цьому разі — модулів), що мають приховану від зовнішнього світу внутрішню структуру й чітко визначений інтерфейс. Модулі можуть завантажуватися й вивантажуватися динамічно, під час роботи програми, система надає розвинуті засоби контролю типів під час виконання, які дозволяють писати універсальні алгоритми обробки даних, що не залежать від конкретних типів цих даних (наприклад, бібліотека для роботи із СКБД може надавати методи, що записують результат запиту з бази в запис довільної структури, якщо набір і типи полів цього запису відповідають набору й типам полів у БД). У компонентній парадигмі вважається невдалим архітектурне рішення, пов'язане із широким використанням успадкування реалізацій від типів, оголошених в іншому компоненті, оскільки це призводить до явища, відомого як «крихкість базового типу» — після того, як від базового типу породжена велика кількість типів-нащадків (при цьому частина з них може бути навіть невідома розробнику базового типу), будь-які зміни в реалізації базового типу стають украй ризикованими, тому що вони можуть непередбаченим чином відобразитися на типах-нащадках. Відомо, що однією із проблем застосування об'єктно-орієнтованого програмування в системному програмуванні є необхідність мати групи маленьких класів, які могли б взаємодіяти без додаткових накладних витрат. В Обероні цієї проблеми немає — всі типи, що визначені в одному модулі, бачать один одного, а проблем з надійністю це не створює, тому що модуль все-таки розробляється, тестується й супроводжується як єдине ціле. Типова система, розроблена на Обероні, є набором модулів із процедурними інтерфейсами, через які модулі обмінюються даними, у тому числі й об'єктами. При цьому всі засоби інкапсуляції діють тільки в міжмодульній взаємодії, що робить зручним системне програмування з використанням об'єктів.
Засоби об'єктного програмування інтерпретуються в Обероні як природний розвиток засобів роботи із записами в модульній системі, точніше, як технічний інструментарій для вирішення конкретного архітектурного завдання: забезпечити ефективний «поділ праці» між різними модулями при роботі з динамічними типами й структурами даних: наприклад, робота із вказівниками в списку може бути прихована (разом із відповідними полями) в одному модулі, а визначення й робота з конкретним «наповненням» елементів списку — задаватися в іншому (або, частіше, інших). У цьому сенсі технологія об'єктного програмування в Обероні підпорядкована концепції модульності: вона тут є, скоріше, засобом опису даних, ніж засобом побудови архітектури застосунка в цілому. Вплив Оберона на інші мовиЗа твердженням Вірта[5], розробники мови Java за кілька років до її створення «вивчили вихідні коди Оберона й, зокрема, вихідні коди оберонівських збирачів сміття. Потім вони зіпсували Оберон синтаксисом Сі й назвали отримане словом Java». Хоча від усного виступу не можна вимагати абсолютної точності формулювань, але у всякому разі безсумнівна подібність ідеологій Оберона й Java (прагнення до мінімалізму й строгої типізації, обмеження множинного успадкування, автоматичне керування пам'яттю) каже про те, що тут має місце певний консенсус щодо того, які засоби повинні складати ядро сучасної мови програмування загального призначення. Очевидно й те, що із двох мов Оберон спроектований набагато ретельніше. У родину мов Оберон входять також Оберон-07, Оберон-2, Component Pascal (Компонентний Паскаль), Active Oberon, OberonScript тощо. Версії мовиВихідна версія Oberon («класичний Оберон») — найкоротша, з найменшою кількістю ключових слів і синтаксичних конструкцій. Вона була використана як база для створення родини мов, кожна з яких розширює класичну мову в якому-небудь напрямку або відрізняється від неї деякими деталями.
У 1992 році Ніклаус Вірт і його учень Ханспетер Месенбек (Hanspeter Moessenboek) — нині професор Університету ім. Йоганна Кеплера в Лінці — опублікували опис доповненого варіанта Оберона, що отримав назву Оберон-2. Він є уточненою версією класичного Оберона. Доповнення, внесені в Оберон-2, оформлені дуже економно й полягають у наступному:
Цікаво, що незважаючи на розширення мови, обсяг формального опису синтаксису Оберона-2 менший, ніж обсяг опису класичного Оберона. Це сталося в результаті оптимізації опису синтаксису. Існує оптимізувальний компілятор XDS[8] для Oberon-2; Є також компілятор мови Оберон-2[9]у байт-код віртуальної машини Ява (Java Virtual Machine). Розроблений С.Свердловим (Вологда, ВДПУ) в 1998 році компілятор працює в Windows 95/NT. Генерує файли класів (.class), які можуть завантажуватися й виконуватися віртуальною машиною мови Ява. Дозволяє створювати застосунки й аплети. Містить стандартні для Оберона вимоги бібліотеки, а також інтерфейси для Java API.
ETH Oberon, реалізації якого є для багатьох обчислювальних платформ.
Оберон-2 відразу після опублікування в 1992 році розглядався як кандидат на роль стандарту мови (конференція Oakwood Conference, Croydon, 1993), але практичний досвід, накопичений при створенні великих програмних комплексів, виявив деякі слабості нововведень і бажаність подальших уточнень (що зайвий раз підкреслює мудрість консерватизму, виявленого Віртом у визначенні класичного Оберона). Ці уточнення були початі у варіанті Оберона-2, названому Компонентний Паскаль і опублікованому в 1999 році, компанією Oberon microsystems[10], утвореної в 1992 році учнями Вірта (сам Вірт став членом ради директорів). Як і при переході від Оберона до Оберона-2, ці уточнення зроблені максимально економно[11]. Зокрема, тепер мова повністю підтримує методологію компонентно-орієнтованого програмування. Завдяки останній обставині, Компонентний Паскаль тепер є, мабуть, найдосконалішим серед прямих нащадків класичного Оберона. Однак він може бути скорочений не тільки до підмножини, еквівалентної первісному Оберону, але й до іншої повноцінної мінімалістичної підмножини, у якій спадкування й перевизначення методів допускається тільки для чисто інтерфейсних типів і методів (визначених з атрибутом ABSTRACT). Ця обставина виявляє дещо проміжний характер Оберона-2. У Компонентний Паскаль у порівнянні з Обероном-2 додані засоби, що дозволяють розробникові повністю контролювати розширення експортованих типів і перевизначення методів (атрибути EXTENSIBLE, ABSTRACT, NEW, EMPTY, а також можливість обмеженого експорту методу «тільки для реалізації»). Додано блок завершення тіла модуля (ключове слово CLOSE) і наперед визначений порожній метод FINALIZE. Система основних (елементарних) типів приведена у відповідність із типами Java. Уведено неявний рядковий тип. Компанія Oberon Microsystems, що визначила Компонентний Паскаль, випустила також бібліотеку BlackBox Component Framework і середовище візуального програмування BlackBox Component Builder[12] — невеликі за розміром і невимогливі до ресурсів, цілком побудовані на Компонентному Паскалі. Згодом BlackBox був розширений середовищем крос-програмування Denia, що дозволяє виконувати крос-програмування для ОСРВ JBed (яка теж повністю реалізована на Компонентному Паскалі). JBed призначена для вбудованих систем, що працюють у реальному часі, наприклад, для промислових автоматів.
Oberon SA — це версія мови Oberon, розроблена Н.Віртом для процесора Strong-ARM, використовуваного в безпілотному вертольоті. На основі досвіду розробки Oberon SA Н.Вірт у 2007 році підготував зміни й доповнення до класичного Оберона[13][14] для строгішої підтримки структурного програмування, ніж, наприклад, в Oberon-2 або Компонентному Паскалі. Нова версія мови отримала назву Oberon-07[15]. Але відносно підтримки об'єктно-орієнтованого програмування мова Oberon-07 не йде за Обероном-2, а продовжує мінімалістичну лінію класичного Оберона, включаючи відсутність підтримки процедур, що прив'язані до типів записів. Oberon-07 має такі основні відмінності від класичного Оберона:
Австралійська компанія CFB Software (м. Брисбен) при Університеті штату Квінсленд розробила IDE Astrobe[17] для мови Oberon-07 і синтаксичні діаграми мови Oberon-07[18]. Мови родини Oberon
Ці мови вже можна називати не розширеннями чи версіями Оберона, а самостійними мовами. У них істотно розширено синтаксис, уведено конструкції для опису класичних «властивостей» (property) з контролем читання/запису, числові типи з розміром, що задається у бітах. Уведено підтримку активних об'єктів, що обмінюються повідомленнями у форматі, обумовленому РБНФ-описом, обробка винятків.
У Росії розроблено мову Глагол, структурно дуже близьку до Оберона-2. Головна її відмінність полягає у використанні російських службових слів. [19] [20] Крім цього, мова має ще ряд відмінностей від Оберона-2:
Мова підтримує юнікод. Реалізовано компілятор (називаний перетворювачем) для платформ Windows і PocketPC, а також середовище розробки (також для Windows). Цікаві факти
Примітки
Література
Посилання
Див. такожInformation related to Оберон (мова програмування) |