|
Программирование >> Структурное программирование
Номер строки 55 помещается в таблицу символических имен как тип L и связывается с ячейкой ЯМП 15. Обрабатывается оператор печати 60 print t Номер строки 60 помещается в таблицу символических имен как тип L и связывается с ячейкой ЯМП 15. Аналогом команды print в ЯМП является операция с кодом 11 {write). Ячейка, где хранится t, определяется из таблицы символических имен и добавляется к результату, полученному после того, как код операции умножили на 100. Оператор 99 end является последней строкой программы. Номер строки 99 заносится в таблицу символических имен как тип L и связывается с ячейкой ЯМП 16. Команда end приводит к генерации инструкции ЯМП -1-4300 (43 - это код команды halt в ЯМП), которая записывается как последняя команда в массив ЯМП. На этом первый проход компилятора завершен. Теперь рассмотри второй проход. В массиве flags осуществляется поиск значений, отличных от -1. В ячейке 03 хранится 60, поэтому компилятор знает, что инструкция 03 не завершена. Компилятор завершает формирование этой инструкции, осуществляя поиск в таблице символических имен номера строки 60, определяя соответствующую ей ячейку памяти ЯМП и складывая этот адрес с незавершенной инструкцией. В данном случае в процессе поиска определяется, что номер строки 60 соответствует ячейке ЯМП 15, так что завершенная инструкция 03 -1-4215 заменяет инструкцию 03 -(-4200. Теперь компиляция программы на ЯП успешна завершена. Для построения компилятора, вы должны выполнить следующее: a) Модифицируйте моделирующую программу Простотрона, написанную вами в упражнении 5.19, чтобы она брала входные данные из файла, указанного пользователем (см. главу 14). Моделирующая программа должна выводить полученные результаты в файл на диске в том же самом формате, что и при выводе на экран. Преобразуйте моделирующую программу так, чтобы она была объектно-ориентированной. В частности, сделайте объектами все внешние устройства Создайте иерархию классов типов инструкций, используя механизм наследования. Затем введите в программу полиморфизм, обращаясь к каждому объекту-инструкции с вызовом ех-ecutelnstruction, по которому должны выполняться действия соответствующей инструкции языка ЯМП. b) Модифицируйте алгоритм преобразования инфиксной записи в постфиксную (упражнение 15.12) для обработки многоразрядных целых операндов и операндов имен переменных, состоящих из одного символа. Совет. Для разбиения выражения на лексемы и выделения из него констант и переменных может быть использована функция strtok из стандартной библиотеки; константы могут быть преобразованы из строк в целые числа с помощью функции atoi из стандартной библиотеки. (Замечание: представление данных в постфиксном выражении должно быть изменено так, чтобы поддерживались имена переменных и целые константы). c) Модифицируйте алгоритм вычисления постфиксного выражения для обработки многоразрядных целых операндов и операндов имен переменных. В алгоритме должны быть также выполнены обсуждавшиеся выше изменения, сводящиеся к тому, что вместо выполнения выражения должны генерироваться соответствующие инструкции ЯМП. Совет: для разбиения выражения на лексемы и выделения из него констант и переменных может быть использована функция strtok из стандартной библиотеки; константы могут быть преобразованы из строк в целые числа с помощью функции atoi из стандартной библиотеки. (Замечание: представление данных в постфиксном выражении должно быть изменено, чтобы поддерживать имена переменных и целые константы). d) Постройте компилятор. Объедините части (Ь) и (с) для обработки выражений в операторах let. В вашу программу надо включить функцию, которая выполняет первый проход компилятора, и функцию, выполняющую второй проход. Обе функции для выполнения своих задач могут вызывать другие функции. Создавайте, по возможности, ваш компилятор объектно-ориентированным. 15.28. (Оптимизация компилятора ЯП) При компиляции программы и ее преобразования в коды ЯМП генерируется набор инструкций. Определенные комбинации инструкций часто повторяются, обычно тройками, которые можно назвать правилами вывода - продукциями. Продукция обычно состоит из трех инструкций: load, add и store. Например, на рис. 15.27 показаны пять инструкций ЯМП, которые были сгенерированы при компиляции программы, приведенной на рис. 15.25. Первые три инструкции являются продукцией, которая добавляет 1 к у. Заметим, что инструкции 06 и 07 сохраняют значение аккумулятора во временной ячейке 96, а затем загружают это значение обратно в аккумулятор, чтобы инструкция 08 могла сохранить его в ячейке 98. Часто продукция завершается инструкцией загрузки значения в ту же самую ячейку, в которой оно ранее хранилось. Этот код может быть оптимизирован путем исключения команды сохранения и последующей команды загрузки, которые оперируют с одной и той же ячейкой; это позволит Простотрону быстрее выполнять программу. На рис. 15.28 показан опимизированный код ЯМП для программы, приведенной на рис. 15.25. Отметим, что в оптимизированном коде на четыре инструкции меньше, что снижает объем требуемой памяти на 25%. Модифицируйте компилятор таким образом, чтобы он оптимизировал генерируемый им код ЯМП. Вручную сравните неоптими-зированный код с оптимизированным и определите, на сколько снизился объем требуемой памяти.
Рис. 15.27. Неоптимизированный фрагмент кода программы, приведенной на рис. 15.25
Рис. 15.28. Оптимизированный код программы, приведенной на рис. 15.25 15.29. (Модификации компилятора ЯП) Выполните указанные ниже модификации компилятора ЯП. Некоторые из этих модификаций могут также потребовать внести изменения в моделирующую программу Простотрона, написанную в упражнении 5.19. a) Разрешите использовать в операторах let операцию вычисление остатка (%). Необходимо модифицировать также моделирующую программу Простотрона, чтобы включить в нее инструкцию вычисления остатка. b) Разрешите использовать в операторах let операцию возведения в степень, применяя для нее символ Необходимо модифицировать также моделирующую программу Простотрона, чтобы включить в нее инструкцию возведения в степень.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |