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

 















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


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


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



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

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

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

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

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

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

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



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


EX04:PROC OPTIONS ( MAIN );ADECIMAL FIXED INIT ( 2 );BDECIMAL FIXED;PPOINTER;DDECIMAL 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.Целые десятичные переменные объявляются как тип PL3X через команду 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ð @@@@@@@@@@@@

C0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

D0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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

F0 02 54 58 54 40 00 00 06 40 40 00 04 40 40 00 01 TXT@ @@ @@

50 50 F0 22 40 40 40 40 40 40 40 40 40 40 40 40 PPð"@@@@@@@@@@@@

00000110 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 0A 40 40 00 04 40 40 00 01 TXT@ @@ @@

58 50 F0 22 40 40 40 40 40 40 40 40 40 40 40 40 XPð"@@@@@@@@@@@@

00000160 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 0E 40 40 00 04 40 40 00 01 TXT@ @@ @@

A0 58 50 50 00 40 40 40 40 40 40 40 40 40 40 40 40 XPP @@@@@@@@@@@@

B0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

C0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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

E0 02 54 58 54 40 00 00 12 40 40 00 06 40 40 00 01 TXT@ @@ @@

F0 D1 03 F0 1E 50 00 40 40 40 40 40 40 40 40 40 40 Ñ ð P @@@@@@@@@@

00000200 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 18 40 40 00 02 40 40 00 01 TXT@ @@ @@

07 FE 40 40 50 00 40 40 40 40 40 40 40 40 40 40 þ@@P @@@@@@@@@@

00000250 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 1C 40 40 00 04 40 40 00 01 TXT@ @@ @@

00 00 00 2C 50 00 40 40 40 40 40 40 40 40 40 40,P @@@@@@@@@@

A0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

B0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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

D0 02 54 58 54 40 00 00 20 40 40 00 04 40 40 00 01 TXT@ @@ @@

E0 00 00 00 0C 50 00 40 40 40 40 40 40 40 40 40 40P @@@@@@@@@@

F0 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 24 40 40 00 04 40 40 00 01 TXT@ $@@ @@

00 00 00 00 50 00 40 40 40 40 40 40 40 40 40 40P @@@@@@@@@@

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 45 4E 44 40 40 40 40 40 40 40 40 40 40 40 40 END@@@@@@@@@@@@

00000380 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 @@@@@@@@@@@@@@@@

A0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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


. Загрузчик, Эмулятор, Отладчик


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

В поставленной задаче появились новые команды ассемблера, отсутствующие в исходном макете компилятора. Это следующие команды: LA, MVN, DC PL3X, DS PL3, DS A, EQU.

Форматы команд

3.Команда LA. Загружает адрес переменной в регистр. Имеет следующий формат:


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


где:

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

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

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

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

·Первый операнд - адресат, второй - источник;

Длина команды составляет 4 байта. Тип команды - RX.

.Команда MVN. Производит копирование числа из одного адреса памяти в другой. Эта команда имеет следующий формат:


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


где:

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

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

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

Команда типа SS, имеет длину 6 байт.

Формат декларирования переменных

4.1.Команда DC с операндом PL3X используется для объявления и инициализации целых десятичных переменных, где Х - значение при инициализации. P - стандартный тип десятичных переменных в ассемблере IBM 370. Литера L означает длину числа в байтах, которая соответствует 3 байтам - фиксированное значение, оговоренное в ограничениях к компилятору ЯВУ.

.2.Команда DS с операндом PL3 используется для объявления целых десятичных переменных. P - стандартный тип десятичных переменных в ассемблере IBM 370. Литера L означает длину числа в байтах, которая соответствует 3 байтам - фиксированное значение, оговоренное в ограничениях к компилятору ЯВУ.

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

.4.Команда EQU, где правый операнд - это существующая переменная, используется для подстановки правого операнда вместо левого.

Ограничение компилятора ассемблера

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

·Поддержка только 3ех-байтовых переменных типа P;

·Команда EQU не может принимать в качестве правого операнда выражения;

·Поддержка только вышеописанных команд и псевдокоманд;

Преобразование команд в байт код

