Книга: Системное программное обеспечение. Лабораторный практикум

Сноски из книги

· #1

Молчанов А. Ю. Системное программное обеспечение: Учебник для вузов. – СПб.: Питер, 2003. – 396 с.

· #2

Программные модули, реализующие таблицы символов, построены таким образом, что в зависимости от условий компиляции они могут либо различать, либо не различать прописные и строчные буквы. Условие компиляции реализовано через макрокоманды компилятора Delphi 5 в функции Upper в модуле TblElem (листинг П3.1, приложение 3). О принципах, на основе которых выполняются макрокоманды и условная компиляция, можно подробно узнать в [7, 13, 23, 25, 28, 32].

· #3

В отличие от обычных деревьев, корень у синтаксического дерева вывода находится вверху, а листья – внизу.

· #4

Из цепочки (и дерева) вывода удаляются цепные правила, которые все равно не несут никакой полезной семантической (смысловой) нагрузки, а потому для компилятора являются бесполезными. Это положительное свойство распознавателя.

· #5

Существуют три формы записи выражений – префиксная, инфиксная и постфиксная. При префиксной записи операция записывается перед своими операндами, при инфиксной – между операндами, а при постфиксной – после операндов. Общепринятая запись арифметических выражений является примером инфиксной записи. Запись математических функций и функций в языках программирования является префиксной (другие примеры префиксной записи – команды ассемблера и триады в том виде, как они рассмотрены далее). Постфиксная запись в повседневной жизни встречается редко. С нею сталкиваются разве что пользователи стековых калькуляторов и программисты на языке Forth.

· #6

Обычно такое сравнение выполняют для специальных тестовых программ, для которых код на языке ассемблера уже заранее известен. Полученные результаты распространяют на все множество входных программ, поэтому их можно считать очень усредненными.

· #7

Даже если принять во внимание, что время на выполнение операции будет потрачено компилятором при порождении результирующей программы, то все равно мы имеем выигрыш во времени. Во-первых, любая результирующая программа создается (а значит и компилируется окончательно) только один раз, а выполняется многократно; во-вторых, оптимизируемый линейный участок может входить в состав оператора цикла или вызова функции, и тогда выигрыш очевиден.

· #8

Детально алгоритм порождения ассемблерного кода на основе последовательности триад рассмотрен в примере курсовой работы.

· #9

Создатели реальных компиляторов, конечно же, лишены первого из предлагаемых вариантов – синтаксис входного языка для них строго определен и не может меняться, поэтому они вынуждены искать преобразования грамматик.

· #10

Эта же проблема всегда возникает при порождении кода для условных операторов и операторов цикла – желающие могут посмотреть в листинге П3.12 в приложении 3, как она решается на практике.

· #11

На самом деле эту проблему можно было бы оставить без внимания, поскольку ассемблерный код порождается для системы программирования Delphi 5, которая сама умеет обрабатывать такие ситуации. Но в примере выполнения работы целенаправленно обращается внимание на эту проблему, чтобы проиллюстрировать, какие ситуации могут возникать при порождении результирующего кода для различных целевых вычислительных систем.

· #12

Поскольку входной файл легко преобразовать в файл на языке Object Pascal, то ради сравнения оптимизирующих алгоритмов построенного компилятора с промышленным компилятором можно воспользоваться, например, системой программирования Delphi (любой версии) и построить с ее помощью ассемблерный код для этого входного файла (для просмотра ассемблерного кода удобнее всего воспользоваться окном отладчика). Интересно также построить этот код в двух режимах – с полным и неполным вычислением логических выражений. Автор очень рекомендует всем любопытствующим не полениться и проделать такую работу.

----

Оглавление книги


Генерация: 0.071. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз