Оберон (язык программирования)

Oberon
Изображение логотипа
Класс языка императивный, структурированный, модульный
Появился в 1986
Автор Никлаус Вирт
Система типов статическая, сильная
Испытал влияние Modula-2, Pascal
Повлиял на Active Oberon, Component Pascal, Go, Java[1][2], Modula-3, Oberon-2, Zonnon, Nim
Лицензия BSD
Сайт projectoberon.com

Оберон — язык программирования высокого уровня, разработанный Никлаусом Виртом и предназначенный для исполнения программ на одноимённой операционной системе, авторами которой являются Никлаус Вирт и Юрг Гуткнехт[нем.].

В семейство языков Оберон так же входят: Оберон-2, Оберон-07, Компонентный Паскаль, Активный Оберон и OberonScript.

Системы и среды

Программы, написанные на языке программирования Оберон, требуют определённой поддержки во время выполнения — им необходим динамический загрузчик и централизованно выполняемый автоматический сборщик мусора, для этого программам на языке Оберон нужна специальная операционная среда. Обычным способом её реализации является добавление в систему набора библиотек, реализующих необходимые компоненты, хотя, вообще говоря, операционной среде вовсе не обязательно нужна отдельная операционная система: она сама по себе может представлять собой операционную систему. Таковы системы Native Oberon для первоначального Оберона и A2 для Активного Оберона. На данный момент существуют компиляторы Оберон в байт-код виртуальной Java-машины и CLI для виртуальной машины .NET.

Операционные системы и среды для исполнения программ на языках семейства Оберон, развившихся из первоначальной Системы Оберон, являются ETH Oberon, BlackBox Component Builder, WinOberon, A2 и др.

На основе Оберона были разработаны проекты Оберон-0, Оберон-X и другие[3]. Простота Оберона и наличие исходных текстов оригинальной реализации позволяют легко адаптировать его для специальных классов задач. Но все эти Обероны очень близки между собой, поскольку и первоначальный Оберон очень прост.

История

История семейства языков Паскаль, Модула и Оберон

Язык программирования Oberon создан Никлаусом Виртом в 1988 году на основе языков программирования Modula-2, Pascal и Algol-60[4].

По словам Вирта, первоначально систему хотели писать непосредственно на Модуле, но пришли к выводу о необходимости её доработки и сокращения, что и привело к появлению Оберона[5].

Целью проекта (англ. Project Oberon) Никлауса Вирта и Юрга Гуткнехта в 1986—1989 годы[6] было создание с нуля обозримой и надёжной операционной системы для однопользовательской рабочей станции.

Для реализации этого проекта в 1988 году Никлаусом Виртом был спроектирован язык программирования высокого уровня общего назначения, также названный Оберон[7].

В 1989 году в Швейцарской высшей технической школе Цюриха (ETH) была выпущена первая реализация Оберона для процессоров семейства NS32000. Он был создан в качестве компонента операционной среды Оберон. Этот компилятор требует менее 50 Кбайт памяти, состоит из 6 модулей общим объёмом около 4000 строк и сам себя компилирует за 15 секунд на компьютере с процессором NS32532 (тактовая частота — 25 МГц).[источник не указан 949 дней]

Нововведения

Просто невозможно поблагодарить всех тех, кто так или иначе подпитывал своими идеями то, что теперь называется Oberon. Большинство идей пришло от использования и изучения существующих языков, таких как Modula-2, Ada, Smalltalk и Cedar, которые часто предостерегали нас от того, как не надо делать.Никлаус Вирт[5]

Язык сохранил основные черты синтаксиса Модулы и был объектным расширением. Это позволило отказаться от механизма вариантных записей Модулы, являющихся отступлением от первоначальной строгой статической типизации, что дало возможность ввести механизм автоматического управления памятью — сборку мусора: из языка исключена возможность освобождения динамически выделенной памяти с помощью особого оператора, а вместо него сама среда исполнения содержит модуль, возвращающий неиспользуемую память системе. Автоматическое управление памятью является средством повышения надёжности программ с динамическими структурами данных, так как исключает человеческие ошибки, свойственные, например, таким языкам, как С/C++.

Упрощение синтаксиса

Чтобы добиться наибольшей надёжности и производительности трансляции, было предпринято значительное упрощение языка за счёт его отказа от средств, которые были сочтены ненужными (исходя из опыта разработки, реализации и применения других языков), либо усложняли компилятор без достаточного оправдания с точки зрения производительности, либо были достаточно сложны, чтобы быть отправленными во внешние библиотеки, либо плохо совмещались с механизмами модульности и автоматического управления памятью: записи с вариантами, перечислимые типы, типы-диапазоны, множества общего вида, беззнаковый целый тип, локальные модули, модули определений, списки экспорта, оператор for, прежний вариант оператора with, специальный синтаксис определения главной программы. Рудиментарные средства поддержки параллельного программирования, имевшиеся в Модуле-2, не вошли в язык, так как он обслуживал однопользовательскую операционную систему. В целях упрощения отказались от обработки исключений.

