Макросредства, адекватные языку Модула-2
Бесплатный доступ
Обсуждается расширение языка Модула-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