Программирование >>  Структурное программирование 

1 ... 278 279 280 [ 281 ] 282 283 284 ... 342


Номер строки 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%.

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



+2098

{загрузка)

+3097

{сложение)

+2196

{сохранение)

+2096

{загрузка)

+2198

{сохранение)

Рис. 15.27. Неоптимизированный фрагмент кода программы, приведенной на рис. 15.25

Программа на ЯП

Ячейка и команда ЯМП

Описание

5 rem сумма от 1 до х

Оператор rem игнорируется

10 input X

+1099

Читать X в ячейку 99

15 rem проверка у == х

Оператор rem игнорируется

20 if у == X goto 60

+2098

Загрузить у (98) в аккумулятор

+3199

Вычесть X (99) из аккумулятора

+4211

Передать управление при нуле в ячейку 11

25 rem увеличение у

Оператор rem игнорируется

30 let у = у + 1

+2098

Загрузить у в аккумулятор

+3097

Сложить 1 (97) с аккумулятором

+2198

Сохранить аккумулятор в у (98)

35 rem сложение у и t

Оператор rem игнорируется

40 let t = t + у

+2096

Загрузить t (96) в аккумулятор

+-3098

Сложить у (98) с аккумулятором

Ч-2196

Сохранить аккумулятор в t (96)

45 rem цикл по у

Оператор rem игнорируется

50 goto 20

+4001

Передать управления ячейке 01

55 rem вывод результата

Оператор rem игнорируется

60 print t

+1196

Вывести t (96) на экран

99 end

+4300

Завершение программы

Рис. 15.28. Оптимизированный код программы, приведенной на рис. 15.25

15.29. (Модификации компилятора ЯП) Выполните указанные ниже модификации компилятора ЯП. Некоторые из этих модификаций могут также потребовать внести изменения в моделирующую программу Простотрона, написанную в упражнении 5.19.

a) Разрешите использовать в операторах let операцию вычисление остатка (%). Необходимо модифицировать также моделирующую программу Простотрона, чтобы включить в нее инструкцию вычисления остатка.

b) Разрешите использовать в операторах let операцию возведения в степень, применяя для нее символ Необходимо модифицировать также моделирующую программу Простотрона, чтобы включить в нее инструкцию возведения в степень.



1 ... 278 279 280 [ 281 ] 282 283 284 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика