автореферат диссертации по информатике, вычислительной технике и управлению, 05.13.11, диссертация на тему:Системы автоматизации построения трансляторов и их применение для эффективной реализации языков программирования

доктора физико-математических наук
Серебряков, Владимир Алексеевич
город
Москва
год
1990
специальность ВАК РФ
05.13.11
Автореферат по информатике, вычислительной технике и управлению на тему «Системы автоматизации построения трансляторов и их применение для эффективной реализации языков программирования»

Автореферат диссертации по теме "Системы автоматизации построения трансляторов и их применение для эффективной реализации языков программирования"

АКАДЕМИЯ НАУК СССР ВЫЧИСЛИТЕЛЬНЫЙ ЦЕНТР

//3 й УЗ

На правах рукописи

Серебряков Владимир Алексеевич

УЖ 519.685.3

Системы автоматизации построения трансляторов и их применение для эффективной реализации языков программирования

Специальность 05.13.11 "Математическое и программное обеспеченна вычислительных машин и систем"

• Автореферат диссертации на соискание ученой степени доктора Физико-математических наук

МОСКВА

1990

Работа выполнена в Вычислительном Центре АН СССР

Официальные оппоненты:

Королев Л.Н., чпен-корроспондент АН СССР,

доктор Физико-математических наук.

Иванников В.П.. член-корреспондент АН СССР,

доктор Физико-математических наук.

Подшивалов Д.Б., доктор Физико-математических наук.

Ведущая организация: Вычислительный Центр Сибирского отделения All СССР.

Защита диссертации состоится ".....".......19 г.

в ... час. на заседании Специализированного совета Д002.32.02 при ВЦ АН СССР по адресу: Н7333. Моска, ул. Вавилов, 40, в конФерени-зале.

С диссертацией можно ознакомиться в библиотеке Математического Института АН СССР.

Автореферат разослан ............. 1990 г.

Ученый секретарь Специализированного совета кандидат Физико-математических наук

С.М. Шваргин

Актуальность проблемы.

С появлением языков программирования возникла задача трансляции программ и средств Формального описания языков и трансляторов и поддержки этих Формализмов в виде систем построения трансляторов. На протяжении более, чем двадцати лет были разработаны самьв различные Формализмы для описания языков программирования. Среди них стоит отметить Венский метод, грамматики Ван Вейнгаарлона. аксиоматический подход, денотационный подход. атрибутные грамматики. Было предпринято огромное число попыток создать на основе развиваемых Формализмов такие программные средства, которые бы позволяли по Формальному описание языка строить транслятор (или интерпретатор) с него. Как правило, эти попытки носили чисто экспериментальный характер и задачи создания средств. позволявших создавать качественные высокоэффективные трансляторы не ставилось. В то же время ясно. что проблема разработки трансляторов остается аюуальной и требуются практические системы, позволяющие создавать качественные трансляторы.

Задача.исследования ставилась так: на основе накопленного опьгга как в области теории описания языков программирования и методов трансляции, так и в области практики создания трансляторов, разработать такую систему и методы ее применения. которые позволили бы строить трансляторы, качество которых на уступало бы написанным вручную.

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

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

Методы исследования.

В результате анализа различных методов описания языков программирования выбор был сделан на атрибутном Формализме. Основная причина этого заключается в том. что этот Формализм хорошо согласуется с широко применяемыми на практике методами трансляции, и прежде всего с методами, в основе которых лежит контекстно-свободный анализ. Этот Формализм достаточно технологичен и естествен. Конечно. реальное применение атрибутных методов сталкивается со значительными трудностями, поэтому на атрибутные грамматики наложены некоторые ограничения. С другой стороны, практика применения атрибутных систем показала, что для того, чтобы они стали эффективным средством, требуются различные расширения. На основе этого была разработана система автоматизации построения транслятров Супер.

Практическая ценность. Система Супер применялась для трансляторов с различных языков программи;хгапния. Созданная с ее помощью система программирования Модула-2 имеет весьма высокие характеристики, ничем не уступающие разработанным вручную как по скорости трансляции, так и по качеству генерируемого кода. Система Супер и разработанные методы трансляции и методика применения системы с успехом могут быть использованы для разработки и других систем программирования.

Аггообация работы.

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

Объем диссертации 240 страниц. Диссертация состоит из введения, пяти глав, заключения и списка литературы из 66 наименований.

,. В I главе дается краткий обзор методов определения языков программирования и систем автоматизации разработки трансляторов. Среди них особо рассматриваются вопросы Формализации описания контекстных условий и генерации кода. Рассматриваются вопросы применения атрибутных грамматик, в частности проблемы, возникающие в практике их использования. Лается обзор наиболее развитых систем, разработанных как а СССР, так и за рубежом. Приводятся поиморы использования этих систем для описания различных языков программирования.

В II главе дается описание входного языка систему автоматизации построения трансляторов Супер.

III глава посвяшена разработанному промежуточному языку Лидер, используемому в дальнейшем для Формализации описания языка Модула-2.

IV глава посвямена разработка методов применения системы Супер для описания языка высокого- уровня (Модулы-2). Она включает в себя как описание входного языка, генерация промежуточного представления, так и генерации кода.

В V главе приводится обыая структура системы программирования Модула-2 и ее основные характеристики.

В заключении делаются основные выводы из проделанной работы.

Средства определения языков программирования: обзор.

Теория и практика описания и реализации языков программирования делят описание на четыре уровня; лексический, контекстно-свободный, контекстно-зависимый и семантический. Семантику языка можно определить двумя основными способами: интерпретацией. т.е. в терминах поведения некоторой абстрактной машины, или трансляцией, т.е. в терминах другого языка, семантика которого считается определенной. Наибольший интерес представляет собой трансляция в машинные команды, поскольку именно это является как правило целыо описания языка. Вопросам автоматизации генерации кода в миое уделялось много внимания и краткий обзор работ в этом направлении приведен в разделе II.2.

