Материал: Разработка элементов учебной системы программирования

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Разработка элементов учебной системы программирования


Разработка элементов учебной системы программирования


1. Разработка макета учебной системы программирования

Построение компилятора с языка высокого уровня (ЯВУ), являющегося одним из элементов системы программирования, образующих в совокупности следующий технологический конвейер:


При этом предполагается то, что данная система программирования работает на технологической ЭВМ (IBM PC) и является по существу кросс-системой для объектной ЭВМ (ЕС ЭВМ). В этой системе:

·        в качестве языка высокого уровня (ЯВУ) выбран язык, образованный из подмножества языковых конструкций ПЛ1, а исходная программа готовится в виде текстового файла технологической ЭВМ с расширением *.pli;

·        язык АССЕМБЛЕРА сформирован из языковых конструкций АССЕМБЛЕРА ЕС ЭВМ, а ассемблеровский эквивалент исходной программы формируется в виде текстового файла технологической ЭВМ с расширением *.ass;

·        объектный эквивалент исходной программы готовится в формате объектных файлов операционной системы ОС ЕС ЭВМ и хранится в виде двоичного файла технологической ЭВМ с расширением *.tex;

·        загрузочный эквивалент исходной программы представляет собой машинный код ЕС ЭВМ, запоминаемый в области ОЗУ технологической ЭВМ, являющейся зоной загрузки для эмулятора объектной ЭВМ.

Постановка задачи

Необходимо выполнить доработку элементов макета учебной системы программирования до уровня, позволяющего обрабатывать “новые” для макета конструкции языка высокого уровня, примененные в соответствующем варианте:


Где на входе имеется текст программы на ЯВУ PL/I:

EX04:         PROC OPTIONS ( MAIN );   A       DECIMAL FIXED INIT ( 2 );          B         DECIMAL FIXED;       P       POINTER; D       DECIMAL FIXED BASED ( P );= ADDR ( A );= D;EX04;

На выходе строится эквивалент программы на ассемблере архитектуры IBM 370:

EX04START 0 RBASE,0*,RBASE RRAB,A RRAB,P,D ,0(0,RRAB)B(3),0(RRAB)15,14PL3'2C'PL3APEQU 155EX04

Анализ поставленной задачи

В поставленной задаче на входе в компилятор ЯВУ представлена программа на языке PL/I, которая выполняет присваивание одной десятичной переменной другой через указатель. Для этого были введены новые лексемы, отсутствовавшие в исходном макете:

·        DECIMAL - десятичные переменные с инициализацией и без

·        POINTER - переменная указатель

·        BASED-переменные - переменная, базирующаяся на данных, на которые ссылается указатель, указанный при инициализации

·        Оператор ADDR - получение адреса переменной

·        Оператор присваивания ‘=’ - присваивание значения одной десятичной переменной другой

Набор новых конструкций языка PL/I

Соответствующий набор конструкций был добавлен в компилятор ЯВУ.

1.      Форматы объявления переменных

1.1    Целые десятичные переменные:

Формат: DCL <IPE> DECIMAL FIXED; или DCL <IPE> DECIMAL FIXED INIT ( <NUM> );

·        <IPE> - имя переменной

·        <NUM> - значение при инициализации, напр. ‘234’

·        Могут быть как инициализированными, так и не инициализированными

Указатели

Формат: DCL <IPE> POINTER;

·        <IPE> - имя переменнойпеременные:

Формат: DCL <IPE> DECIMAL FIXED BASED ( <IPE_POI> );

·        <IPE> - имя переменной

·        <IPE_POI> - имя переменной - указателя

2.      Форматы использования операторов

2.1    Оператор присваивания:

Формат: <IPE1> = <IPE2>

·        предназначен для назначения нового значения переменной, идентификатор которой использован в левой части оператора;

2.2    Оператор ADDR:

Формат: <IPE> = ADDR ( <IPE2> );

·        предназначен для получения адреса переменной, указанной в качестве операнда в скобках. Переменная <IPE> должна иметь тип POINTER;

Входные ограничения компилятора ЯВУ

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

·        не описано, каким образом работать с целые десятичными переменными, а именно:

o   не указан знак числа,

o   не указана длина мантиссы.

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

·        отсутствуют арифметические операции

По этому, для определенности, были введены следующие ограничения на языковые конструкции компилятора ЯВУ:

·        Ограничения на целые десятичные переменные:

o   имеют тип ‘P’ в ассемблеровском эквиваленте программы;

o   определяются как без знаковые, т.е. всегда положительные;

o   имеют длину 3 байта (мантисса равна 5 (одна тетрада на знак)), т.е. это числа от 0 до 99999;