Рассмотрим формат байт-кода новых команд.

.Команда LA:

·имеет размер 4 байта

·тип RX

·формат:



где

·0x41 - код команды

·R1 содержит номер регистра РОН, в который будет записан результат работы команды

·X2 содержит номер регистра РОН, использующегося в качестве индекса

·B2 содержит номер регистра РОН, использующегося для хранения адреса в памяти, содержащего данные

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

.Команда MVN:

·имеет размер 6 байт

·тип SS (Storage- Storage)

·формат:



где:

·0xD1 - код команды

·B1, B2 содержат номер регистра РОН, использующегося для хранения адреса в памяти, содержащего данные первого и второго операндов соответственно

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

.Псевдокоманда DC с параметром PL3:

·Объявляет и инициализирует целую десятичную переменную, длинной 3 байта

.Псевдокоманда DS с параметром PL3:

·Объявляет целую десятичную переменную, длинной 3 байта

.Псевдокоманда DS с параметром A:

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

.Псевдокоманда EQU с параметром - именем переменной:

·Ассоциирует метку с указанным параметром. Используется для объявления BASED-переменных

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

В таблицу машинных операций (TMOP) были добавлены команды LA и MVN.

Добавлена структура буфера 6ти-байтовых команд.

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

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

В функцию FDC были внесены изменения, позволяющие обрабатывать объявление десятичных переменных типа P, а в функцию FDS - позволяющие обрабатывать объявления переменных типа A.

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

Подпрограмма формирования TXT карты теперь поддерживает 6ти-байтовые команды.

Добавлены функции FSS и SSS для обработки шестибайтовых команд.

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

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

·Возможность использования псевдокоманды EQU для подстановки любого слова вместо имени переменной;

·Выравнивание данных по размеру адреса;

·Поддержка 6ти-байтовых команд;

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

·Поддержка только 3ех-байтовых переменных типа P;

·Команда EQU не может принимать в качестве правого операнда выражения;

·Поддержка только вышеописанных команд и псевдокоманд;

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


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

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

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

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

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

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

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


Где на входе исходный текст программы в виде байт-кода ЭВМ 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ð @@@@@@@@@@@@

000000C0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

D0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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

F0 02 54 58 54 40 00 00 06 40 40 00 04 40 40 00 01 TXT@ @@ @@

50 50 F0 22 40 40 40 40 40 40 40 40 40 40 40 40 PPð"@@@@@@@@@@@@

00000110 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 0A 40 40 00 04 40 40 00 01 TXT@ @@ @@

58 50 F0 22 40 40 40 40 40 40 40 40 40 40 40 40 XPð"@@@@@@@@@@@@

00000160 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 0E 40 40 00 04 40 40 00 01 TXT@ @@ @@

A0 58 50 50 00 40 40 40 40 40 40 40 40 40 40 40 40 XPP @@@@@@@@@@@@

B0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

C0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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

E0 02 54 58 54 40 00 00 12 40 40 00 06 40 40 00 01 TXT@ @@ @@

F0 D1 03 F0 1E 50 00 40 40 40 40 40 40 40 40 40 40 Ñ ð P @@@@@@@@@@

00000200 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 18 40 40 00 02 40 40 00 01 TXT@ @@ @@

07 FE 40 40 50 00 40 40 40 40 40 40 40 40 40 40 þ@@P @@@@@@@@@@

00000250 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 1C 40 40 00 04 40 40 00 01 TXT@ @@ @@

00 00 00 2C 50 00 40 40 40 40 40 40 40 40 40 40,P @@@@@@@@@@

A0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

B0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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

D0 02 54 58 54 40 00 00 20 40 40 00 04 40 40 00 01 TXT@ @@ @@

E0 00 00 00 0C 50 00 40 40 40 40 40 40 40 40 40 40P @@@@@@@@@@

F0 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 24 40 40 00 04 40 40 00 01 TXT@ $@@ @@

00 00 00 00 50 00 40 40 40 40 40 40 40 40 40 40P @@@@@@@@@@

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 45 4E 44 40 40 40 40 40 40 40 40 40 40 40 40 END@@@@@@@@@@@@