Определение контекстных условий.

Для трансляторов с языков программирования одной из задач является определение правильности транслируемой программы. Существенным является то. что проверить правильность произвольной программы с точки зрения ее поведения на всем допустимом множестве входных данных для сколько-нибудь разумного языка программирования невозможно. Поэтому свойство "правильности" программы традиционно подразделяют на "статическую" правильность и "динамическую" правильность. Под статической правильностью понимают обычно ряд достаточно простых, не зависящих от конкретных входных данных разрешимых свойств, которые проверяется на этапе трансляции, а под динамической правильностью - правильность поведения программа на множестве входных данных. Отметим, что даже в отношении конкретного языка программирования проведение этой грани не является однозначным.

В свою очередь, статически разрешимые свойства языков программирования традиционно делят на два класса: принадлежность некоторому контекстно-свободному языку и все прочие, которые называют "контекстно-зависимыми". Связано такое разделение с ясностью Формулировки и относительной простотой определения принадлежности КС-язьку. Поэтому в

основа тактически всех Формализмов определения языков лежит КС-синтаксис.

Обязательным требованием к множеству программ Р с правильными контекстно-зависимыми условиями является разрешимость этого множества. Само понятие контекстных условий неотрывно связано с Формализмом их задания. Здесь возможны два пути. Во-первых, сам Формализм может быть таков, что с его помошьо можно описывать только разрешимые множества. Во-вторых. Формализм может быть универсальным (т.е. описывать все рекурсивно- перечислимьв множества) и на автора описания ложится ответственность за его использование.

Были предложены как Формализмы первого рода, так и второго. К Формализмам первого рода относятся прежде всего грамматики с ограничениями на вывод: контекстные (ноукорачиваюшие) грамматики. программные грамматики, индексные грамматики.

Применение грамматик с ограничениями на вывод для описания языков программирования оказалось весьма неудобным и. кроме того, сложность анализа пратически неприемлемой.

К Формализмам второго рода можно отнести двухуровневые грамматики (грамматики Ван Вейнгардена) и логический подход.

Автоматизация генерации кода.

Вопросам автоматизации генерации кода удалялось много внимания. При этом можно выделить два основных подхода. В первом строэтся так называемое "Описание мамины", в котором указывается структура памяти. команд, регистров и т.д. Конструктор генераторов кодов затем по этому описанию, зная Формат промежуточного представления, строит собственно генератор кодов.

Второй подход заклочается в том. что предлагается специализированны* язык по описанию генераторов кодов. На этом языке задается соответствие между системой команд машины и промежуточным представлением. В этом случае в качестве "Конструктора генератора кодов" выступает

по-существу транслятор с этого языка.

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

В обзоре рассмотрены системы построения трансляторов, разрабатываемые за рубежом: HLP'78/HLP'84/TOOLS. HLP/S2. HLP/PAS, PROF-LP. FNC-2. GAG. HUG 2. OPTRAN. MARVIN. YACC. a также системы, разрабатываемые в СССР:Эльма (Таллин). Тарту. САГЕГГ (Гомель). Кросс (Новосибирск). Приведены примеры атрибутных описаний языков программирования: Алгол-68. Ада. Паскаль. Евклид.

Основные выводы.

Из приведенного краткого обзора можно сделать следующие основные выводы.

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

некоторые расширения языка атрибутшгх грамматик (.на вьподя111ио из этого полкласса, например. глобальные атрибуты).

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

Составные атрибутные грамматики.

Как можно видеть из обзора, довольно простые по идее атрибутные грамматики требуют сложных вычислителей атрибутов. Если посмотреть на классы АГ с точки зрения них- ! основной цели - получения эФФоктигсннх вычислителей, то главным источником ноэ№этивности служит необходимость посещать некоторые вершины многократно. Практически это означает, что либо атрибутированное дерево программы необходимо держать в оперативной памяти, что требует очень большой памяти, либо многократно перекачивать его на внешнюю память и с нее. Одновизитные грамматики позволяют вычислять атрибуты за один обход дерева, но в порядка, вновь требуюмем прямого доступа к вершинам дерева. •

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

Путь второй заключается в следующем. Пусть мы имеем две атрибутные граматики и 02. Наряду с обычными Формулами

вычисления атрибутов вида а0:-Г(а1____ап) введем

"синтаксические" атрибуты Х<-М2 и Т2 и "синтаксические"

правила вычисления атрибутов вила Х0:-р(Х1...,Хп). где р<-Р2. Такое правило представляет собой поддерево с вершиной

Х0. построенное из поддеревьев с вершинами XI.....Хп. Если в

качество XI выступает не синтаксический, а семантический атрибут G2. он рассматривается как терминальная вершина. Разрешим также формулы вычисления атрибутов вида

Х1.а:-Г(а1____an), где X - синтаксический атрибут, если

а<-А(Х1). Результатом вычисления в G1 будем считать значение выделеного ситаксичэского атрибута аксиомы. Такую пару грамматик <G1,G2> будем называть "парной" атрибутной грамматикой. Если парными АГ являются <G1.G2>. <G2.G3>. ... . <Gn-l,Gn>. то <G1.....Gn> будем называть "составной" АГ.

Пусть мы имеем простую к-перестановочную АГ G. Тогда для каждого нетерминала X существует разбиение его атрибутов

AUX).....Ак(Х) такое, что на 1-ом обходе дерева вычисляются

атрибуты Ai и для каждого правила р:Х0->Х1...Хп существует последовательность П-<п1...пк> перестановок символов правой части таких, что пои входе в поддерево с вершиной Х0. в которой применено правило р. на 1-ом обходе дерева потомки XI...Хп посещаются в порядке ni.