Было упрощено описание массивов (индексы массивов могут быть только целочисленными и всегда начинаются с нуля, подобно языку Си), ограничено использование указателей — указатели могут существовать только на записи и массивы, в списках импорта указывается только импортируемый модуль, а при использовании импортированных имён требуется обязательная квалификация (явное указание имени модуля-экспортёра). В статье «От Модулы к Оберону»[5] Вирт подробно пояснил причины удаления каждого из элементов.

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

Благодаря внесённым изменениям, Оберон стал синтаксически проще. Описание его синтаксиса поместилось на одной странице, полное описание языка занимает около 20 страниц, что вдвое меньше, чем описание Модулы-2. Оберон является если не минимальным, то, во всяком случае, одним из самых малых по объёму универсальных языков программирования высокого уровня.

Эпиграфом к описанию оригинального Оберона было выбрано высказывание Эйнштейна: «Делай настолько просто, насколько возможно, но не проще этого».

Синтаксис в РБНФ

Определён в следующих предложениях РБНФ[8]:

Модуль           = MODULE идент ";" [СписокИмпорта] ПослОбъявл [BEGIN ПослОператоров] END идент ".".
СписокИмпорта    = IMPORT [идент ":="] идент {"," [идент ":="] идент} ";".
ПослОбъявл       = { CONST {ОбъявлКонст ";" } | TYPE {ОбъявлТипа ";" } | VAR {ОбъявлПерем ";" }}
  {ОбъявлПроц ";" | ОпережающееОбъяв";"}.
ОбъявлКонст      = ИдентОпр "=" КонстВыраж.
ОбъявлТипа       = ИдентОпр "=" Тип.
ОбъявлПерем      = СписокИдент ":" Тип.
ОбъявлПроц       = PROCEDURE [Приемник] ИдентОпр [ФормальныеПарам]";" ПослОбъявл [BEGIN ПослОператоров] END идент.
ОпережающееОбъяв = PROCEDURE "^" [Приемник] ИдентОпр [ФормальныеПарам].
ФормальныеПарам  = "(" [СекцияФП {";" СекцияФП}] ")" [":" УточнИдент].
СекцияФП         = [VAR] идент {"," идент} ":" Тип.
Приемник         = "(" [VAR] идент ":" идент ")".
Тип              = УточнИдент | ARRAY [КонстВыраж {"," КонстВыраж}] OF Тип
  | RECORD ["("УточнИдент")"] СписокПолей {";" СписокПолей} END | POINTER TO Тип | PROCEDURE [ФормальныеПарам].
СписокПолей      = [СписокИдент ":" Тип].
ПослОператоров   = Оператор {";" Оператор}.
Оператор         = [ Обозначение ":=" Выраж
  | Обозначение ["(" [СписокВыраж] ")"]
  | IF Выраж THEN ПослОператоров {ELSIF Выраж THEN ПослОператоров} [ELSE ПослОператоров] END
  | CASE Выраж OF Вариант {"|" Вариант} [ELSE ПослОператоров] END
  | WHILE Выраж DO ПослОператоров END
  | REPEAT ПослОператоров UNTIL Выраж
  | LOOP ПослОператоров END
  | WITH Охрана DO ПослОператоров END
  | EXIT
  | RETURN [Выраж] ].
Вариант          = [МеткиВарианта {"," МеткиВарианта} ":" ПослОператоров].
МеткиВарианта    = КонстВыраж [".." КонстВыраж].
Охрана           = УточнИдент ":" УточнИдент.
КонстВыраж       = Выраж.
Выраж            = ПростоеВыраж [Отношение ПростоеВыраж].
ПростоеВыраж     = ["+" | "-"] Слагаемое {ОперСлож Слагаемое}.
Слагаемое        = Множитель {ОперУмн Множитель}.
Множитель        = Обозначение ["(" [СписокВыраж] ")"] | число | символ | строка | NIL | Множество
  | "(" Выраж ")" | " ~ " Множитель.