00000380 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 @@@@@@@@@@@@@@@@

A0 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@

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


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


Рис. 2 Вывод загрузчика

компилятор программирование ассемблер


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

Во входном файле появились две новые команды, неизвестные для загрузчика, это команды LA с кодом 0x41 и MVN с кодом 0xD1. Рассмотрим формат байт-кода этих команд:

.Команда LA:

·имеет размер 4 байта

·тип RX

·формат:



где

·0x41 - код команды

·R1 содержит номер регистра РОН, в который будет записан результат работы команды

·X2 содержит номер регистра РОН, использующегося в качестве индекса

·B2 содержит номер регистра РОН, использующегося для хранения адреса в памяти, содержащего данные

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

.Команда MVN:

·имеет размер 6 байт

·тип SS (Storage- Storage)

·формат:



где:

·0xD1 - код команды

·B1, B2 содержат номер регистра РОН, использующегося для хранения адреса в памяти, содержащего данные первого и второго операндов соответственно

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

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

Ограничения

·Эмулятор команды MVN поддерживает данные длиной только 3 байта;

·Ограничения касаются загрузки TXT-карт. Поддерживается загрузка только одной команды на карте. Т.е. на TXT-карте может быть только одна команда длиной 2, 4 или 6 байт;

·Загрузчик может загружать только одну программу;

·Поддерживаются программы максимальной длиной в 50 карт;

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

В таблицу машинных операций (TMOP) были добавлены новые команды LA и MVN.

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

В эмулятор добавлены программы реализации семантики команд LA и MVN.

В загрузчик добавлены функции загрузки 6ти-байтовых команд по аналогии обработки 2ух и 4ех-байтовых команд.

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

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

·Поддержка новых команд: LA и MVN;

·Загрузчик поддерживает 6ти-байтовые команды;

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

·Эмулятор для команды MVN поддерживает данные длиной только 3 байта;

·Поддерживается загрузка только одной команды на TXT-карте;

·Загрузчик может загружать только одну программу;

·Поддерживаются программы максимальной длиной в 50 карт;


4. Компилятор с языка высокого уровня с использованием Flex и Bison


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



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

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

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

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

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

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

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



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


EX04:PROC OPTIONS ( MAIN );ADECIMAL FIXED INIT ( 2 );BDECIMAL FIXED;PPOINTER;DDECIMAL FIXED BASED ( P );= ADDR ( A );= D;EX04;


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


ex04START 0Programm startRBASE,0Base initialization*,RBASEBase declarationRRAB,A Load addressRRAB,P Store address,D Variable value loading,0(0,RRAB) Load by addressB(3),0(RRAB) Move numveric15,RVIXReturn from programmEQU 5143PL3'2C'Variable declaration with initialization PL3 Variable declaration without initializationAVariable declaration without initializationPProgramm end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.2Указатели:

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

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

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

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

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

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

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

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

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

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

4.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>


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


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

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

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

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

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

5.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, описанной ранее.

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

В исходный код для flex был добавлен разбор новых лексем BASED, DECIMAL, ADDR и POINTER. Эти же лексемы добавлены в набор токенов для bison.

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

Разработанные синтаксические правила были добавлены в набор правил для bison.

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

Добавлена функция poi, которая обрабатывает лексему ADDR. Эта функция генерирует две ассемблерные команды - LA и ST.

Функция opa модифицирована для того, чтобы оператор присвоения заменялся на ассемблерную функцию MVN, если операндом является десятичное число.

В функцию avi_ipe добавлена возможность подстановки вместо слова, объявленного псевдокомандой EQU, имени переменной.

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

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

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

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

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

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

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

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

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

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

Основные преимущества Flex и Bison над первой реализацией компилятора ЯВУ:

·отсутствие таблицы проекций

·отсутствие стека целей и достижений

·отсутствие матрицы смежности и генерации матрицы связности

·отсутствие 2ух проходов при разборе программы

·обработка программы последовательно сразу лексическим и грамматическим анализатором, а не поэтапно - сначала лексическим, затем синтаксическим и потом семантическим

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


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

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