• Рассмотрим теперь следующую составную грамматику. G1 для каждого нетерминала имеет атрибуты А(Х) и синтаксический атрибут Six, а каждому правилу р:Х0->Х1...Хп соответствуют семантические правила вычисления атрибутов А1(Х) для каждого

X и одно синтаксическое. Sx0:-nl(Sx1.....Sxn). а также

правила Sxl.a:-Xi.a для a<-Al(Xt). В АГ Gk каждому правилу р: Х0->Х1...Хп соответствуют семантические правила вычисления атрибутов Ак(Х) для каждого X и одно синтаксическое

Sx0:-nk(Sxl.....Sxn). а также правила Sxl.a:-Xt.a для

а<-А1СХ1) Ак(Х1).

Теорема. Так построенная составная АГ <G1.....Gk>

эквивалентна исходой АГ G в том смысле, что в Gk будут вычислены все атрибуты и они получат те же значения. • что и G.

- и -

Таким образом простая к-перестановочная АГ преобразуется в к Ь-атрибутных. В чем преимущество такого преобразования? Для вычисления всех атрибутов к-перестановочной АГ требуется либо держать все дерево в памяти, либо иметь прямой доступ к атрибутам на внешней памяти. Первое не реально для обычных программ, второе приводит к резкому замедлению транслятора. Преобразование к-перестановочной грамматики в к атрибутных позволяет в какой-то степени избежать этих трудностей. Частично атрибутированное промежуточное представление считывается один раз из последовательного Файла. Кроме того, такой подход допускает возможность того, что синтаксис промежуточного представления не совпадает с исходным, что позволяет решать более эффективно многие задачи трансляции.

Глобальные атрибуты

Введем понятие области действия атрибута в дереве как множество ветвлений, в которых допустимо использование в Формулах данного атибута.

При использовании определения АГ. приведенном выше, областью действия каждого из атрибутов являются два ветвления, в которые входит нетерминал, которому приписан атрибут (или одно для термиального символа). Назовем такие атрибуты локальными. Использование только таких атрибутов не всегда удобно при определении языков программирования. Например, переменная может быть использована в любом операторе. Если пользоваться только локальными атрибутами, то атрибут. хранящий список описаний, нужно сначала "протянуть вверх" через описания, а затем спуспггь вниз до каждого использования переменной.

Для того, чтобы избежать этих трудностей, определим область действия атрибутов натермнала N следующим образом. Если среди потомков N1 нет вершин N. то областью действия а<-А(М) будем считать все ветвления поддзрва с вершиной М1. а также ветвлениа. в которое N1 входит в правую часть. Если же среди потомков N1 есть емз вершина N2, то областью действия а будем считать все ветвления поддерева N1 за

исключением поддеревьев. вершинами которых являются потомки N2. а также ветвление, к которое N1 входит в правую часть. Схематично это изображено на рисунке 1.

Пересечение областей действи N2 но вызывает противоречий при использовании атрибутов т.к. всегда можно указать, идет ли речь об атрибутах символов данного правила или символов-предков.

При использовании атрибутов будем употреблять термин "локальный" атрибут, если речь идет об атрибутах данного правила, и термин "глобальный" атрибут, если речь идет об атрибутах символа-предка. Подчеркнем. что при таком определении нет деления самих атрибутов на локальнш и глобальные. Все атрибуты дерова имеют область дойствия. данную определением. Деление на локальные и глобальные относится к использования атрибутов.

Введение глобальных атрибутов требует рассмотрения вопроса о сохранении возможности статической проверки корректности АГ.

" АГ (с глобальными атрибутами) будем называть корректной. если:

1. Не существует такого дерева вывода, в котором атрибут используется вне своей области действия.

2. Не существует такого дерева вывода, в котором атрибуту не присваивается значения в его области действия.

3. Не существует такого дерова вывода, в котором атрибуту в его области деРютвия присваивается значение более одного раза.

4. АГ не зациклена.

Теорема.

Существует алгоритм проверки корректности всякой АГ (с глобальными атрибутами).

N1 /1\

/ I \ I / I \ I /1\И

I / I \ I / I \

I М

/1\

/ I \ I / I \ I

/1\ I / I \ I

/ I \ I

I /1\ - N2

I / I \ I / I \ I /1\ N .1 / I \ I / I \

/1\ N / \ \ " / I \ I /1\ I / I \ I

/ I \ РМ

Рис. 1.

Рис. 2.

Структурные атрибуты.

Будем называть атрибут стру1стурным. если: 1) он представляет собой совокупность величин, называемых полями струстурного атрибута: 2) среди семантических Формул данной АГ имеются Формулы. при выполнении которых вычисляется или используются значения отдельных полей структурного атрибута.

Назовем атрибутами типа 1 такие структурные атрибуты, у которых ко всем полям возможен пряной доступ. Примерами атрибутов такого типа могут служить массивы, записи и т.п.

У атрибутов типа 2 прямой доступ ко всем полям невозможен. Типичными примерами таких атрибутов являются Файлы с поледоватольным доступом, стеки.

Атрибутами типа 1.1 Назовем така структур! йя атрибуты типа 1. у которых чило полай можно установить по виду АГ. В качестве примера приведем записи и статические массивы и их комбинации.

Атрибуты типа 1.2- это стуктурнш атрибуты типа 1, число полей которых по виду АГ установить нельзя. Простейшим

примером могут служить динамические массивы, размеры которых определяются значениями некоторых атрибутов Сипи их полей) и тем самым зависят от конкретного дерева вывода.

Атрибуты типа 1.1.1 - это атрибуты типа 1.1. обладающие следующим свойством: в данной АГ во всех Формулах вычисления атрибутов типа 1.1 по виду АГ. т.е. статически, можно установить, какие именно поля атрибутов типа 1.1 входят в формулу.