Множество        = "{" [Элемент {"," Элемент}] "}".
Элемент          = Выраж [".." Выраж].
Отношение        = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.
ОперСлож         = "+" | "-" | OR.
ОперУмн          = "*" | "/" | DIV | MOD | "&".
Обозначение      = УточнИдент {"." идент | "[" СписокВыраж "]" | "^" | "(" УточнИдент ")"}.
СписокВыраж      = Выраж {"," Выраж}.
СписокИдент      = ИдентОпр {"," ИдентОпр}.
УточнИдент       = [идент "."] идент.
ИдентОпр         = идент [ "*" | "-" ].

Основные элементы

Программа на Обероне представляет собой набор модулей. В общем виде модуль имеет вид:

  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). Подобно Модуле-2, прописные и строчные буквы в идентификаторах различаются, все зарезервированные слова пишутся большими буквами. Все языковые конструкции, кроме цикла REPEAT..UNTIL заканчиваются ключевым словом END и допускают расположение внутри нескольких операторов без использования составного оператора BEGIN..END. Естественно, как и в Модуле-2 нет безусловных переходов.

Парадигма объектно-ориентированного программирования поддерживается механизмом расширения записей (в языке нет отдельного ключевого слова для описания классов, вроде «class» или «object», сочтено, что обычного понятия «тип запись» вполне достаточно). По сути, каждый тип запись — это описание класса, а поля записи — это данные-члены класса.

В исходном Обероне методов (процедур и функций, связанных с классом) нет вообще. Механизм методов может быть использован путём объявления в записи полей процедурного типа, которым при создании экземпляра класса присваиваются конкретные процедуры. Вызов таких процедур производится традиционным способом обращения к полю записи, по умолчанию процедура не знает об экземпляре класса, для которого она была вызвана (нет механизма, аналогичного this в C++ или Java), и если такие сведения ей необходимы, ссылка на экземпляр должна быть передана явно (например, через параметр). Отсутствие явно описываемых методов было одним из качеств исходного Оберона, вызвавшего критику привыкших к традиционным гибридным языкам программистов. С другой стороны, предлагаемый Обероном механизм позволяет реализовать всё, что реализуемо традиционными средствами языков с методами, и даже более того — в Обероне каждый экземпляр класса может иметь собственный вариант метода (значение поля процедурного типа), тогда как при описании методов как части класса все экземпляры работают с одним вариантом метода. В Обероне-2 методы были всё-таки введены. Методы описываются отдельно от типа запись, с указанием типа, с которым они связаны.

Новый тип запись может быть объявлен как расширение существующего. В этом случае тип, который расширяется, указывается в описании записи в скобках после ключевого слова RECORD. Расширенный тип автоматически получает все поля расширяемого типа и (в Обероне-2) связывается со всеми процедурами, связанными с расширяемым типом. Процедуры, связанные с новым типом, могут иметь ту же сигнатуру, что и процедуры, связанные с расширяемым типом — таким образом обеспечивается переопределение методов в порождённых типах. В Компонентном Паскале, с целью обеспечения полного статического контроля за согласованностью иерархий наследования (и этим восстанавливая принцип тотальной статической типизации, отличающий первоначальный Оберон), записи по умолчанию не являются расширяемыми, а методы не могут быть переопределены. Чтобы контролировать расширение записей и переопределение методов, используются специально введённые ключевые слова EXTENSIBLE, ABSTRACT, LIMITED, EMPTY. При этом вновь вводимые методы должны маркироваться ключевым словом NEW (ср. обязательное определение вновь вводимых переменных).

Концепции программирования

Компонентное программирование

Оберон нацелен на компонентно-ориентированную разработку программного обеспечения[9]. Инкапсуляция поддерживается исключительно на уровне модуля — все типы, объявленные внутри модуля, друг для друга абсолютно прозрачны. Из других модулей доступно то, что объявлено при определении как экспортируемое.

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

В языке отсутствует специальный механизм конструкторов. Рекомендуемым методом создания и инициализации объектов является описание порождающих модулей и процедур (в традиционной терминологии ООП — factory).

Программа в такой технологии представляет собой набор относительно самостоятельных компонентов (в данном случае — модулей), имеющих скрытую от внешнего мира внутреннюю структуру и чётко определённый интерфейс. Модули могут загружаться и выгружаться динамически, во время работы программы, система предоставляет развитые средства контроля типов во время выполнения, которые позволяют писать универсальные алгоритмы обработки данных, не зависящие от конкретных типов этих данных (например, библиотека для работы с СУБД может предоставлять методы, записывающие результат запроса из базы в запись произвольной структуры, если набор и типы полей этой записи соответствуют набору и типам полей в БД).

