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

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

Автореферат диссертации по теме "Язык Модула-90К и его реализация"

Вычислительный Центр Российской Академии Наук

на- правах рукописи

Лютый Виктор Григорьевич

ЯЗЫК МОДУЛА-90К И ЕГО РЕАЛИЗАЦИЯ

05.13.11 - математическое и программное обеспечение вычислительных машин, комплексов, систем и сетей.

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

Москва - 1993.

Работа выполнена в Вычислительном центре РАН. Научный руководитель: доктор физ.-матем. наук.

В.А.Серебряков

Официальные оппоненты: доктор физ.-матем.наук,

профессор В.Л.Арлазаров

кандидат технич. наук, В.Ф.Хорошевский

Ведущая организация:

Институт проблем кибернетики РАН.

Защита состоится

часов на заседании специализированного совета К002.32.01 при Вычислительном центре РАН по адресу: 117967, Москва, ул.Вавилова, 40.

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

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

Ученый секретарь

специализированного совета К002.32.0 доктор физ.-матем.наук

ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ

Актуальность темы исследований. Любйй универсальный язык программирования предоставляет мощные средства по обработке данных в оперативной памяти. Однако средства общения с внешней памятью в универсальных языках развиты очень слабо. В системах управления базами данных (СУБД), наоборот, имеются развитые средства обмена с внешней памятью, но языки обработки данных, как правило, реализованы не очень эффективно и являются достаточно бедными по своим возможностям. Поэтому очень часто информационные системы строятся по следующей схеме: программы збработки информации пишутся на каком-нибудь универсальном =гзыке, а обмен данными реализуется с помощью средств СУБД.

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

Одним из наиболее продвинутых в этом направлении был про-кт языка Модула~90, разработанного в 1990 году во ВНИИСИ под уководством В.Л.Арлазарова и являющегося расширением хорошо звестного языка программирования Модула-2.

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

- модификация языка с целью повышения надежности создаваемых программ и увеличения срока жизни программного обеспечения. Для этих целей в язык были включены средства обработки исключительных ситуаций и объектно-ориентированного программирования . Новый язык был назван Модула-90К

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

- реализация транслятора для языка.

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

Теоретическая и практическая значимость работы. Система программирования Модула-90К позволит существенно увеличить производительность труда программистов при создании и поддержке баз данных. Результаты диссертации могут быть использованы также при построении новых языков программирования и при написании компиляторов для них.

Апробация работы. Основные положения настоящей работы были представлены на 5-ой советско-французской конференции "Informatika-91" (Гренобль, 1991), на 2-ой международной конференции по Модуле-2 "Modula-2 and beyond", (UK, 1991), на научных семинарах ВЦ РАН. Был реализован компилятор с языка Мо-дула-90К, основанный на алгоритмах, изложенных в этой работе.

Публикации. По результатам выполненных исследований опубликовано 9 печатных работ.

Структура и объем диссертации. Работа состоит из введения, трех глав, заключения и списка литературы. Общий объем работы - 122 страницы, в том числе 5 рисунков. Библиография включает 38 наименований.

СОДЕРЖАНИЕ РАБОТЫ

Во введении описана поставленная задача и содержание работы по главам.

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

В разделе 1.1 рассматриваются подходы к построению объектно-ориентированных версий универсальных языков программирования. В разделе 1.1.1 даются определения и терминология, связанные с основными понятиями объектно-ориентированного программирования. В разделе 1.2.1 показаны объектно-ориентированные расширения, использованные в•универсальных языках программирования £.(С++), Pascal (Turbo-Pascal) и Модула-2 (Modula-3). На основе анализа языков программирования делается вывод о том, что мощность языковых конструкций для написания объектно-ориентированных программ, предоставляемых всеми анализируемыми языками, кроме С++, примерно эквивалентна.• Язык С++ предоставляет дополнительные возможности, такие, как множественное наследование , различные права доступа к полям класса и так далее. Эти дополнительные возможности требуют дополнительных затрат как при компиляции, так и, во многих случаях, при работе программы.

В разделе 1.2 рассматриваются различные модели обработки исключительных ситуаций, используемых в современных языках программирования. Это модель обработки исключительных ситуаций с завершением (Ада, С++, Модула-3), модель обработки исключительных ситуаций с возвратом (РЬ/1) и общий механизм обработки исключительных ситуаций. Общий механизм обладает существенно большей гибкостью, чем два первых механизма, позволяет программировать исключительные ситуации по схеме с завершением и по схеме с возвратами, а т^кже позволяет создавать различные комбинации этих моделей.

В разделе 1.3 рассматриваются основные принципы, лежащие в основе современных языков программирования баз данных. Это следующие принципы:

- свойство хранимости не зависит от типа данного;

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

- динамическая привязка хранимых данных.