К атрибутам типа 1.1.2. напротив, отнесем все структурные атрибуты типа 1.1, для которых в данной АГ имеется хотя бы одна Формула вычисления такая. что по виду АГ нельзя установить, значение какого именно поля вычисляется или используется.

АГ со структурными атрибутами обладают следующими свойствами.

Утверждение 1.

Существует алгоритм. позволяющий для всякой АГ. включающей только атрибуты типа 1.1.1. по виду АГ проверить ее корректность.

Утверждение 2.

Но существует алгоритма, позволяющего для произвольной АГ. включающей атрибуты типа 1.1.2 и/или 1.2 проворить ее корректность.

Утверждение 3.

Если АГ включает только структунш атрибуты типа 1 и корректна, то значения, полученные атрибутрами, не зависят от порядка выполнения формул.

Статически и динамически управляемая видимость.

При описании контекстных условий языков программирования с блочной структурой практически недостаточно и таким образом определенных глобальных атрибутов, поскольку блоки могут быть вложены друг в друга. Поэтому в системе Супер

введен третий класс атрибутов - атрибуты с динамической видимостью, в отличив от локальных и глобальных атрибутов, которые мы будем называть атрибутами со статически определенной видимостью.

Если N - нетерминал, то разрешим атрибуты типа POINTER ТО N - указатели на нетерминал N. Если нетерминал N имеет атрибут А. а нетерминал М - потомок N имеет атрибут PN типа POINTER ТО N. которому присвоено значение PN:-@N. то к тому атрибуту А символа N можно обратиться как PN0.А. Если сам символ N имеет атрибут типа POINTER ТО N. то все символы N связаны в список, как это изображено на рис. 2. Про такие атрибуты будем говорить, что они имеют "динамическую видимость". Область (динамической) видимости такого атрибута - все поддерево с вершиной N.

Входной язык системы автоматизации построения

трансляторов Супэр.

Описание транслятора состоит из заголовка, раздела описаний и схемы перевода. В разделе описаний определяются объекты, которые используются в схеме перевода. В заголовке указывается имя транслятора и перечисляются его параметры. В списке внешних Файлов указываются имена Файлов, связывавших транслятор с его окружением. В разделе описаний определяется алфавит атрибутной грамматики языка и объекты, используемые в описании транслятора. Это константы, типы, процедуры и Функции. В язык введено понятие ключевое множество. Если множество является ключевым (присутствует ключевое слово key), то базовьм типом должен быть тип записи, в состав которой на верхнем уровне входит поле с именем ИмяПолп. Типом этого поля может бить INTEGER, CARDINAL или ARRAV Г..] OF CHAR. Значения типа список - это упорядоченная последовательность произвольной длины компонент одного типа. Значения типа массив - это упорядоченный набор Фиксированного числа компонент одного и того же типа. Упорядоченность задается описанием типа, называемого типом.

индекса. Значение типа запись - это совокупность Фиксированного числа именованных компонент. возможно различных типов. Компоненты записи называются полями. Описание типа запись состоит из перечисления типов полей и имен, обозначающих поля внутри записи. Значения типа запись могут иметь несколько вариантов структуры.

Алфавит.

Алфавит содержит описание разделителей, классов лексем, нетерминалов, атрибутов, сопоставленных символам грамматики и типов этих атрибутов. В разделе нетерминальных символов должны бить описаны все нетерминалы КС-грамматики языка. Описание нетерминала заключается в определении его имени, списка атрибутов и типов атибутов. В разделе процедур и Функций должны быть описаны заголовки всех процедур и Функций. используемых в семантических Формулах атрибутной грамматики.

Схема перевода.

Схема перевода содержит описание синтаксиса и семантики реализуемого языка.

Синтаксическое правило состоит из левой и правой частей. Левая часть - нетерминал, описанный в разделе нетерминалов. И наоборот, каждый из нетерминалов, описанных в этом разделе, должен встречаться в левой части хотя бы одного синтаксического правила.

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

Имеется два вида мотаскобок: квадратные и круглые. Квадратные скобки используются тогда, когда конструкиия. порождаемая нетерминалом, заключенным в эти скобки, может быть опущена. Круглые скобки используются для обозначения

повторяющихся конструкций. Внутри метаскобок 'С. ')' через метасимвол '/' можно указывать один разделитель повторяющихся конструкций. Комбинация круглых и квадратных скобок используется для описания повторяющихся конструкций с разделителем в случав, когда конструкция. порождаемая нетерминалом, может быть опушена.

Семантика правила строится из отдельных самантичеких действий.

Выполнение семантических действий связывается с обходом синтаксического дерева сверху-вниз слева-направо. В процесса такого обхода каждая вершина дерева посещается п-»1 раз. где п - число ее потомков. Пусть в данной вершнв применено правило А ::- В С ... и длина цепочки ВС ... равна п. Вход в вершину А сверху будем называть 0-м посещением, вход после обхода первого из потомков ВС ... - первым посещением и т.д.

Метки служат для возможности планирования выполнения семантических действий в связи с посещениями правила. Семантическое действие, помоченное меткой 1, выполняется при 1-м посещении правила. Семантические действия делятся на Формулы и операторы.

Формула представляет собой присваивание, в правой части которого стоит выражение, составленное из объектов.

Объектом может бтъ либо атрибут, либо переменная, либо ссылка на нетерминал, либо компонента другого объекта. Если левая часть представляет собой совокупность объектов, заклсченную в ' < >'. то правой частью должно быть либо составное выражение, и тогда осуыествляется последовательное присваивание объектам левой части компонент составного выражения, либо значением типа запись, и тогда объектам левой части последовательно присваиваются значения полей записи верхнего уровня.

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

Если указанием символа служит целое число 1, то имеется в

виду атрибут 1-го символа синтаксического правила, которому сопоставлена Формула, включавшая использование