В компонентной парадигме считается неудачным архитектурное решение, связанное с широким использованием наследования реализации от типов, объявленных в другом компоненте, поскольку это приводит к явлению, известному как «хрупкость базового типа» — после того, как от базового типа порождено большое количество типов-наследников (причём часть из них может быть даже неизвестна разработчику базового типа), любые изменения в реализации базового типа становятся крайне рискованными, так как они могут непредсказуемым образом отразиться на типах-потомках.

Известно, что одной из проблем применения объектно-ориентированного программирования в системном программировании является необходимость иметь группы маленьких классов, которые могли бы взаимодействовать без дополнительных накладных расходов. В Обероне этой проблемы нет — все типы, определённые в одном модуле, видят друг друга, а проблем с надёжностью это не создаёт, так как модуль всё равно разрабатывается, тестируется и сопровождается как единое целое.

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

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

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

Влияние на другие языки

По утверждению Вирта[10], разработчики языка Java за несколько лет до её создания «изучили исходные коды Оберона и, в частности, исходные коды обероновских сборщиков мусора. Потом они испортили Оберон синтаксисом Си и назвали получившееся словом Java». Хотя от устного выступления нельзя требовать абсолютной точности формулировок, но во всяком случае несомненное сходство идеологий Оберона и Java (стремление к минимализму и строгой типизации, ограничение множественного наследования, автоматическое управление памятью) говорит о том, что здесь имеет место определённый консенсус относительно того, какие средства должны составлять ядро современного языка программирования общего назначения. Однако если в Обероне и его прямых наследниках минимализм остаётся во главе угла, разработчики Java пошли по пути экстенсивного наращивания возможностей языка.

Версии языка

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

Оберон-2

В 1992 году Никлаус Вирт и его ученик Ханспетер Мёссенбёк[нем.] — ныне профессор Университета им. Иоганна Кеплера в Линце — опубликовали описание дополненного варианта Оберона, получившего название Оберон-2. Он представляет собой уточнённую версию классического Оберона. Дополнения, внесённые в Оберон-2 и оформленные очень экономно, заключаются в следующем:

  • добавлены процедуры, связанные с типом, допускающие переопределение для порождённых типов (приблизительный аналог виртуальных методов в других объектно-ориентированных языках);
  • в язык возвращён оператор цикла с шагом FOR;
  • добавлена возможность экспорта описаний в режиме «только для чтения»[11][12].

Несмотря на расширение языка, объём формального описания синтаксиса Оберона-2 меньше, чем у классического Оберона за счёт оптимизации описания синтаксиса. Существует оптимизирующий компилятор XDS[13] для Оберона-2; есть также компилятор[14] в байт-код Java.

ETH Oberon

ETH Oberon - Модульная операционная система разработанная с учетом максимальной возможности полностью понять ее и программировать на ней, силами одного пользователя на языке программирования Oberon-2. В ETH Oberon нет редактора исходного текста в виде приложения, так как, сама система является редактором, компилятором, отладчиком и средой выполнения. Система имеет несколько аскетичный дизайн, но взамен получает простоту и легкость разработки приложений. В ETH Oberon, команды можно активировать в любом месте, где есть возможность ввода текста. Сам текст в любом месте системы, имеет возможность форматирования, изменения шрифта, цвета, смещения, в других системах для этих целей необходим специальный редактор. Благодаря расширяемости, возможна разработка приложений любого уровня сложности. ETH Oberon устанавливается, либо как приложение поверх операционной системы-хоста или на голое "железо" имея свои драйверы оборудования. Реализации имеются для платформ, Amiga, PC, Macintosh и другие.

Oberon SA

Oberon SA — это версия языка Оберон, разработанная Н. Виртом для процессора Strong-ARM, используемого в беспилотном вертолете.

На основе опыта разработки Oberon SA Н. Вирт в 2007 году подготовил изменения и дополнения к классическому Оберону[15][16] для более строгой поддержки структурного программирования, чем, например, в Oberon-2 или Компонентном Паскале. Новая версия языка получила название Oberon-07[17]. Имеется перевод «The Programming Language Oberon, Revision 1.11.2008» на русский язык[18]. Но в отношении поддержки объектно-ориентированного программирования язык Oberon-07 не следует за Обероном-2, а продолжает минималистичную линию классического Оберона, включая отсутствие поддержки процедур, привязанных к типам записей.

Oberon-07

