Редактирование: Сравнение Языков Программирования
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
ПРЕДУПРЕЖДЕНИЕ: Длина этой страницы составляет 172 килобайт. Страницы, размер которых приближается к 32 КБ или превышает это значение, могут неверно отображаться в некоторых браузерах. Пожалуйста, рассмотрите вариант разбиения страницы на меньшие части.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 868: | Строка 868: | ||
=== ОБЕРОН И ОБЕРОН-2 === | === ОБЕРОН И ОБЕРОН-2 === | ||
- | + | Модуль - совокупность объявлений констант, типов, переменных и процедур вместе с последовательностью операторов, предназначенных для присваивания начальных значений переменным. Модуль представляет собой текст, который является единицей компиляции. | |
+ | Модуль = MODULE идент ";" [СписокИмпорта] ПоследовательностьОбъявлений | ||
+ | [BEGIN ПоследовательностьОператоров] END идент ".". | ||
+ | СписокИмпорта = IMPORT Импорт {"," Импорт} ";". | ||
+ | Импорт = [идент ":="] идент. | ||
+ | |||
+ | Список импорта определяет имена импортируемых модулей. Последовательность операторов после символа BEGIN выполняется, когда модуль добавляется к системе (загружается). Это происходит после загрузки импортируемых модулей. Отсюда следует, тот циклический импорт модулей запрещен. Отдельные (не имеющие параметров и экспортированные) процедуры могут быть активированы из системы. Эти процедуры служат командами. | ||
+ | MODULE Trees; (* экспорт: Tree, Node, Insert, Search, Write, Init *) | ||
+ | IMPORT Texts, Oberon; (* экспорт только для чтения: Node.name *) | ||
+ | |||
+ | TYPE | ||
+ | Tree* = POINTER TO Node; | ||
+ | Node* = RECORD | ||
+ | name-: POINTER TO ARRAY OF CHAR; | ||
+ | left, right: Tree | ||
+ | END; | ||
+ | |||
+ | VAR w: Texts.Writer; | ||
+ | |||
+ | PROCEDURE (t: Tree) Insert* (name: ARRAY OF CHAR); | ||
+ | VAR p, father: Tree; | ||
+ | BEGIN p := t; | ||
+ | REPEAT father := p; | ||
+ | IF name = p.name^ THEN RETURN END; | ||
+ | IF name < p.name^ THEN p := p.left ELSE p := p.right END | ||
+ | UNTIL p = NIL; | ||
+ | NEW(p); p.left := NIL; p.right := NIL; NEW(p.name, LEN(name)+1); COPY(name, p.name^); | ||
+ | IF name < father.name^ THEN father.left := p ELSE father.right := p END | ||
+ | END Insert; | ||
+ | |||
+ | PROCEDURE (t: Tree) Search* (name: ARRAY OF CHAR): Tree; | ||
+ | VAR p: Tree; | ||
+ | BEGIN p := t; | ||
+ | WHILE (p # NIL) & (name # p.name^) DO | ||
+ | IF name < p.name^ THEN p := p.left ELSE p := p.right END | ||
+ | END; | ||
+ | RETURN p | ||
+ | END Search; | ||
+ | |||
+ | PROCEDURE (t: Tree) Write*; | ||
+ | BEGIN | ||
+ | IF t.left # NIL THEN t.left.Write END; | ||
+ | Texts.WriteString(w, t.name^); Texts.WriteLn(w); Texts.Append(Oberon.Log, w.buf); | ||
+ | IF t.right # NIL THEN t.right.Write END | ||
+ | END Write; | ||
+ | |||
+ | PROCEDURE Init* (t: Tree); | ||
+ | BEGIN NEW(t.name, 1); t.name[0] := 0X; t.left := NIL; t.right := NIL | ||
+ | END Init; | ||
+ | |||
+ | BEGIN Texts.OpenWriter(w) | ||
+ | END Trees. | ||
+ | |||
+ | Загруженный модуль может вызывать команду незагруженного модуля, задавая ее имя как строку. Специфицированный модуль при этом динамически загружается и выполняется заданная команда. Динамическая загрузка позволяет пользователю запустить программу как небольшой набор базисных модулей и расширять ее, добавляя последующие модули во время выполнения по мере необходимости. | ||
+ | В Обероне-2 стандартная процедура NEW используется, чтобы распределить блоки данных в свободной памяти. Нет, однако, никакого способа явно освободить распределенный блок. Взамен Оберон-среда использует сборщик мусора чтобы найти блоки, которые больше не используются и сделать их снова доступными для распределения. | ||
+ | Интерфейс модуля (объявления экспортируемых объектов) извлекается из модуля так называемым смотрителем, который является отдельным инструментом среды Оберон. | ||
;Расширение типов | ;Расширение типов | ||
Наиболее важным добавлением(от-но Modula-2) является механизм расширенных типов записи. Он позволяет конструировать новые типы на основе уже существующих и задает определенную степень совместимости между новыми и старыми типами. Предположим, что у нас имеется тип | Наиболее важным добавлением(от-но Modula-2) является механизм расширенных типов записи. Он позволяет конструировать новые типы на основе уже существующих и задает определенную степень совместимости между новыми и старыми типами. Предположим, что у нас имеется тип |