рассматриваемого атрибута. при нумерации символов слева-направо (0-для символа левой части, 1 - для первого символа правой части и т.п.).

Если указанном символа служит идентификатор, то имеется в виду атрибут ближайшего в дереве разбора предка символа левой части с указанным именем.

Компоненты объекта указываются с помощью обозначения обьокта, за которым слвдует указание, задающее самое компоненту.

Если обозначением обьекта является идентификатор, то это означает. что объект - это либо локальная переменная правила, либо имя нетерминала, либо поле обьекта типа запись (под оператором присоединения).

Если объект имеет вид А@. где А - нетерминал, то это означает указатель на ближайший предок символа левой части данного правила с именем А.

Операторы служат для задания последовательностей семантических действий. Имеются слодуюшие операторы: оператор вызова процедуры. оператор выбора, условный оператор, оператор присоединения, никлы FOR, WHILE. REPEAT. составной оператор.

Планирование семантических действий.

Как уже было сказано, выполнение каждого семантического действия связывается с посещением правила в процессе обхода дерева разбора сверху-вниз слева-направо. Поэтому информация по дереву не может передаваться справа-налево, т.е. в качестве аргумента формулы, вычисляющей значение атрибута 1-го символа (1>0), но может входить атрибут J-ro символа, если J>1.

Выполнение соматического действия, помеченного меткой 1. планируется на 1-е посещение. Поэтому оно на может зависеть от атрибутов к-го символа, если к>1. и. в случае Формулы, не может определять значение атрибута J-ro символа, если J<-1.

Если 1-й символ А синтаксического правила заключен в квадратные метаскобки и некоторое семантическое действие помечено моткой 1Е, то выполнение этого действия планируется на 1-е посещение и тот случай. когда " , . .ушмя. порождаемая А. -будет опушена. Причем порядок выполнения ''спланированных таким образом действий определяется зависимостями атрибутов, задаваемых этими действиями. На зависимости атрибутов действия. помеченного 1Е. накладываются те же ооаничения. что и на действие, помеченное меткой 1. с тем исключением, что аргументами рассматриваемого -действия могут быть еше атрибуты 1-го символа.

Если 1-й символ А синтаксического правила заключен в круглые метаскобки, то семантическое действие, помеченное 1М. выполняется между последовательными разворачиваниями поддеревьев. корнями которых служит А. Такие действия-Формулы вычисляют значения атрибутов символов А при некотором разворачивании поддерева для А в зависимости от значений атрибутов при предыдущем разворачивании. В качество аргументов в этих семантических действиях нельзя использовать атрибуты .1-го символа, если J>i. Семантическое действие. помеченное 1В. выполняется до каждого разворачивания поддерева. корнем которых служит А. Семантическое действие, помеченное 1А, выполняется после каждого разворачивания поддерева, корнем которых служит А.

Рассмотрим теперь планирование непомеченных семантических действий. Форвулы. определяющие значение атрибута 1-го символа, если 1>0. планируется на 1-1 посещение.

Формулы, задающие значения глобальных атрибутов или атрибутов символа левой части синтаксического правила, планируются следующим образом. Среди аргументов Формулы могут быть

1) локальные и глобальные атрибуты, значения которых определяются Формулами данного правила;

2) локальные и глобальные атрибуты, значения которых но

задаются Формулами данного правила."

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

планируется на посошение с номером тах(к,»)).

Непомеченные операторы планируются на последнее посошение правила.

Порядок выполнения независящих друг от друга семантических действий, спланированных на одно и то же посещение.. определяется порядком их написания в семантической части правила.•

Промежуточный язык Лидер.

Основной задачей промежуточного языка Лидер является представление исходной программы в таком виде, чтобы с одной стороны из этого представления легко можно было получать код. а с другой - чтобы это представление было максимально маиинно- независимым. Для того, чтобы решить первую задачу в Лидере во-первых, все операции типизованы (например, целое сложение, сложение множеств и т.д.), а во-вторых, ссылки на все объекты прямые. Чтобы добиться машинной независимости в программе на Лидера но использутся такие машинно-зависимые понятия, как размер переменной, адрес переменной и другие. .Эти требования противоречивы и противоречия разрешаются следующим образом. Для то^о. чтобы в самом языке но вводить адресов и размеров переменных, в нем оставлены все описания. Генератор кодов (транслятор с Лидера в кош конкретной ЭВМ) обрабатывая эти описания, сам определяет адреса и размеры переменных. Для того, чтобы иметь прямые ссылки на объекты, но в то же время не оперировать с этими ссылками как с адресами, используется понятие "номера объекта". В процессе обработки программы на- Лидоро некоторым конструкциям

■" программы (например, типам, переменным и т.п.) приписываются номера, по которым затем делаются ссылки на них. Такой номер может б!лъ абсолютным, номером внутри видимой процедуры заданного уровня и номером относительно текущего значения счетчика. Пои входе в процедуру увеличивается на 1 номер уровня процедуры и утанавливается в 0 счетчик относительных ссылок.

Поскольку предполагается. что программа на Лидере обрабатывается си)-гтаксически управляемым транслятором, в основу записи программы положена префиксная запись. Таким образом программа представляет собой Линеаризованное ЛЕРево.

Реализация контекстных условий.

Формализация описания контекстных условий дается на примере языка Модула-2. обладающего такими характерными для современных языков качествами, как строгая типизация, блочная структура, явное управление видимостью.раздольная компиляция.

Структура среды Модулы-2.

"Корневую" компоненту срсды в Модуле-2 образует ■ программный модуль или модуль реализации. Объекты этой компоненты могут быть описаны в самом модуле или могут быть импортированы из других модулей определений. Существуот предопределенная компонента, объекты которой доступны во всех других компонентах (если они там но пороопродолоны). Элементом описания может быть процедура или локальный модуль, имеющие свой список описаний.

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