Oberon-07 имеет следующие основные отличия от классического Оберона:

  • в цикле WHILE разрешены несколько охраняемых ветвей (ELSIF … DO). Тем самым обеспечена полная явная поддержка цикла Дейкстры[19]. Ранее цикл Дейкстры моделировался при помощи цикла LOOP;
  • соответственно, исключен неструктурированный цикл LOOP вместе с оператором EXIT (выход из цикла);
  • в процедуре теперь может быть только одна точка выхода, фиксированная в конце тела процедуры: RETURN, в сущности, перестал быть оператором, превратившись в такую же синтаксическую часть описания процедуры, как ключевое слово PROCEDURE и т. д.;
  • добавлен оператор цикла FOR;
  • исключено неявное приведение типа INTEGER к REAL и типов с различной разрядностью друг к другу;
  • разрешены ссылки только на записи;
  • определены процедурные переменные—могут ссылаться только на процедуры;
  • уточнено правило импорта/экспорта: экспорт переменных разрешён только для чтения, спецификатор экспорта один — «*»;
  • уточнены типы данных — CHAR поддерживает множество Latin-1, INTEGER — −2^31 — +2^31-1, REAL и LONGREAL — IEEE Standard, 32 и 64 бита соответственно, SET — множество целых между 0 и 31. В последнем описании языка[20] Вирт отказался от указания конкретного диапазона значений для базовых типов: множество значений типов INTEGER, REAL, LONGREAL и SET теперь определяется реализацией, тип CHAR содержит «стандартный набор символов» («a standard character set»).

Австралийская компания CFB Software (г. Брисбен) при Университете штата Квинсленд разработала IDE Astrobe[21] для языка Oberon-07 для микроконтроллеров ARM7 компании NXP (Philips) и синтаксические диаграммы языка Oberon-07[22], а также рекомендации по стилю программ на Oberon-07[23].

Языки семейства Oberon

Компонентный Паскаль (Component Pascal)

Оберон-2 сразу после опубликования в 1992 году рассматривался как кандидат на роль стандарта языка (конференция Oakwood Conference, Croydon, 1993), но практический опыт, накопленный при создании больших программных комплексов, выявил необходимость уточнения/расширения конструкция языка. Это лишний раз подчёркивает мудрость консерватизма, проявленного Виртом в определении классического Оберона.

Эти уточнения были предприняты в расширении Оберона-2, названном Компонентный Паскаль и опубликованном в 1999 году, компанией Oberon microsystems[24], образованной в 1992 году учениками Вирта (сам Вирт стал членом совета директоров). Как и при переходе от Оберона к Оберону-2, эти уточнения сделаны наиболее экономно[25]. Код на Компонентном Паскале может быть редуцирован к подмножеству, эквивалентному первоначальному Оберону или к другому полноценному минималистичному подмножеству, в котором наследование и переопределение методов допускается только для чисто интерфейсных типов и методов (определённых с атрибутом ABSTRACT).

В Компонентный Паскаль добавлены средства, позволяющие разработчику полностью контролировать расширение экспортируемых типов и переопределение методов (атрибуты EXTENSIBLE, ABSTRACT, NEW, EMPTY, а также возможность ограниченного экспорта метода «только для реализации»). Добавлен блок завершения тела модуля (ключевое слово CLOSE) и предопределённый пустой метод FINALIZE. Система основных (элементарных) типов приведена в соответствие с типами Java. Введён неявный строковый тип. Компания Oberon Microsystems, определившая Компонентный Паскаль, выпустила также фреймворк BlackBox Component Framework и среду визуального программирования BlackBox Component Builder[26] — небольшие по размеру и нетребовательные к ресурсам, целиком построенные на Компонентном Паскале.

Впоследствии компилятор BlackBox был встроен в кросс-платформенную среду программирования Denia, в частности для операционной системы реального времени JBed, полностью написанной на Компонентном Паскале.

Активный Оберон, Zonnon

Эти языки уже с полным основанием можно назвать не расширениями или версиями Оберона, а самостоятельными языками. В них существенно расширен синтаксис, введены конструкции для описания классических «свойств» (property) с контролем чтения/записи, числовых типов с задаваемым размером в битах. Введена поддержка активных объектов, обменивающихся сообщениями в формате, определяемом РБНФ-описанием, обработка исключений[27].