На примере различных языков программирования баз данных рассматриваются способы поддержания этих свойств или ограничения применимости языка, если какое-то свойство не поддерживается. Язык Е (являющийся расширением языка С++ для программирования баз данных) ке поддерживает ортогональности типа переменной и хранимости: Для каждого элементарного типа имеется его хранимый двойник, а для каждого структурного типа имеется аналогичный конструктор хранимых типов (при этом все элементы такого конструктора должны быть ' составлены из хранимых типов). Однако, при проектировании сложной программной системы невозможно знать изначально, какие типы данных должны быть хранимыми. Это основное замечание, предъявляемое к языку Е со стороны его пользователей. В языке

БВРЬ (это еще ■ один вариант расширения Модулы-2 для программирования баз данных) не выполняется принцип динамической привязки хранимых данных программы к базе данных. В результате область применения такого языка сильно сужается. Например, на нем нельзя написать универсальную программу распечатки содержимого любой базы данных. На примере этого же языка показан вариант введения в язык конструктора потенциально бесконечных однородных • структур данных. В ОВРЬ для этой цели используются отношения. В обзоре дается набор операторов, операций, встроенных функций, которые должен поддерживать язык для эффективной работы с таким типом данных. Модула-90К поддерживает все приведенные принципы. Здесь же обсуждается еще один принцип, который был положен в основу языка Модула-90К. Это возможность динамически работать с типами переменных программы. Показано, что выполнение этого принципа не противоречит предыдущим, а дополняет их. Это свойство существенно расширяет область применимости языка без снижения его эффективности.

В разделе 1.4 рассматривается язык Модула-2, его достоинства и недостатки, а также различные подходы к построению новых языков на основе языка Модула-2. Это языки программирования баз данных (ОВРЬ) и языки для построения больших встроенных систем (Модула-2+ и Модула-3). Все эти языки предоставляют существенно менее мощные средства, чем те, которые были заложены в Модулу-90К.

Глава 2 содержит краткое описание языка Модула-90К.

В Модулу-90К введены минимальные синтаксические и семантические расширения, позволяющие создавать объектно ориентированные программы. В Модулу-90К введен тип класс, который может содержать не более одного непосредственного суперкласса. Особые правила совместимости введены для указателей на классы

(соответствующие стилю объектно-ориентированного программирования) . В описании процедур Модулы-2 ключевое слово PROCEDURE может быть заменено на новое ключевое слово METHOD, а имя такой процедуры должно записываться как Имя_класса.имя_метода. Такие описания могут быть использованы для описания методов класса. Других синтаксических изменений в язык не вводится, а семантика некоторых операций несколько расширена (например, вызов процедурной переменной). Эти минимальные расширения по своей мощности эквивалентны мощности объектно-ориентированных расширений всех рассматриваемых в обзоре языков программирования, за исключением С++.

В Модуле-90К был выбран общий механизм обработки исключительных ситуаций. Этот механизм позволяет устанавливать некоторый код в качестве обработчика исключительных ситуаций по схеме, аналогичной языкам с обработкой исключительных ситуаций по модели, с завершением. Исключительные ситуации могут передавать в обработчик исключительной ситуации дополнительную информацию через набор параметров. При обработке исключительной ситуации может использоваться оператор RESUME, который вернет программу в точку после вызова RAISE - оператора возбуждения исключительной ситуации. Схема обработки исключительных ситуаций Модулы-90К имеет одну существенную особенность: она должна функционировать в двуязычной среде: Модула-90К и Си. Язык Мо-дула-90К предоставляет развитые средства для интерфейса с модулями, написанными на Си, так как можно утверждать, что это один из основных языков системного программирования, и, кроме того, существенная часть стандартных библиотек Модулы-90К, особенно связанных с поддержкой хранимости, реализована на языке Си. В определение языка входит описание набора функций, позволяющих на модулях, написанных на Си, выполнять обработку исключительных ситуаций, возбуждать ситуации, устанавливать

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

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

- динамическая работа с типами данных;

- поддержка динамики памяти;

- поддержка самой хранимости.

В Модуле-90К имеется некоторый встроенный тип DATATYPE, в терминах которого можно описать любой тип Модулы-90К. Компилятор может порождать описатели типов как по желанию программиста (имеются специальные операторы), так и по умолчанию для поддержания некоторых свойств языка (в частности, хранимости и привязки к базам данных). Например, если формальный параметр процедуры типа DYNAMIC, то фактический может быть любого типа. В процедуру будут переданы адрес описателя типа фактического параметра и адрес самого фактического параметра. В языке введены различные операторы, позволяющие выполнять манипулирование описателями, интерпретировать данные согласно их описателям и т.д.

В Модуле-90К имеется несколько типов, которые могут динамически изменять свой размер и/или адрес отдельных компонент (отдельные компоненты могут оказаться даже в базе данных). Та-

кие типы данных называются нефиксированными. Гибкие (динамические) массивы могут иметь различное число элементов при работе программы. Элементы ключевых массивов могут иметь не подряд идущие индексы. Элементы таких массивов могут возникать по мере необходимости (то есть при записи в несуществующий элемент такой элемент будет создан). У записей с отделенными компонентами некоторые поля могут располагаться не в теле записи. В записи находится указатель на отделенную компоненту, а компонента будет создана только при необходимости записать в нее значение. Для программиста такие записи практически ничем не отличаются от обычных, только для отделенных компонент перед именем поля ставится квалификатор VAR. Такие записи позволяют хорошо моделировать такие объекты, как анкета, в которой довольно частым ответом является ответ "нет". Встроенный тип DYNAMIC является записью с двумя отделенными компонентами: значением некоторой переменной и описателем ее типа. Создание и удаление таких объектов в динамической памяти может идти только под контролем компилятора. Поэтому в язык введены функции CREATE, DELETE и EXIST, которые позволяют, соответственно, создать объект в динамической памяти, удалить его и проверить, существует ли он.

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

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

Глава 3 описывает алгоритмы реализации для всех трех групп рассматриваемых расширений.

Раздел 3.1 описывает средства, использованные для написания компилятора Модула-2-СУПЕР, структуру его основных таблиц и структуру промежуточного представления. Компилятор Модула-90К был создан яд. базе этого компилятора. Основным средством написания первого прохода явилась система автоматизированного построения трансляторов САПТ СУПЕР, основанная на формализме L-атрибутных грамматик. Первый проход в качестве результата генерирует промежуточную программу на языке ЛИДЕР. Изложение последующих алгоритмов, лежащих в основе реализации расширений, основывается на понятиях языка ЛИДЕР и L-атрибутных грамматик.

Раздел 3.2 описывает алгоритмы реализации исключительных ситуаций для микропроцессора Intel 8086. С каждым обработчиком исключительной ситуации связывается некоторый буфер. При установке обработчика в этот буфер заносится информация (состояние регистров), позволяющая передать управление обработчику при возникновении исключительной ситуации. При возбуждении исключительной ситуации в этот же буфер заносится информация о точке , в которой был вызван оператор RAISE для возможного возврата по оператору RESUME. Основное требование к архитектуре машины и генерируемому компилятором коду следующее. Стек программы должен адресоваться двумя регистрами: один регистр смотрит на вершину стека (SP), а относительно второго регистра (BP) осуществляется адресация локальных переменных и формальных параметров. В тексте программы не должно быть явных и неявных адресаций относительно верип'ш; стека. В системе команд

Intel 8086 имеются команды PUSH и POP, которые неявно используют регистр SP. Для таких команд должно выполняться следующее условие. Будем считать команды PUSH и POP парой согласованных скобок, процедуры установки и снятия обработчика тоже парой согласованных скобок. Тогда такие скобки должны быть вложенными друг в друга, чтобы работал предлагаемый механизм обработки исключительных ситуаций (Модула-90К, Microsoft С, Turbo С, Borland С удовлетворяют.этому условию). В конце этого раздела описываются возможные вариант^ реализации механизма обработки исключительных ситуаций для машин, в которых адресация в сте;. ? происходит относительно только вершины стека.

Раздел 3.3 описывает поддержку расширений для программирования баз данных.

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

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

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

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

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

Поддержание работы с переменными нефиксированных типов требует от компилятора выполн" 'ия следующих требований:

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

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

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

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

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

Операция инициализации и операция присваивания свои собственные для каждого типа. В компиляторе Модулы-90К имеются универ-

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

В Модуле-90К в блоке операторов, соответствующих процедуре или модулю, появились скрытые от пользователя пролог и эпилог блока. Блок состоит из следующих частей:

1 выполнение инициализации импортированных модулей

2 пролог блока

3 основное тело блока

4 эпилог блока

Часть 1 выполняется только для модулей. Основное тело блока -это набор операторов, которые написал пользователь. Перед завершением блока обязательно выполняются действия, записанные в эпилоге блока. Эпилог блока, как и его пролог, могут оказаться пустыми. Модула-90К в прологе блока выполняет инициализации переменных, настройку классов, копирование параметров, передаваемых по значению, регистрацию некоторой информации в исполняющей системе Модулы-90К и, если эпилог не пуст, устанавливает ловушку для исключительных ситуаций. Эпилог в Модуле-90К используется для удаления отделенных компонент нефиксированных переменных, относящихся к блоку. Из кучи будут удалены все переменные, время жизни которых закончилось. В Модуле-90К гарантируется, что эпилог будет выполнен всегда, даже при возникновении исключительной ситуации.

Исполняющая система Модулы-90К, которая в этой работе рассматривается как некоторый черный ящик с известными входами и выходами, но неизвестной структурой, обеспечивает многие функции для работы с динамической памятью. Во-первых, это выделение и возврат динамической памяти. Во-вторых, исполняющая система поддерживает несколько куч в динамической памяти, которые в Модуле-90К называются классами памяти. Различные подсистемы в программе на Модуле-90К получают доступ к различным классам памяти. Такой подход позволяет исполняющей системе, с одной стороны, применять в различных классах памяти различные стратегии, повышающие эффективность системы в целом, и, с другой стороны, система становится более защищенной. Компилятор должен обеспечить правильное обращение к соответствующим классам памяти для отделенных компонент нефиксированных типов. Класс памяти переменной, описанной в программе, зависит от типа переменной, от места определения переменной (локальная или глобальная). Однако для формальных параметров невозможно статически определить класс памяти. Класс памяти любой отделенной компоненты можно вычислить по адресу этой компоненты. Если компонента отсутствует, то указатель на эту компоненту равен NIL. В Модуле-90К на IBM/PC имеется целый спектр значений адресов, которые считаются NIL адресами. В этих адресах всегда "зашит" класс памяти переменной. Используется тот факт, что один и тот же адрес можно представить в памяти машины несколькими способами в виде сегмент:смещение. NIL адрес равен 0:0 или удовлетворяют равенству (запись на языке Си) (се-гмент*16+смещение) & 0xffffff = 0. При этом сегментная часть должна содержать в старшем байте 0xff. 'Задача компилятора -обеспечить правильную инициализацию всех указателей и в любом месте, где вырабатывается значение адреса, выполнить его "нормализацию", чтобы адрес случайно не получил значение NIL.

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

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

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

ОСНОВНЫЕ РЕЗУЛЬТАТЫ ДИССЕРТАЦИИ

1. Разработан новый язык программирования баз данных Модула-90К, включающий средства написания объектно-

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

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

3. Реализован первый проход компилятора языка программирования Модула-90К.

ПО ТЕМЕ ДИССЕРТАЦИИ ОПУБЛИКОВАНЫ СЛЕДУЮЩИЕ РАБОТЫ:

1.А.Н.Бездушный, В.Г.Лютый, В.А.Серебряков, "Разработка компиляторов в системе СУПЕР", ВЦ АН СССР, Москва, 1991, стр.102.

2.В.Г.Лютый, "Некоторые вопросы реализации компилятора Модула-2", в трудах конференции "Язык Модула-2, его реализация и использование", под ред. И.В.Поттосина, стр.37-44, ВЦ СО АН СССР, Новосибирск, 1989.

3.В.Г.Лютый, В.М.Ходукин, "Объектно-ориентированное расширения языка Модула-2", Программирование, N6, 1990г., стр.89-96.

4.В.Г.Лютый, "Ь-атрибутная реализация объектно-ориентированных расширений языка Модула-2", в сб. "Автоматизация программирования", ВЦ АН СССР, Москва, 1991, стр. 5-17.

5.В. Г. Лютый, Е.Я. Гаврилов, Н.А.Иванова, М.Е. Иофинова-, Ю.В. Леонтьев, А.Б. Мерков, М.Л. Паклин, А.К. Ходатаев, "Система программирования баз данных Модула-90К", Москва, ВЦ РАН, 1993, стр.104, в печати.

6.В.А.Серебряков, В.Б.Аксенов, А.Н.Бездушный, А.Н.Бирюков, В.С.Елисеев, О.А.Лукьянова, . В.Г.Лютый, В.М.Ходукин, "Система программирования Модула-2-СУПЕР", ВЦ АН СССР, Москва, 1989, стр.104.

7.Lioutyj,V., Serebriakov.V., "Some Aspects of the Implementation of the Modula-2 Front-End with the CWS SUPER", proceedings Bilaterial Workshop on Compiler Construction, University of Twente, Enshede, the Netherlands, 1990, pp.95-107.

8.Lioutyi,V.G., Merkov.A.B., Dolgopiatova.E., Iofinova.M.E., Ivanova.N.A. , Leontyev.Y.V., "The implementation of the data base programming language Modula-90", Informatika-91, pp.171-184, 1991, Grenoble.

9.Lioutyj,V.G., Hodataev.A.K., "Retargetable Modula-2 Compiler", Second International Modula-2 conference "Modula-2 and beyond", Loughborough Univercity of Technology UK, 1991.

В.Г.Лютый ЯЗЫК МОДУЛА-90К И ЕГО РЕАЛИЗАЦИЯ

Подписано в печать 06.07.1993.

Формат бумаги 60X84 1/16

Тираж 100 экз. Заказ 53. Бесплатно.

Отпечатано на ротапринте в ВЦ РАН. 117333, .Москва, ул.Вавилова, 40