• могут быть доступны в процедуре. Объект охватывающей • компоненты может бьггь виден (если внутри данной процедуры не описан объект с тем же именем). Основой описания являются атрибуты Среда, приписанные блокам и имеющие тип ключевое множество записей. Блочная и модульная структура реализованы в терминах атрибутов с динамической видимостью.

В качестве примера рассмотрим правило:

Правило:

Type Des : : - Ment

Семантика: Var Р: {указатель на объект)

P:-BlockGh (указатель на ближайший охватывающий блок) repeat

$0.Exlt:=nnJ<Sl.Val.P(?.Env): (найти объект) 1Г Р@.Kind thai P:-Pred(P):

(если процедура, перейти к охватывающей) until ($0.Exit<>NIL)or(not Р@.К1Ы); {либо нашли объект, либо дошли до границы модуля) 1Г (®3.Extt«tJIL> then $0.Exit:-Find($l.Val.$Proa.Env>; (найти объект в предопределенной компоненте) if ($0.Exit-Nil) then Еггог(тип но найден) else if (10.Exlt@.ObJect<>Тип) then beam Error (объект не тип h S0.Exit:-Nll:

end;

Трансляция" в промежуточное представление.

Трансляция в промежуточное представление (Лидер) рассматривается как преобразование дерева входной программы в дерево в новой атрибутной грамматике. Основой такого преобразования являются средства получения перестановки поддеревьев в рамках L-атрибУтной грамматики.

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

- вычисляться с помощью операторов перехода. Рассмотрим -следующую атрибутную грамматику:

S -> В -> $1.F:-FALS£: $1.T:-TRUE; SI.SIGN:-raise;

I ^

В -> 8 & В -> SI.F:-$0.F: SI.T:-S3.номер: $3.F:-S0.F: S3.T:-S0.T: SI.SIGN:-raise: 53.SIGN: -S0.SIG?t:

S -> В V В -> $1.T:-S0.T: SI. F: -S3.номер;

S3.F:-S0.F: ®3.T:-S0.T:

SI.SIGH:-true; S3.S1GN: -S0.S1O1:

В -> not В -> SI.F:-Ж0.Т: St.T:-S0.F: SI.SIGN:-not S3.SIGN:

В ->■ ! -> 1Г ®3.S1GM

then <1Г Г then GO TO S0.T Diss GO TO S0.F> else <1Г T then GO TO S0.F else GO TO S0.T>:

Теорема.

■ Для всякого набора сходных данных любого, логического выражения в программе, сгенерированной по этой атрибутной грамматике, осуществляется переход по true для истинного выражения и переход по falss для ложного (в обычной интерпретации).

В терминах команд СМ-4 последнее правило выглядит следующим образом:

В -> I -> <TSTB I;

1Г 50.SIGN then BNE Т elss BEQ F>;

Если элементом логического выражения является сравнение.

то генерируется команда, соответствующая знаку сравнения (Ьеа для Ьпе для о, Ьае для >- и т.д.). если атрибут slsn соответствующей вершины имеет значение true. и отрицание (Ьпе для Ьеа для о. bit для >» и т.д.). если атрибут siяп имеет значение false.

Трансляция опера;i:c"¡ нал множествами.

Для рассмотрения реализации операций над множествами введем модель машины, достаточно близкую к системе комад СИ-4. Рассмотрим систему команд, в которой команды имеют вид либо RlxR2->R2 (т.о. оба операнда на регистре и результат во втором из них), либо MxR->R (левый операнд в памяти, правый в регистре, результат в регистре), либо S[l]xR->R (левый операнд в стоке, правый на регистре, результат на регистра. при этом сток сокрашется). либо команда MOV M.R, (загрузить регистр из памяти), либо команда MOV R.SC1] (загрузить стек из регистра, при этом стек увеличивается). Число регистров ограничено МАХ. Следующая атрибутная грамматика реализует бинарные операции в такой системе команд:

S -> Е -> 41.Sptli-raise; SI.Reg:-1:

E -> E op E -> S1.Sp11s-I0.Sp11:

$3.Spl1:-$0.SplI V Sl.A-R; St. Rea:-50. Rea:

S3.Rea:-ir Sl.A-R then S0.í7ea*l elsa S3.Rea: S0.A:-F($1.A.$3.A):

E -> M •> S0.A:-M;

Здесь F - таблица решений.

Теорема.

Приведенная атрибутная грамматика использует минимальное ■число регистров (ели не допускается перестанов1са подвыражений), генерирует самую короткую последовательность

команд, использует память в магазинном режиме и использует минимальное число элемонов магазина.

Трансляция арифметических выражений.

Система команд СМ-Д тоебует пар смежных регистров для выполнения некоторых операций. Пои этом задача оптимального распределения регистров становится NP-полной. Мы рассмотрим приближенное решение задачи за один обход дерева выражения сверху-вниз слева-направо одновременно с генерацией кода.

Система команд СМ-4 позволяет выполнять некоторые операции с верхушкой стека. Поэтому при необходимости освобожде!чия занятых регистров для выполнения операции их можно сбрасывать в сток.

Необходимо отметить. что высокое быстродействие

• современных систем ОЗУ не снимает всех перечисленных выше

• ттроблем. поскольку, как было отмечено, некоторые команды требуют определенных регистров, а сознательно сбрасывать

• промежуточные результаты в память значит сознательно ухудшать качество кода.

В качестве модели машины примем следующую систему команд: SxR->R (стек х регистр -> стек). RtxR2->R2 (регистр х регистр). MxR->R (память х регистр). MOV M.R (загрузить из памяти в регистр). MOV R.S (загрузить из регистра в сток). Некоторые команды требуют обязательно нечетного регистра. В командах типа SxR->R стек сокращается, а командах MOV R.S -увеличивается.

В приводимой ниже атрибутной схеме атрибуты имеют следующий смысл:

REGSET - наследуемый атрибут, дающий шкалу свободных регистров:

EVSP - наследуемый атрибут, указывавший, какой из четных регистров может быть в случае необходимости сброшен: атрибут EVSP помимо значений собственно . регистров может также принимать значение N0. означающее, что такого регистра нет:

ODSP - наследуемый атрибут, указывающей, какой из начетных регистров может быть в случае необходимости сброшен: атрибут ODSP помимо значений собственно регистров может также принимать значение WO. означашвэ, что такого регистра кет;

S -> Е -> $i.Evsp:-NO; $0.DJsp:-NO; $l.Rea_Set:-II..MAX);

E -> M -> 10.А:-И;

€ -> Е op Е -> $l.Oisp:-S0.gdsp; $1 .Evsp: -SÖ.Evsp;

ЖЗ.ОЛэр:-IP $1.А-нечетный.регистр .

U»en SI.A else SQ.Otisp: E3.Evsps-ir $1.А-четный_регистр then SEI.A else $0.Evsp¡ Sl.Rea .Set:-S3.Reg Set; $3.Rea Seti-1Г $1.А-рвгистр then SO.Rea Set else $0.Rea.Sat-[S1.A]: «3. A: -rsi. A. £3. A. $2.op ):

