0 – оптимизация не выполняется (флаг выключен), любой другой символ, следующий за символом S, воспринимается как 0;
• 0 – имя результирующего файла, непосредственно за символом должно идти имя файла и путь к нему (если путь не указан, считается, что файл будет находиться в текущем каталоге, откуда запущен компилятор);
• Е – имя файла с ошибками, непосредственно за символом должно идти имя файла и путь к нему (если путь не указан, считается, что файл будет находиться в текущем каталоге, откуда запущен компилятор).
Если какой-то из ключей не указан, то компилятор принимает значение ключа по умолчанию. Для флагов установлены следующие значения по умолчанию:
• флаг оптимизации команд ассемблера – включен;
• флаг свертки объектного кода – включен;
• флаг исключения лишних операций – включен.
Имя файла результирующей программы по умолчанию считается совпадающим с именем входного файла, но с расширением. asm. Имя файла с ошибками компиляции по умолчанию также считается совпадающим с именем входного файла, но с расширением. err. Путь к этим файлам по умолчанию устанавливается таким же, как и к входному файлу (первый параметр командной строки).
Анализ параметров командной строки запуска компилятора реализован в функции ProcessParams (модуль FormLab4, листинг П3.14 в приложении 3).
Например, командная строка:
cursov.exe myfile.txt
запустит на выполнение компилятор (cursov. ехе) для обработки файла myfi 1 е. txt. При успешной компиляции результирующая программа будет записана в файл myfi 1 е. asm, а ошибки, если они будут обнаружены, – в файл myfile.err. При этом компилятор будет выполнять все виды оптимизации (оптимизацию методом свертки объектного кода, оптимизацию методом исключения лишних операций и оптимизацию результирующего ассемблерного кода), поскольку ни один ключ не указан и все флаги будут установлены по умолчанию.
Командная строка:
cursov.exe infile.txt – Ooutfile.asm – Eerrfile.txt – A0 – S0
запустит на выполнение компилятор (cursov.exe) для обработки файла infile.txt. При успешной компиляции результирующая программа будет записана в файл outfile.asm, а ошибки, если они будут обнаружены, – в файл errfile.txt. При этом компилятор будет выполнять только оптимизацию методом свертки объектного кода, поскольку два ключа (-АО и – SO) отключают два других метода оптимизации.
Информацию в файл ошибок компилятор всегда дописывает в конец файла, и только если такого файла нет, он создается заново. Дата и командная строка запуска компилятора всегда записываются в файл ошибок. Поэтому в том случае, когда компиляция выполнена успешно, в файл ошибок помещаются только две строки – командная строка и время запуска компилятора. В остальных случаях там будет присутствовать и информация об ошибке (построенный компилятор умеет обнаруживать только одну ошибку – ту, которая первой встретится ему в исходном тексте входной программы).
Файл с результирующей программой всегда создается заново. Если такой файл уже существовал в момент запуска компилятора, то он будет уничтожен.
Для иллюстрации работы созданного компилятора взяты два примера входной программы:
1. Программа, вычисляющая факториал числа.
2. Программа, на примере которой можно иллюстрировать работу оптимизирующих алгоритмов.
Оба примера приведены в приложении 4.
Первый пример вычисляет факториал входной величины, причем если величина отрицательная или превышает 31, то программа возвращает 0. Умножение реализовано через цикл операций сложения. Входной файл приведен в листинге П4.1, а полученный результирующий файл – в листинге П4.2, приложение 4.
Второй пример содержит почти бессмысленную программу, которая всегда возвращает значение, равное 0, но на примере этой программы можно хорошо проиллюстрировать работу оптимизирующих алгоритмов. Входной файл приведен в листинге П4.3, в листинге П4.4 приведен результирующий файл, полученный без применения оптимизации, а в листинге П4.5 – файл, полученный с применением оптимизации. Желающие могут сравнить ассемблерный код этих двух файлов и проверить эффективность используемых алгоритмов оптимизации.[12]
Выводы по проделанной работе
В результате выполнения курсовой работы для заданного входного языка построен компилятор, порождающий результирующий код на языке ассемблера для процессоров типа Intel 80386 и более поздних модификаций. Компилятор может работать с командной строкой, а при ее отсутствии предоставляет пользователю графический интерфейс, позволяющий указать входной файл и условия работы компилятора.
Построенный компилятор обнаруживает все синтаксические ошибки языка, а также семантические ошибки:
• присваивание значений константам (когда первый операнд в операторе присваивания – константа);
• присваивание значений предопределенной входной переменной InpVar;
• использование предопределенной переменной Result.