Примечания

  1. Идея динамической кодогенерации взята из диссертации ученика Вирта Микаэля Франца (PC World Russia CD, September 2005 Архивная копия от 15 мая 2012 на Wayback Machine)
  2. Лекция Н. Вирта в Нижегородском государственном университете им. Н. И. Лобачевского. Дата обращения: 21 августа 2012. Архивировано из оригинала 27 января 2012 года.
  3. Генеалогия языков семейства Оберон Архивная копия от 29 мая 2013 на Wayback Machine (англ.)
  4. Wirth, N. Modula-2 and Oberon // HOPL III : Proceedings of the third ACM SIGPLAN conference on History of programming languages : [англ.] : [арх. 22 декабря 2012]. — ACM, 2007. — June. — P. 3-1–3-10. — doi:10.1145/1238844.1238847.
  5. 1 2 3 Вирт, Н. От модулы к Оберону. : [арх. 19 сентября 2011] = Niklaus Wirth. From Modula to Oberon. Institute for Computer Systems, ETH, Zurich, Technical Paper. 1990. : [пер. с англ.]. — ИнфоАрт, 1998.
  6. Wirth, N. Project Oberon : [англ.] / N. Wirth, J. Gutknecht. — New York : Addison-Wesley, 1992.
  7. Wirth, N. The Programming Language Oberon. : [англ.] // Software — Practice and Experience : журн. — Vol. 18, no. 7. — P. 671–690.
  8. Wirth N. (1988) «The Programming Language Oberon» // Software — Practice and Experience, Vol.18, No.7, p.671-690.
  9. C. Szyperski. Component Software — Beyond Object-Oriented Programming. Addison-Wesley, 1998.
  10. Лекция Н. Вирта в Нижегородском государственном университете им. Н. И. Лобачевского. Дата обращения: 11 декабря 2021. Архивировано 30 марта 2022 года.
  11. Язык программирования Оберон-2 Архивная копия от 30 сентября 2021 на Wayback Machine, Х. Мёссенбёк, Н. Вирт
  12. A Description of the Oberon-2 Language, Paul Floyd Архивная копия от 5 сентября 2012 на Wayback Machine (англ.)
  13. XDS Family of Products. Дата обращения: 12 октября 2009. Архивировано из оригинала 23 августа 2011 года.
  14. компилятор Оберон-2 в байт-код виртуальной машины Java ([[Java Virtual Machine]]). Дата обращения: 30 сентября 2021. Архивировано 30 сентября 2021 года.
  15. Difference between Oberon-07 and Oberon
  16. Oberon at a glance
  17. The Programming Language Oberon, Revision 20.7.2011
  18. Перевод «The Programming Language Oberon, Revision 1.11.2008» на русский язык. Дата обращения: 14 февраля 2011. Архивировано 12 марта 2013 года.
  19. Э.Дейкстра. Дисциплина программирования. Мир, Москва, 1978
  20. The Programming Language Oberon. Revision 1.10.2013/3.5.2016 Архивная копия от 30 августа 2017 на Wayback Machine (англ.)
  21. IDE Astrobe для языка Oberon-07. Дата обращения: 3 мая 2010. Архивировано 3 мая 2010 года.
  22. Синтаксические диаграммы языка Oberon-07 (недоступная ссылка)
  23. Рекомендации по стилю программ на Oberon-07 в главе 10 Programming Conventions and Guidelines
  24. Oberon microsystems AG Архивная копия от 29 января 2013 на Wayback Machine (нем.)
  25. Сообщение о языке Компонентный Паскаль. Дата обращения: 28 сентября 2007. Архивировано 2 сентября 2007 года.
  26. BlackBox Component Builder. Дата обращения: 22 декабря 2005. Архивировано из оригинала 26 июля 2010 года.
  27. Active Oberon for .NET:An Exercise in Object Model Mappin. Дата обращения: 15 февраля 2011. Архивировано 16 сентября 2012 года.

Литература

На английском языке

Ссылки


Read other articles:

Petualangan SherinaBox art Petualangan SherinaSutradara Riri Riza Produser Mira Lesmana Ditulis oleh Jujur Prananto PemeranSherina MunafDerby RomeroPenata musikElfa SecioriaSinematograferYadi SugandiPenyuntingSentot SahidPerusahaanproduksiMiles FilmsDistributorCinekom(versi VCD)Tanggal rilis 7 Juni 2000 (2000-06-07) (Indonesia) Durasi114 menitNegara Indonesia Bahasa Indonesia Petualangan Sherina adalah film komedi musikal Indonesia yang dirilis pada 7 Juni 2000. Film ini dituli...

 

منتخب كندا لكرة القدم للسيدات منتخب كندا لكرة القدم للسيدات بلد الرياضة كندا  الفئة كرة القدم للسيدات  رمز الفيفا CAN  كونفدرالية كونكاكاف (North America, Central America and the Caribbean) الموقع الرسمي الموقع الرسمي،  والموقع الرسمي  المدرب جون هردمان (2018–2020)  القائد كرستين سينكل

 

Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari sumber: Bambang Sutejo – berita · surat kabar · buku · cendekiawan · JSTOR Biografi ini tidak memiliki sumber tepercaya sehingga isinya tidak dapat dipastikan. Bantu memperbaiki artikel ini dengan menambahkan su...