o   не инициализированные десятичные переменные на ЯВУ инициализируются нулем в ассемблеровском эквиваленте программы.

·        BASED-переменные:

o   только целые десятичные

o   не имеют свое представление в памяти программы, для этого они объявляются через оператор EQU ассемблера ЕС ЭВМ.

·        Оператор присваивания кодируется в 6 байтовую команду типа SS (Storage - Storage) языка Ассемблера. Это означает, что присваивание работает без использования вспомогательных регистров.

·        Указатели объявляются как тип ‘A’ в ассемблеровском эквиваленте программы, имеют размер 4 байта (длину адреса в ЕС ЭВМ).

Описание разработанного синтаксиса языка

Синтаксис существующего макета был расширен следующими правилами:

·        добавлено правило декларирования десятичных переменных с инициализацией и без

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

·        добавлено правило получения адреса существующей переменной

·        добавлено правило работы оператора присваивания

Таким образом, грамматика языка имеет следующий вид:

1. <PRO> ::= <OPR><TEL><OEN>

. <OPR> ::= <IPR>:PROC_OPTIONS(MAIN);

. <IPR> ::= <IDE>

. <IDE> ::= <BUK> | <IDE><BUK> | <IDE><CIF>

. <BUK> ::= A | B | C | D | E | M | P | X

. <CIF> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

. <TEL> ::= <ODC> | <TEL><ODC> | <TEL><OPA>

. <ODC> ::= DCL_<IPE>_BIN_FIXED(<RZR>); |_<IPE>_BIN_FIXED(<RZR>)INIT(<LIT>); |_<IPE>_DECIMAL_FIXED_INIT(<RZR>); |_<IPE>_DECIMAL_FIXED; |_<IPE>_POINTER; |_<IPE>_DECIMAL_FIXED_BASED(<IPE>);

. <IPE> ::= <IDE>

. <RZR> ::= <CIF> | <RZR><CIF>

. <LIT> ::= <MAN>B

. <MAN> ::= 1 | <MAN>0 | <MAN>1

. <OPA> ::= <IPE>=ADDR(<IPE>); |

<IPE>=<AVI>;

. <AVI> ::= <LIT> | <IPE> | <AVI><ZNK><LIT> |

<AVI><ZNK><IPE>

. <ZNK> ::= + | -

. <OEN> ::= END_<IPR>

Рис. 1 Распознавание грамматических правил в формате продукций

Преобразования в код ассемблера ЕС ЭВМ

Следуя введенным ограничениям, получаем следующий ассемблеровский эквивалент на выходе компилятора ЯВУ:

.        Переменные:

.1.     Целые десятичные переменные объявляются как тип PL3’X’ через команду DC, где Х - значение при инициализации. ‘P’ - стандартный тип десятичных переменных в ассемблере IBM 370. Литера ‘L’ означает длину числа в байтах, которая соответствует 3 байтам - фиксированное значение, оговоренное в ограничениях к компилятору ЯВУ.

.2.     Указатели объявляются как тип A через команду DS. Команда DS ассемблера IBM 370 выделяет память на 4 байта не инициализированных данных, т.к. указатели не могут быть иницилизированы, а длина 4 байта соответствует длине адреса архитектуры IBM 370.

1.3.   BASED-переменные объявляются через псевдокоманду EQU:

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

.        Операторы:

.1.     Оператор присваивания кодируется в 6ти-байтовую SS команду MVN, имеющую формат:

MVN D1(L, B1), D2(B2)

где:

·        D1 и D2 - смещение относительно базового адреса, содержащегося в регистре общего назначения;

·        B1, B2 - регистры РОН, содержащие адрес данных;

·        L - длина операндов в байтах

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

.2.     Оператор ADDR кодируется в две 4ех-байтовые RX команды: LA и ST, т.к. в ассемблере IBM 370 отсутствует команда, которая бы копировала адрес переменной в соответствующее место памяти. Эти команды имеют одинаковый формат:

LA R1, D2(X2, B2)R1, D2(X2, B2)

где:

·        R1- регистр РОН;

·        D2 - смещение относительно базового адреса, содержащегося в регистре общего назначения;

·        X2 -регистр РОН, используемый в качестве индекса;

·        B2 - регистр РОН, содержащие адрес данных;

Команда LA загружает адрес переменной, указанной в качестве второго операнда в первый операнд - регистр. А команда ST заносит значение первого операнда - регистра во второй операнд - переменную. Таким образом сначала считывается адрес переменной из памяти в регистр, а затем это значение заносится в переменную-указатель.

.3.     Оператор присваивания - ‘=’. Переменные, расположенные по правую сторону от оператора кодируются в зависимости от типа:

