Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Интересное:
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Дисциплины:
2020-04-01 | 261 |
5.00
из
|
Заказать работу |
|
|
5. ГЕНЕРАЦИЯ КОДА
Генерация объектного кода - это перевод компилятором внутреннего представления исходной программы в цепочку символов выходного языка.
Генерация объектного кода порождает результирующую объектную программу на языке ассемблера или непосредственно на машинном языке (в машинных кодах). Внутреннее представление программы может иметь любую структуру в зависимости от реализации компилятора, в то время как результирующая программа всегда представляет собой линейную последовательность команд. Поэтому генерация объектного кода (объектной программы) в любом случае должна выполнять действия, связанные с преобразованием сложных синтаксических структур в линейные цепочки.
Генерацию кода можно считать функцией, определенной на синтаксическом дереве, построенном в результате синтаксического анализа, и на информации, содержащейся в таблице идентификаторов. Поэтому генерация объектного кода выполняется после того, как выполнены синтаксический анализ программы и все необходимые действия по подготовке к генерации кода: распределено адресное пространство под функции и переменные, проверено соответствие имен и типов переменных, констант и функций в синтаксических конструкциях исходной программы.
Характер отображения входной программы в последовательность команд, выполняемую генерацией, зависит от входного языка, архитектуры вычислительной системы, на которую ориентирована результирующая программа, а также от качества желаемого объектного кода.
5.1 Общие принципы генерации кода
Задача генератора кода - построение для программы <javascript://> на входном языке эквивалентной машинной программы. Обычно в качестве входа для генератора кода служит некоторое промежуточное представление программы.
|
Генерация кода включает <javascript://> ряд специфических, относительно независимых подзадач: распределение памяти (в частности, распределение регистров), выбор команд, генерацию объектного (или загрузочного) модуля. Конечно, независимость этих подзадач относительна: например, при выборе команд нельзя не учитывать схему распределения памяти, и, наоборот, схема распределения памяти (регистров, в частности) ведет к генерации той или иной последовательности команд. Однако удобно и практично эти задачи все же разделять, обращая при этом внимание на их взаимодействие.
В какой-то мере схема генератора кода зависит от формы промежуточного представления. Ясно, что генерация кода из дерева отличается от генерации кода из троек, а генерация кода из префиксной записи <javascript://> отличается от генерации кода из ориентированного графа. В то же время все генераторы кода имеют много общего, и основные применяемые алгоритмы отличаются, как правило <javascript://>, только в деталях, связанных с используемым промежуточным представлением.
5.2 Основные методы оптимизации
Задача оптимизации кода состоит в создании эффективного (с точки зрения размера памяти и времени выполнения) целевого кода. Желаемая степень оптимизации будет зависеть от обстоятельств. Иногда она не нужна, например, если у программы малое время выполнения, умеренные запросы к памяти и, возможно, малый срок жизни.
Необходимость оптимизации может требоваться для программ с большим временем выполнения либо значительными запросами к памяти и, возможно, с длительным временем существования. Стоимость оптимизации главным образом оценивается в терминах времени компиляции. Некоторые виды оптимизации могут быть дорогостоящими в смысле времени компиляции, другие - сравнительно дешевыми. Обычно более дешевые типы оптимизации всегда стоит осуществлять, а более дорогие - не всегда.
|
Некоторые компиляторы, в зависимости от требуемой степени оптимизации, могут работать в более чем одном режиме.
В средах, где основной является качественная диагностическая информация, лучше всего полностью отказаться от оптимизации, чтобы избежать возможной путаницы вследствие некорректных сообщений.
6. ОПИСАНИЕ ПРОГРАММЫ
#include "stdafx.h"
//Подключаем необходимые заголовочные файлы
#include <iostream>
#include <string>
#include <conio.h>
///////////////////
#include "states.h" //функции переходов автомата
#include "common.h" //вспомогательные функции
///////////////////
//по умолчанию используем пространство имен "std"namespace std;
//таким образом делаем переменные видимыми в разных модулях
//extern lexem* idtable[MAXHASH]; //таблица идентификаторовlexem** idtable = NULL;//таблица идентификаторовlexem* lexTableHead = NULL; //указатель на начало (начальный елемент) таблицы лексемlexem* lexTableEnd = NULL; //указатель на конец (последний елемент) таблицы лексем
int row = 0;col = 0;
//"главная" функция_tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Russian"); //данная строчка необходима для корректного отображения кириллицы
header(); //выводим "шапку"
string fileName = "c:/test.txt";
//задаем имя файла
//cout << "Введите путь и имя файла \n";
//cin >> fileName;
//считаем содерживое файла (текст программы) в строку
string programText = readFile(fileName);();lexem = ""; //переменная для хранения имени лексемыcurrState = sBEGIN; //текущее состояние автомата
//текс программы разберем посимвольно в цикле
for(unsigned int i = 0; i < programText.length(); i++){c = toupper(programText[i]); //текущий символ(c == '\n')
{++;= 0;
}(currState){sBEGIN:.clear();= beginState(c,lexem);;
/////////////////////////////////////////sIF1:= if1State(c,lexem);;
/////////////////////////////////////////sIF2:= if2State(c,lexem);;
/////////////////////////////////////////sELSE1:= else1State(c,lexem);;
/////////////////////////////////////////sELSE2:= else2State(c,lexem);;
/////////////////////////////////////////sELSE3:= else3State(c,lexem);;
/////////////////////////////////////////sELSE4:= else4State(c,lexem);;
/////////////////////////////////////////sFOR1:= for1State(c,lexem);;
/////////////////////////////////////////sFOR2:= for2State(c,lexem);;
/////////////////////////////////////////sFOR3:= for3State(c,lexem);;
/////////////////////////////////////////sDO1:= do1State(c,lexem);;
/////////////////////////////////////////sDO2:= do2State(c,lexem);;
/////////////////////////////////////////sPROG1:= prog1State(c,lexem);;
/////////////////////////////////////////sPROG2:= prog2State(c,lexem);;
/////////////////////////////////////////sPROG3:= prog3State(c,lexem);;
/////////////////////////////////////////sPROG4:= prog4State(c,lexem);;
/////////////////////////////////////////sEND1:= end1State(c,lexem);;
/////////////////////////////////////////sEND2:= end2State(c,lexem);;
/////////////////////////////////////////sSYMBOL1:= "\'";= symbol1State(c,lexem);;
|
/////////////////////////////////////////sSYMBOL2:= symbol2State(c,lexem);;
/////////////////////////////////////////sSYMBOL3:= symbol3State(c,lexem);;
/////////////////////////////////////////sASSIGN1:= ":";= assign1State(c,lexem);;
/////////////////////////////////////////sASSIGN2:= "";= assign2State(c,lexem);;
/////////////////////////////////////////sCOMMENT1:= "";= comment1State(c,lexem);;
/////////////////////////////////////////sCOMMENT2:= comment2State(c,lexem);;
/////////////////////////////////////////sIDENT:= idState(c,lexem);;sNUMBER:
/////////////////////////////////////////= numberState(c,lexem);;
}+= c;++;
}
//сохраняем таблицы();();
//освободим ресурсы (удалим содержимое таблиц)();();<< endl << L"Для завершения программы нажмите любую клавишу...";
_getch();//"задержка"0;
}
ЗАКЛЮЧЕНИЕ
В результате выполнения курсовой работы для заданного входного языка были построены отдельные части компилятора.
В первой части работы был разработан программа, которая получает на входе набор идентификаторов, организует таблицу идентификаторов методом упорядоченного списка, позволяет осуществить многократный поиск идентификатора в этой таблице.
Во второй части работы была написана программа, которая выполняет лексический анализ входного текста и порождает таблицу лексем с указанием их типов и значений.
Третья часть курсовой работы была посвящена разработке программы, которая порождает таблицу лексем и выполняет синтаксический разбор текста с построением дерева разбора.
Отдельные части компилятора, разработанные в данной курсовой работе, дают представление о технике и методах, лежащих в основе построения компиляторов.
СПИСОК ЛИТЕРАТУРЫ
1. Гордеев А.В. Молчанов Л.Ю. Системное программное обеспечение, - СПб.: Питер. 2002. - 734с.
2. Кампапиец Р.II. Манькоп Е.В., Филатов Н.Е. Системное программирование. Основы построения трансляторов: Учеб. пособие для высших и средних учебных заведений. - СПб.: КОРОНА Принт, 2000. -256 с.
. Гордеев А.В. Операционные системы: Учебник для вузов.
2-е изд.-СПб.: Питер, 2004. - 416 с.
. Олифер В.Г., Олифер Н.А. Сетевые операционные системы. - СПб.: Питер. 2002. - 544 с.
5. Брайан Оверленд C++ без страха,- СПб.: Питер. 2005. - 432с.
. Марченко А.Л. C++ Бархатный путь,- СПб.: Питер. 2005. - 401с.
|
|
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!