Здесь F таблица решений. учитывавшая требования к регистрам со стороны операции.

Теорема.

Память используется в магазином режиме, т.е. если при входе в. поддерево .было использовано 1 ячеек, то при выходе, если R-Evsp (Odsp). то верхний эпомент имеет' номер 1+1. иначе состояние памяти нэ меняется.

Трансляция операторов.

Рассматриваются вопросы трансляции основных операторов!-вызовов, условных, присоединения,- цикла, переключателей. В связи с этим рассматриваются вопросы организации памяти периода выполнения и различных оптимизаций.

Вопросы оптимизации копа.

Оптимизация - это качественная трансляция. Поэтому когда говорят об оптимизации, имеют в виду способы получения качественного кода ("методы оптимизации"). Как правило такио 'методы делят на машинно-независимые. т.о. такио. которые можно выполнить вне зависимости от системы команд. и маиинно-зависимые, т.е. такие, которые строго зависят от системы команд. В то же время и маиинно-незаписимьо оптимизации и конечном итоге реализуются через машинные команды, так что между ними трудно провести четкую границу.

Рассмотрим с этой точки зрения изложенные в работе методы генерации кола.

Логические выражения.

Вычисление логических выражений с помощью переходов -один из способов оптимизации их вычисления. Предложенные в работе атрибутные методы зависят от системы команд только на "нижнем" уровне при выборе конкретных команд сравнений и переходов, так что самое технику трансляции логических выражений можно считать машинно-независимой.

Операции над множествами и арифметические операции.

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

Вызовы подпрограмм.

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

Операторы цикла и присоединения.

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

Оператор переключатель.

При трансляции оператора-переключателя делается анализ того, какой код короче: вычисление с помомыа сравнений и порохолоа иди прямо по таблице адресов. Таким образом, осуществляется оптимизация длины программы.

Длинные и короткие переходы.

Одной из серьезных проблем при выборе команд - это выбор команды короткого или длинного перехода при трансляции перехода вперед. В рассматриваемом трансляторе этот выбор делается для всех структурных операторов (циклов, условных и т.д.). Всегда длинными переходами реализуются операторы RETURN и EXIT.

Система программирования Молуда-2~Супер.

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

добавлен вые один тип модулой (определений) Фортран-модули для ""обеспечения связи с программами, транслированными в соответствии с соглашениями связей по Фортрану;

- соответственно добавлены ява новых типа данных - FUNCTION и SUBROUTINE. Переменной такого типа может быть присвоена подпрограмма или функция Фортрана;

- ввалена возможность назначения абсолютного адреса глобальной переменной;

- введена возможность инициализации глобальных переменных;

- константы могут быть структурными (массивами и записями);

- имеется русско-язычная версия транслятора;

- введены псевдокомментарии управления трансляцией (см. ниже).

Управление трансляцией осуществляется или

псевлокомменгариями или ключами ' при запуске транслятора. Имеются следующие возможности:

- включать (отключать) подготовку листинга:

- включать (отключать) проверки диапазонов индексов массивов;

- включать (отключать) проверки диапазонов:

- включать (отключать) проверки границ стека;

- генерировать код для системы команд FIS или FPP.

В состав системы программирования входят следуюшио стандартные модули:

- TTI0 - модуль терминального ввода-вывода:

- CRTNS - модуль организации работы с сопрограммами;

- STORAGE - модуль органииии динамической памяти;

- MATHL1B0 - основные математические Функции;

- DMATHLIB0 - основные математические Функции с двойной

- за -

точность«):

- FILECTRL - управление Файлами;

- TEXTFILE - работа с текстовыми Файлами;

- ASCII - константы ASCII-кода.

Характеристики.

Размеры трансляторов для ЭВМ'СМ-4 (1420) следующие: !

- транслятор модулей определений - 81 Кб;

- транслятор программных модулей (модулой реализации) -118 Кб;

- генератор кода - 92 Кб.

Скорость трансляции на ЭВМ СМ-1420 примерно 300. строк в минуту (примерно в два раза быстрее, чем штатный транслятор с Паскаля).

Результаты работы можно резюмировать следующим образом:

1) Проведан анализ мирового опыта разработки и использования систем автоматизации построения трансляторов.

2) Разработан язык системы автоматизации построения трансляторов, в основу которого положены атрибутные грамматики со следующими основными расширениями:

- глобальные? атрибуты:

- структурные атрибуты:

