Х. Мёссенбёк, Н. Вирт - Язык программирования Оберон-2, страница 6
Описание файла
PDF-файл из архива "Х. Мёссенбёк, Н. Вирт - Язык программирования Оберон-2", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 6 страницы из PDF
Не являясь частью языка, эта среда способствует увеличению мощности Оберона-2 идо некоторой степени подразумевается при определении языка. В приложении D описанысущественные особенности типичной Оберон-среды и даны советы по peализации. Подробностиможно найти в [1], [2], и [3].D1.
КомандыКоманда - это любая процедура P, которая экспортируется модулем M и не имеет параметров. Онаобозначается M.P и может быть активирована под таким именем из оболочки операционнойсистемы. В Обероне пользователь вызывает команды вместо программ или модулей. Это даетлучшую структуру управления и предоставляет модули с несколькими точками входа. Когдавызывается команда M.P, модуль M динамически загружается, если он уже не был в памяти (см.D2) и выполняется процедура P. Когда P завершается, M остается загруженным.
Все глобальныепеременные и структуры данных, которые могут быть достигнуты через глобальные переменныеуказатели в M, сохраняют значения. Когда P (или другая команда M) вызывается снова, она можетпродолжать использовать эти значения.Следующий модуль демонстрирует использование команд.
Он реализует абстрактнуюструктуру данных Counter, которая содержит переменную-счетчик и обеспечивает команды дляувеличения и печати его значения.MODULE Counter;IMPORT Texts, Oberon;VARcounter: LONGINT;w: Texts.Writer;PROCEDURE Add*; (* получает числовой аргумент из командной строки *)VAR s: Texts.Scanner;BEGINTexts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos);Texts.Scan(s);IF s.class = Texts.Int THEN INC(counter, s.i) ENDEND Add;26PROCEDURE Write*;BEGINTexts.WriteInt(w, counter, 5); Texts.WriteLn(w);Texts.Append(Oberon.Log, w.buf)END Write;BEGIN counter := 0; Texts.OpenWriter(w)END Counter.Пользователь может выполнить следующие две команды:Counter.Add nCounter.WriteДобавляет значение n к переменной counterВыводит текущее значение counter на экранТак как команды не содержат параметров, они должны получать свои аргументы из операционнойсистемы.
Вообще команды вольны брать параметры отовсюду (например из текста после команды,из текущего выбранного фрагмента или из отмеченного окна просмотра). Команда Add используетсканер (тип данных, обеспечиваемый Оберон-системой) чтобы читать значение, которое следует занею в командной строке.Когда Counter.Add вызывается впервые, модуль Counter загружается и выполняется его тело.Каждое обращение Counter.Add n увеличивает переменную counter на n.
Каждое обращениеCounter.Write выводит текущее значение counter на экран.Поскольку модуль остается загруженным после выполнения его команд, должен существоватьявный способ выгрузить его (например, когда пользователь хочет заменить загруженную версиюперекомпилированной версией). Оберон-система содержит команду, позволяющую это сделать.D2. Динамическая загрузка модулейЗагруженный модуль может вызывать команду незагруженного модуля, задавая ее имя как строку.Специфицированный модуль при этом динамически загружается и выполняется заданная команда.Динамическая загрузка позволяет пользователю запустить программу как небольшой наборбазисных модулей и расширять ее, добавляя последующие модули во время выполнения по меренеобходимости.Модуль M0 может вызвать динамическую загрузку модуля M1 без того, чтобы импортироватьего. M1 может, конечно, импортировать и использовать M0, но M0 не должен знать осуществовании M1.
M1 может быть модулем, который спроектирован и реализован намного позжеM0.D3. Сбор мусораВ Обероне-2 стандартная процедура NEW используется, чтобы распределить блоки данных всвободной памяти. Нет, однако, никакого способа явно освободить распределенный блок. ВзаменОберон-среда использует сборщик мусора чтобы найти блоки, которые больше не используются исделать их снова доступными для распределения. Блок считается используемым только если онможет быть достигнут через глобальную переменную-указатель по цепочке указателей.
Разрывэтой цепочки (например, установкой указателя в NIL) делает блок утилизируемым.Сборщик мусора освобождает программиста от нетривиальной задачи правильногоосвобождения структур данных и таким образом помогает избегать ошибок. Возникает, однако,необходимость иметь информацию о динамических данных во время выполнения (см. D5).D4. СмотрительИнтерфейс модуля (объявления экспортируемых объектов) извлекается из модуля так называемымсмотрителем, который является отдельным инструментом среды Оберон. Например, смотрительпроизводит следующий интерфейс модуля Trees из Гл. 11.27DEFINITION Trees;TYPETree = POINTER TO Node;Node = RECORDname: POINTER TO ARRAY OF CHAR;PROCEDURE (t: Tree) Insert (name: ARRAY OF CHAR);PROCEDURE (t: Tree) Search (name: ARRAY OF CHAR): Tree;PROCEDURE (t: Tree) Write;END;PROCEDURE Init (VAR t: Tree);END Trees.Для типа запись смотритель также собирает все процедуры, связанные с этим типом, и показываетих заголовки в объявлении типа запись.D5.
Структуры данных времени выполненияНекоторая информация о записях должна быть доступна во время выполнения: Динамический типзаписей необходим для проверки и охраны типа. Таблица с адресами процедур, связанных сзаписью, необходима для их вызова. Наконец, сборщик мусора нуждается в информации орасположении указателей в динамически распределенных записях. Вся эта информациясохраняется в так называемых дескрипторах типа.
Один дескриптор необходим во времявыполнения для каждого типа записи. Ниже показана возможная реализация дескрипторов типа.Динамический тип записи соответствует адресу дескриптора типа. Для динамическираспределенных записей этот адрес сохраняется в так называемом теге типа, которыйпредшествует фактическим данным записи и является невидимым для программиста. Если t переменная типа CenterTree (см. пример в Гл. 6), рисунок D5.1 показывает одну из возможныхреализаций структур данных времени выполнения.Рис. D5.1 переменная t типа CenterTree, запись t^, на которую она указывает, и дескриптор типаПоскольку и таблица адресов процедур и таблица смещений указателей должны иметьфиксированное смещение относительно адреса дескриптора типа, и поскольку они могут расти,когда тип расширяется и добавляются новые процедуры и указатели, то таблицы размещены впротивоположных концах дескриптора типа и растут в разных направлениях.Связанная с типом процедура t.P вызывается как t^.tag^.ProcTab[IndexP].
Индекс таблицыпроцедур для каждой связанной с типом процедуры известен во время компиляции. Проверка типаv IS T транслируется в v^.tag^.BaseTypes [ExtensionLevelT] = TypeDescrAdrT. И уровеньрасширения типа запись (ExtensionLevelT), и адрес описателя типа (TypeDescrAdrT) известны вовремя компиляции. Например, уровень расширения Node - 0 (этот тип не имеет базового типа), ауровень расширения CenterNode равен 1.[1] N.Wirth, J.Gutknecht: The Oberon System. Software Practice and Experience 19, 9, Sept. 1989[2] M.Reiser: The Oberon System. User Guide and Programming Manual.
Addison-Wesley, 1991[3] C.Pfister, B.Heeb, J.Templ: Oberon Technical Notes. Report 156, ETH Zurich, March 1991.