Tadeusz Mazowiecki (November 1989) Tadeusz Mazowiecki an seinem 80. Geburtstag Tadeusz Mazowiecki, Sarajevo Tadeusz Mazowiecki (* 18. April 1927 in Płock; † 28. Oktober 2013 in Warschau[1]) war ein polnischer Publizist, Bürgerrechtler und Politiker und von 1989 bis 1990 Ministerpräsident der Republik Polen. Inhaltsverzeichnis 1 Vom Bürgerrechtler zum Regierungschef 2 Politische Agenden und Ehrungen 3 Schriften 4 Weblinks 5 Einzelnachweise Vom Bürgerrechtler zum Regierungschef 1...

 

Imelda TherinneLahir19 Mei 1982 (umur 41)Jakarta, IndonesiaAlmamaterUniversitas TrisaktiPekerjaanPemeranmodelTahun aktif2000—sekarangSuami/istriAldijan Diah (cerai)Anak2Tanda tangan Imelda Therinne, S.E. (lahir 19 Mei 1982) adalah pemeran dan model berkebangsaan Indonesia keturunan Minangkabau.[1] Karier Imelda mengawali karier dengan menjadi seorang model. Pada ajang Indonesian Movie Awards tahun 2013, Imelda berhasil meraih Piala Layar Emas untuk kategori Pemeran Utama W...

 

