Книга: Системное программное обеспечение. Лабораторный практикум
Выводы по проделанной работе
Выводы по проделанной работе
В результате выполнения курсовой работы для заданного входного языка построен компилятор, порождающий результирующий код на языке ассемблера для процессоров типа Intel 80386 и более поздних модификаций. Компилятор может работать с командной строкой, а при ее отсутствии предоставляет пользователю графический интерфейс, позволяющий указать входной файл и условия работы компилятора.
Построенный компилятор обнаруживает все синтаксические ошибки языка, а также семантические ошибки:
• присваивание значений константам (когда первый операнд в операторе присваивания – константа);
• присваивание значений предопределенной входной переменной InpVar;
• использование предопределенной переменной Result.
При наличии одной ошибки любого типа информация о ней с указанием позиции ошибки во входном файле заносится в файл информации об ошибках, а при наличии графического интерфейса пользователю выдается сообщение с позиционированием указателя к местоположению ошибки. При наличии нескольких ошибок обнаруживается только первая из них, и дальнейший анализ исходного текста прекращается.
Построенный компилятор также выполняет оптимизацию результирующей программы следующими методами:
• свертка объектного кода;
• исключение лишних операций;
• исключение бесполезных арифметических и логических операций;
• модификация операций загрузки значения в регистр с учетом особенностей процессоров типа Intel 80x86.
Это позволяет сократить объем результирующего ассемблерного кода и время выполнения объектного кода, который может быть построен на его основе.
Компилятор выполняет обработку исходной программы за шесть проходов:
1. Лексический анализ исходного текста и построение таблицы лексем.
2. Синтаксический анализ по таблице лексем и построение дерева синтаксического разбора.
3. Построение списка триад по дереву синтаксического разбора.
4. Оптимизация списка триад методом свертки объектного кода.
5. Оптимизация списка триад методом исключения лишних операций.
6. Построение результирующего ассемблерного кода по списку триад.
На каждом проходе компилятора исходными данными являются результаты, полученные при выполнении предыдущего прохода.
Количество проходов построенного компилятора может быть сокращено, поскольку все операции выполняются последовательно и не требуют обращений к данным, отличным от данных, полученных на предыдущем проходе. Однако построенный компилятор как нельзя лучше подходит для целей иллюстрации последовательности обработки исходной программы на различных этапах компиляции, когда каждому этапу компиляции соответствует один или несколько проходов.
Построенный компилятор выполняет генерацию объектного кода для логических операций и для операций сравнения как для линейных операций, логические выражения всегда вычисляются полностью – это позволяет оптимизировать логические выражения как линейные участки программы, но не вполне соответствует правилам, принятым в промышленных компиляторах. Кроме того, в построенном компиляторе использованы далеко не все возможности оптимизации объектного кода, ориентированного на язык ассемблера процессоров типа Intel 80x86.
В целом можно заключить, что компилятор, построенный в примере выполнения курсовой работы, хорошо иллюстрирует технику и методы, лежащие в основе построения компиляторов, но из-за этого имеет меньшую эффективность обработки исходных программ. На учебных входных программах это никак не отражается, поскольку время их компиляции слишком мало, чтобы заметить такие недостатки.
- Задание для примера выполнения работы
- Грамматика входного языка
- Описание выбранного способа организации таблицы идентификаторов
- Описание лексического анализатора
- Описание синтаксического анализатора
- Внутреннее представление программы и генерация кода
- Описание используемого метода оптимизации
- Текст программы компилятора
- Выводы по проделанной работе