.3.1.  Для BASED-переменных кодирование происходит в два этапа: 1) Загрузка значения указателя в регистр с помощью уже имеющейся в исходном макете команды L; 2) Загрузка значения переменной, расположенной по полученному адресу с помощью той же команды L.

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

Модификация базы данных исходного макета

В таблицу продукций (SINT) были добавлены разработанные синтаксические правила для переменных и операторов. Размер таблицы увеличился с 201 до 263 элементов. Матрица смежности, при этом, не модифицировалась.

Были введены дополнительные типы в семантику языка:

·        для переменных, описывающих десятичные числа, был введен тип ‘D’

·        для переменных, описывающих указатели - тип ‘A’

·        для переменных типа BASED - тип ‘V’

Модификация алгоритма исходного макета

Функция декларирования переменных - ODC1 была модифицирована в соответствии с новыми типами переменных.

При попадании арифметическим оператором на указатель на втором проходе в функции OPA2, проверяется, является ли следующий за оператором присваивания оператор ADDR, и, если да, то формируется код комманд LA и ST.

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

В функции AVI2 (на втором проходе) при определении типа переменной - BASED, формируются две ассемблерные команды L: первая загружает значение переменной-указателя в регистр RRAB, вторая загружает значение десятичной переменной, расположенной по адресу, загруженному предыдущей командой L в регистр RRAB.

Если же в функции AVI2 встречается десятичная переменная, то формируется команда L, которая загружает значение переменной в регистр RRAB.

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

Плюсы данной реализации:

·        Использование встроенных функций ассемблера для работы с числами и адресами;

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

·        Не используется память для BASED-переменных;

Минусы данной реализации:

·        Только беззнаковые десятичные числа;

·        Фиксированная мантиса десятичных чисел;

·        Отсутствие арифметических операций над десятичными числами;

·        Выходой файл совместим только с ассемблером ЭВМ IBM 370;

2. Разработка компилятора ассемблера

Получение практических навыков построения компилятора с языка высокого уровня (ЯВУ), являющегося одним из элементов системы программирования, образующих в совокупности следующий технологический конвейер:


При этом предполагается то, что данная система программирования работает на технологической ЭВМ (IBM PC) и является по существу кросс-системой для объектной ЭВМ (ЕС ЭВМ). В этой системе:

·        в качестве языка высокого уровня (ЯВУ) выбран язык, образованный из подмножества языковых конструкций ПЛ1, а исходная программа готовится в виде текстового файла технологической ЭВМ с расширением *.pli;

·        язык АССЕМБЛЕРА сформирован из языковых конструкций АССЕМБЛЕРА ЕС ЭВМ, а ассемблеровский эквивалент исходной программы формируется в виде текстового файла технологической ЭВМ с расширением *.ass;

·        объектный эквивалент исходной программы готовится в формате объектных файлов операционной системы ОС ЕС ЭВМ и хранится в виде двоичного файла технологической ЭВМ с расширением *.tex;

·        загрузочный эквивалент исходной программы представляет собой машинный код ЕС ЭВМ, запоминаемый в области ОЗУ технологической ЭВМ, являющейся зоной загрузки для эмулятора объектной ЭВМ.

Постановка задачи

Необходимо выполнить доработку элементов макета учебной системы программирования до уровня, позволяющего обрабатывать “новые” для макета конструкции языка высокого уровня, примененные в соответствующем варианте:


Где на входе имеется исходный код программы на ассемблере ЭВМ IBM 370:

EX04START 0RBASE,0*,RBASERRAB,ARRAB,P,D,0(0,RRAB)B(3),0(RRAB)15,14PL3'2C'PL3APEQU 155EX04

На выходе эквивалент исходной программы в виде байт-кода для IBM 370:

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

02 45 53 44 40 40 40 40 40 40 00 10 40 40 00 01 ESD@@@@@@ @@

45 58 30 34 40 40 40 40 00 00 00 00 40 00 00 28 EX04@@@@ @ (

40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

40 40 40 40 40 40 40 40 45 58 30 34 40 40 40 40 @@@@@@@@EX04@@@@

02 54 58 54 40 00 00 00 40 40 00 02 40 40 00 01 TXT@ @@ @@

05 F0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 ð@@@@@@@@@@@@@@

00000070 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

40 40 40 40 40 40 40 40 45 58 30 34 40 40 40 40 @@@@@@@@EX04@@@@

A0 02 54 58 54 40 00 00 02 40 40 00 04 40 40 00 01 TXT@ @@ @@

B0 41 50 F0 1A 40 40 40 40 40 40 40 40 40 40 40 40 APð @@@@@@@@@@@@