Economy of NigeriaLagos, the financial centre of NigeriaCurrencyNigerian naira (NGN, ₦)Fiscal year1 April – 31 March[1]Trade organisationsAU, AfCFTA, ECOWAS, WTOCountry group Developing/Emerging[2] Lower-middle income economy[3] StatisticsPopulation 223,804,632 (2019)[4]GDP $489.80 billion (nominal, 2023)[5] $1.275 trillion (PPP, 2023)[6] GDP rank 39th (nominal, 2023) 27th (PPP, 2023) GDP growth 2.2% (2019)[7] -3.0% (2020 est.)[7...

English soprano Cecilia Young (also Cecilia Arne) (January 1712 – 6 October 1789) was one of the greatest English sopranos of the eighteenth century, the wife of composer Thomas Arne, and the mother of composer Michael Arne. According to the music historian Charles Burney, she had a good natural voice and a fine shake [and] had been so well taught, that her style of singing was infinitely superior to that of any other English woman of her time.[1] She was part of a well-known Englis...

 

This article is about the first installment of the film series. For other uses, see Tiny Times (disambiguation). 2013 filmTiny TimesDirected byGuo JingmingWritten byGuo JingmingScreenplay byGuo JingmingBased onTiny Times 1.0by Guo JingmingProduced byLi Li An Xiaofen Adam Tsuei Zhou Qiang Angie ChaiStarringYang Mi Kai Ko Amber Kuo Rhydian Vaughan Bea HaydenEvonne HsiehCheney ChenLi YuemingJiang ChaoCinematographyRandy Che[2]Edited byGu XiaoyunMusic byHou ZhijianProductioncompaniesHe Li...

 

The discography of Gippy Grewal consists of 12 studio albums, 42 singles and 108 soundtracks. Gippy Grewal discographyStudio albums12Singles42Punjabi Films Songs95Hindi Films Songs8 Studio albums Album Album details Music Chakk Ley Released: 2002 Label: Anand Music Format: CD, Digital download, streaming Atul Sharma Aaja Wey Mitra Released: 2003 Label: Nupur Audio Format: CD, Digital download, streaming Atul Sharma Mele Mittaran De Released: 2004 Label: Finetone (India) Planet Recordz (Canada...

Football stadium in Barcelona, Spain This article is about the stadium of FC Barcelona. For the stadium of AFC Ajax, see Johan Cruyff Arena. Johan Cruyff StadiumUEFA Full nameEstadi Johan CruyffLocationSant Joan Despí, Barcelona, SpainCoordinates41°22′27″N 02°03′02″E / 41.37417°N 2.05056°E / 41.37417; 2.05056OwnerFC BarcelonaOperatorFC BarcelonaCapacity6,000Record attendance5,569 (Barcelona Femení v Real Madrid Femenino; 25 March 2023)Field size105m ...

 

2021 Indian love story film BhavaiTheatrical release posterDirected byHardik GajjarWritten byHardik GajjarScreenplay byHardik Gajjar Shreyes Anil LowlekarProduced byDhaval Jayantilal GadaAksshay Jayantilal GadaParth GajjarHardik GajjarRicha Amod SachanStarringPratik GandhiAindrita RayCinematographyChirantan DasEdited byKannu PrajapatiSatya SharmaMusic byPrasad SashteProductioncompaniesHardik Gajjar FilmsBackbencher PicturesPen StudiosRelease date 22 October 2021 (2021-10-22) Ru...

 

Indian singer Kuldeep ManakBackground informationAlso known asManak SinghBorn(1951-11-15)15 November 1951[1][2]Jalal, Bathinda, Punjab, IndiaDied30 November 2011(2011-11-30) (aged 60)[1]Ludhiana, Punjab, IndiaGenresFolk, kaliOccupation(s)Singer, actor, musician, composerInstrument(s)TumbiYears active1968–2011LabelsHMV, T-SeriesMusical artist Kuldeep Manak, also spelled as Kuldip Manak (born Latif Mohammed Khan; 15 November 1951 – 30 November 2011), was an Indi...

River in Kerala,South India, tributary of Kaveri and in Kerala This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (December 2019) (Learn how and when to remove this template message) KapilaKapila River from Kabinigiri, KeralaLocationCountryIndiaStateKerala, KarnatakaPhysical characteristicsSourcePanamaram • locationWayanad district, Kerala, I...

 

Form of Music Blog Screenshot of The Rest is Noise, a classical music blog by Alex Ross A classical music blog uses the blogging format to cover classical music issues from a wide range of perspectives, including music lovers, individual performers and ensembles, composers, arts organizations and music critics. Overview As blogging has become increasingly popular, the blogrolls for classical music (like those for other genres) have grown increasingly long.[1] And yes, they are read, w...

 

Untuk satuan wilayah di atasnya, lihat Kabupaten Wonogiri. WonogiriKecamatanPemandangan Wonogiri (tampak Gunung Gandul di latar belakang)Peta lokasi Kecamatan WonogiriNegara IndonesiaProvinsiJawa TengahKabupatenWonogiriPemerintahan • CamatSoewosoLuas • Total82,92 km2 (32,02 sq mi)Populasi • Total87,490[1] jiwaKode Kemendagri33.12.12 Desa/kelurahan6 Kelurahan9 Desa Kecamatan Wonogiri (Jawa: ꦮꦤꦒꦶꦫꦶ, translit. W...

Historic building The Sheridan Apartments The Sheridan Apartments is an apartment complex in Midtown, Houston. It was listed on the National Register of Historic Places (ID# 84001825) on August 2, 1984.[1] It became a Texas Historic Landmark the same year, and in 1998 the City of Houston designated it as a landmark. It has Italianate features,[2] as well as influences from the Arts and Crafts movement and the Prairie School.[3] 1922 was the year of construction, on lan...

 

Malaysian actor and singer (born 1961) Not to be confused with Reza Shah. Yang Mulia Tengku Sri Kelana D’Raja Dato' SriRaja Shah RezzaSSAP SJMK DSAP DIMP SKBornRaja Shah Zurin bin Raja Aman Shah (1961-01-26) 26 January 1961 (age 62)Federation of Malaya (now Malaysia)OccupationActorYears active1981–presentRelativesSultan Muhammad V (cousin)Musical careerGenresNasheedInstrumentsVocals Musical artist Kelantanese Royal family The SultanThe Sultanah The Queen Dowager The Crown Pr...

 

Species of moth Herpetogramma basalis Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Arthropoda Class: Insecta Order: Lepidoptera Family: Crambidae Genus: Herpetogramma Species: H. basalis Binomial name Herpetogramma basalis(Walker, 1866) Synonyms List Botys basalis Walker, 1866 Psara basalis Botys inanitalis Lederer, 1863 Pyrausta dorsipunctalis Rebel, 1892 Herpetogramma dorsipunctalis (Rebel, 1892) Pyrausta dorcalis Alphéraky, 1889 Herpetogramma basalis is a spe...

Questa voce o sezione sull'argomento diplomatici non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. Jiří Hájek Jiří Hájek (Krhanice, 6 luglio 1913 – Praga, 22 ottobre 1993) è stato un diplomatico ceco. Hájek studiò legge e praticò l'attività di avvocato. Negli anni della sua giovinezza si iscriss...

 

Система/Період Відділ/Епоха Ярус/Вік Вік (млн років) Антропоген, Q Голоцен, Q2 Мегхалейський 0 0,0042 Нортгриппський 0,0042 0,0082 Гренландський 0,0082 0,0117 Плейстоцен, Q1 Тарантський 0,0117 0,126 Тібанський 0,126 0,781 Калабрійський 0,781 1,80 Гелазький 1,80 2,58 Неоген, N Пліоцен, N2 П'яченський старіше При...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!