- атрибуты с динамически управляемой видимостью.

Доказаны свойства атрибутных схем с учетом этих расширений.I

3) Показано удобство входного языка Супер для описания трансляции, в'частности:

Формализации контекстных условий языков программирования:'

- создания многопроходных трансляторов:

- генерации кода.

4) На основе этого входного языка реализована система автоматизации построения трансляторов. обеспечивающая реализация высокоэффективных трансляторов (в частности многопроходных на основе составных атрибутных грамматик).

5) Разработаны методы атрибутной трансляции, включавшие:

описание контекстных условий современных языков программирования, в частности с блочной структурой и явным управлением видимостью;

генерация промежуточного • представления на основе технологии использования составных атрибутных грамматик:

генерация' кода, включая логические выражения, арифметические выражения, распределение регистров, вызовы подпрограмм, различные операторы. , Доказана правильность предложенных методов.

6) Разработан промежуточный язык Лидер, ориентированный на синтаксически управляемую трансляцию в составных атрибутных грамматиках.

7) С помоыыо системы Супер реализован транслятор с языка Модула-2, обладающий высокими параметрами. ничем не уступающими трансляторам, написанным вручную.

Основные) результаты опубликованы в следующих работах:

1. Бирюкова. Н.. Курочкин В.М.. Серебряков В. А. Система построения трансляторов, основанная на однородном и универсальном подходе. В кн.: Труды 1-й Весоюзной конференции по технологии программирования. Киев, 1979.

2. Бирюков А.Н.. Курочкин В.М., Серебряков В.А. Вопросы реализации язьков программирования. - Препринт - М., ВЦ АН СССР. 198В. - 12 стр.

3. Серебряков В.А. Основные особенности реализации СПТ Супер. - В кн. Автоматизация производства ППП. Таллинн. 1980.

4. Бирюков А.Н.. Курочкин В.М.. Серебряков В. А. Глобальные атрибуты и их применение пои определении языков программирования. - JCBM и МФ, 1980. п5 - стр. 1284-1293.

5. Бирюков А.Н., Курочкин В.М., Серебряков В.А. Структурные

атрибуты и их реализация в системе построения трансляторов Супер. - Программирование. 1981. п 2 - стр. 52-55.

6. Серебряков В.А. Основные особенности входного языка и реализации СПТ Супер. - Программирование. 1982. n 1.

7. Лихачев В.Н.. Пожиялковский В.В.. Серебряков В.А. - В кн. Вопросы автоматического построения языковых процессоров для специализированных микро-ЭВМ с применением методики синтаксически управляемого перевода. Автоматизация программирования аналого-цифровых и микропроцессорных систем. 1982.

8. Бездушный А.Н.. Серебряков В.А. Определение подмножества '.языка Паскаль средствами обобщенных атрибутных грамматик.

В кн. Автоматизация производства ППП и трансляторов. Таллинн. 1983,

9. Бирюков А Н.. Курочкин В.М., Серебряков В.А. Архитектура • и реализация СПТ Сутр. - В кн. Обработка символьной

■ информации. ВЦ АН СССР. 1984.

' 10. Серебряков В. А. Методы атрибутной трансляции. - В кн.

■ Языки программирования. М.. Наука, 1985 - стр. - 47-78.

'11. Серебряков В.А., Бездушный А.Н. Входной язык системы автоматизации построения трансляторов Супер. - Препринт BU АН СССР. 1986 - 64 стр. .

12. Серебряков В.А. Классы атрибутных грамматик и алгоритмы ■ вычисления атрибутов (обзор). - В Сб. Обработка символьной информации. М., BIJ АН СССР. 1986.

13. Серебряков В. А. Система автоматизации построения трансляторов Супор: состояние, проблемы и перспективы. - В кн. Методы трансляции и конструирования программ. BU СО АН СССР. 1987.

14. Курочкин В.М.. Серебряков В.А. Вопросы разработки и использования атибутных систем построения трансляторов. В кн. Проблемы прикладной математики и информатики. Наука. 1987.

, 15. Надежин ' Д.С.. Серебряков В.А., Ходукин В.М. Промежуточный язык Лидер (предварительное сообщение). - В Сб. Обработка симольной информации. М.. ВЦ АН СССР. 1987.

16. Серебряков В.А. Атрибутная трансляция арифметических выражений. - В кн. Обработка символьной информации, ВЦ АН СССР. 1987.

17. Серебряков В.А. Атрибутная трансляция логических выражений. - Программирование, 1988, n 1.

18. Serebrlakov V.A. Conslructlon оГ Efflctent Multi-Stase Compilers wtth the Attribute TUS. - Compiler Constructlon and. Hlsh Speed Coirpllatlon. Proceeilngs оГ the Workshop. Berlin. Oct. 10-14 1989, pp. 63-74.

19. Вооглайд A.O., Серебряков В. А. Применение систем • автоматизации разработки трансляторов. - В кн. Прикладная информатика. Финансы и статистика. 1989.

20. Серебряков В. А. Применение систем автоматизации разработки трансляторов для разаботки эффективных трансляторов. - В кн. Труды рабочей группы РГ-23 КНВВТ. Таллинн, 1989.

.21. Serebrlakov V.A. Attribute Vlslblllty Control In CUS Super 3nd Implementation of Innport-Export Facllities In Mo<iula-2 Front-End. Inrormatics'89 - Proceedinss of the Soviet- French Symposium. Tallinn. May 29-0une 2. 1989.

22. Серебряков В.А. и др. Система программирования Модула-2-Сутор. Препринт ВЦ АН СССР. 1990 г. 102 стр.

Пимисащ к щчмк TC—OZWi ¿4.1 30 /•> Пет, л. 2. ¿i_Тираж JQQ Заказ 40

Типографии ЛЭИ, Крак'ноказзрмеиная, 13.