Генератор промежуточного кода
Затем программа может быть переведена во внутреннее представление. Это делается для целей оптимизации и/или удобства генерации кода. Еще одной целью преобразования программы во внутреннее представление является желание иметь переносимый компилятор. Тогда только последняя фаза (генерация кода) является машинно-зависимой. В качестве внутреннего представления может использоваться префиксная или постфиксная запись, ориентированный граф, тройки, четверки и другое.
Оптимизация
Оптимизация призвана улучшить характеристики программы. Скажем, уменьшить длину объектного кода или увеличить быстродействие.
Фаз оптимизации может быть несколько. Оптимизации обычно делят на
• Машинно-зависимые.и машинно-независимые,
• Локальные и глобальные.
Часть машинно-зависимой оптимизации выполняется на фазе генерации кода. Глобальная оптимизация пытается принять во внимание структуру всей программы, локальная – только небольших ее фрагментов. Глобальная оптимизация основывается на глобальном потоковом анализе, который выполняется на графе программы и представляет по существу преобразование этого графа. При этом могут учитываться такие свойства программы, как межпроцедурный анализ, межмодульный анализ, анализ областей жизни переменных и т.д.
Генерация кода
Наконец, генерация кода – последняя фаза трансляции. Результатом ее является либо ассемблерный модуль, либо объектный (или загрузочный) модуль. В процессе генерации кода могут выполняться некоторые локальные оптимизации, такие как распределение регистров, выбор длинных или коротких переходов, учет стоимости команд при выборе конкретной последовательности команд. Для генерации кода разработаны различные методы, такие как таблицы решений, сопоставление образцов, включающее динамическое программирование, различные синтаксические методы.
Интерпретация
Второй вариант вместо генерации объектного кода, выполнить иго пошаговую интерпретацию. Интерпретатор промежуточного кода работает намного быстрее интерпретатора исходной программы, к тому же прямая интерпретация большинства языков не возможна. Этот подход можно использовать при написании платформенно-независимых программ. Но скорость выполнения таких программ все же значительно ниже, чем объектного кода
Конечно, те или иные фазы транслятора могут либо отсутствовать совсем, либо объединяться. В простейшем случае однопроходного транслятора нет явной фазы генерации промежуточного представления и оптимизации, остальные фазы объединены в одну, причем нет и явно построенного синтаксического дерева.
Похожие записи
No user прокомментировали сообщение
Оставить комментарий