Макросредства, адекватные языку Модула-2

Автор: Львин Б.Я.

Журнал: Компьютерная оптика @computer-optics

Статья в выпуске: 2, 1987 года.

Бесплатный доступ

Обсуждается расширение языка Модула-2 макросредствами. Предлагаемый аппарат синтаксически совпадает с базовым языком и дает возможность использовать константы сложных типов и производить настройку программ на конкретные условия применения. Рассматриваются вопросы реализации.

Короткий адрес: https://sciup.org/14058129

IDR: 14058129

Текст научной статьи Макросредства, адекватные языку Модула-2

В системе программирования Модула-2 часть вычислений выполняется на этапе трансляции исходной программы, но она ограничена вычислением константных выражений. При недостатке памяти и при возможности использовать ПЗУ, где удобно хранить константы, желательно максимально возможную часть вычислений выполнить на этапе трансляции и получить эффективную остаточную программу [1]. Представляется целесообразным разрешение использовать не только выражения, но и опе раторы периода генерации. Это дает возможность употреблять в программах именованные константы сложных типов и легко производить настройку программы на конкретные условия применения.

По предложению Мак-Илроя [2], важно, чтобы средства периода генерации совпадали с обычными средствами языка (так, в языке Модула-2, за исключением вызова функций, совпадает запись обших и константных выражений). В то же время из соображений эффективности трансляции действия периода компиляции не должны отделяться от остаточной программы по усмотрению транслятора, как это принято при смешанных вычислениях [1]. а должны явно указываться в тексте.

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

Это решение существенно усложняет транслятор, поскольку текст программного модуля должен обрабатываться в два этапа: сначала интерпретация всех макромодулей (возможно, вложенных), а за тем - трансляция обычных. Для упрощения этих проблем естественно потребовать, чтобы макромодули не были вложены в обычные модули и процедуры и наоборот. Тем самым исполнение в период генерации или трансляция с последующим исполнением становится особенностью единицы компиляции.

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

  • -    объявления макропеременных, связывающих период генерации, когда они переменные, и период исполнения, когда они константы указанного типа (нескрытого);

  • -    макроопределения, задающие процедуры периода генерации, которые могут быть использованы как в этом модуле определений, так и экспортированы в другие;

  • —    тело с операторами, задающими выполняемые модулем действия периода генерации.

Предлагаемый синтаксис приведен на рис. 1.

МпЗ ульОп р еЗ ел е н uu - DEFINITION MODULE иЗент " ? "

(импорт) С определение) EDEGT.N ПослОператороС)) END ".". определение = CONST СОбъя^лениеКонстанты "У") I

TYPE Сиде нт Е'==" тип) "5") I

UАБ; С Объ яГ>л е н иеПе р еме н н и й "5") I

ЗаголиGo кПроцедуры "У" I

MACRO UAR (Ооъя^лениеПеременной ";") I

MACRO Об ья С>л е н иеПр owed уры ";" ,

При таких макросредствах интерпретация операторов языка Модула-2 требуется только при трансляции модулей определений, когда не нужна генерация объектного кода. В создаваемый при этом символьный файл [3] необходимо дополнительно помешать информацию о макроопределениях. тем самым создавая макробиблиотеку и результирующие значения макропеременных. В этом случае окончательные значения макропеременных фиксируются при трансляции включающего их модуля определений; для остальных модулей (даже определений) они константы. Это существенно при написании макроопределений, которые при использовании в содержащем их модуле могут устанавливать значения его макропеременных, а в им

Рис. 1

портирующих модулях — только использовать эти значения.

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

DEF INIТTON MODULE РОИМОМ?

MACRO VAR p: ARRAY E0..53 OF REAL.;

FhUUEDURE POLO: REAL.) г REAL?

н£GIм FL 1-11: = 1 „ 2; pE I. 3 : = 2. 3? PE23: = 3.4 ?

5? FIVE]:- 5.6? PE5J:^ 6

END POLI MOM.

I MPLEMENTAT I ON MODUL E: POL I MOM?

PROCEDURE POL.

В EBI N X P: ~ 1..0; E: = 0 _ 0;

FOR I:-- О TO 5 DO F: = F+XP*PE 13 ? XP:==XP*X END RETURN F

END POL?

END POL. I NOH..

Рис. 2

DEF INI 1 ION MODULE SymSetHandli. ng ?

FROM M2Compller IMPORT Symbol?

CONST SetLength == 4?

TYPE: Symset = ARRAY E 0 .. SetLength 3 OF BITSET?

M A C R О V A R s 0 r a d d о p s у s : S у m s e t ? I: CARD IN A I... ? MACRO PROCEDURE: Sell (VAR si SymSet? sys Symbol)? BEGIN INCE( sL ORD(sy) DIV 16 3, ORD(sy) MOD 16) END Sell?

BEGIN FOR I :- О SetLenat DO SE03 : = О END?

a d d op s у s s - s0? S e t1 (a dd op s у s • p I и s ) ?

Sell (addop s у s • mi. n и s ) ? Sell (addop s у s »ors у )

E N I) S у mS e t Fl a n d IL n 9 .

Рис. 3

Для генерации версий программ достаточно

ввода-вывода в период компиляции. При этом вер включить в модуль SYSTEM макропроцедуры для сии будут фиксироваться символьным файлом (рис. 4).

DEFINITION MODULE: М?

FROM SYSTEM IMPORT MUrIteStrlпэ,MRead?

MAC RО V AR A1 ■ r- S z : CARDINAL ? C: CHA R ?

BEG J. N MU p 11 e St 1 I n 9 < ’ В ti л ь ш п и та с с и Г>?') ? MRe a d (С > ?

IF C-'Y' THEN ArrSz:»1000 ELSE ArrSz:=10 END END M. module: x?

FROM M IMPORT ArrSz?

VAR ARR: ARRAYL1..ArrSz3 OF CARDINAL? END X.

Рис. 4

Статья научная