Категория:Кодогенерация: различия между версиями

Перейти к навигации Перейти к поиску
нет описания правки
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
Упрощенно процесс перевода (translation) программы с одного языка на другой можно представлять себе как последовательное выполнение двух фаз — фазы ''анализа'' (analysis) и фазы ''синтеза'' (synthesis). Первая фаза включает решение таких задач, как ''лексический'' (lexical)'', синтаксический'' (syntax) и ''семантический'' (semantic) (или ''контекстный'') анализ. В результате выполнения первой фазы формируется ''промежуточное представление''  (intermediate representation) исходной программы.   
Упрощенно процесс перевода (translation) программы с одного языка на другой можно представлять себе как последовательное выполнение двух фаз — фазы ''анализа'' (analysis) и фазы ''синтеза'' (synthesis). Первая фаза включает решение таких задач, как ''[[Лексический анализ|лексический]]'' (lexical)'', [[Синтаксический анализ|синтаксический]]'' (syntax) и ''семантический'' (semantic) (или ''[[Контекстный анализ|контекстный]]'') анализ. В результате выполнения первой фазы формируется ''промежуточное представление''  (intermediate representation) исходной программы.   


''Компилятор'' (compiler) — это компьютерная программа (''транслятор''), которая переводит компьютерный код, написанный на входном языке программирования (source language), на выходной язык (target language). Название «компилятор» в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык программирования низкого уровня (например, язык ассемблера (assembly language), объектный код (object code) или машинный код (machine code)) для создания исполняемой программы ( executable program). Часть компилятора, выполняющая первую фазу, обычно называется ''первичным'' ''компилятором'' (front-end compiler). Часть компилятора, выполняющая вторую фазу, называется ''вторичным'' ''компилятором'' (back-end compiler)  или ''генератором кода'' (code generator), если выходным является язык низкого уровня.  
''Компилятор'' (compiler) — это компьютерная программа (''транслятор''), которая переводит компьютерный код, написанный на входном языке программирования (source language), на выходной язык (target language). Название «компилятор» в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык программирования низкого уровня (например, язык ассемблера (assembly language), объектный код (object code) или машинный код (machine code)) для создания исполняемой программы ( executable program). Часть компилятора, выполняющая первую фазу, обычно называется ''первичным'' ''компилятором'' (front-end compiler). Часть компилятора, выполняющая вторую фазу, называется ''вторичным'' ''компилятором'' (back-end compiler)  или ''генератором кода'' (code generator), если выходным является язык низкого уровня.  
Строка 5: Строка 5:
Таким образом, генератор кода получает на входе промежуточное представление исходной программы и переводит его в объектный код, форма которого целиком определяется объектной машиной. Хотя имеется большая зависимость кодогенерации от объектного языка и операционной системы, такие вопросы как управление памятью, выбор команд, распределение регистров и порядок вычисления присущи почти всем проблемам кодогенерации.  
Таким образом, генератор кода получает на входе промежуточное представление исходной программы и переводит его в объектный код, форма которого целиком определяется объектной машиной. Хотя имеется большая зависимость кодогенерации от объектного языка и операционной системы, такие вопросы как управление памятью, выбор команд, распределение регистров и порядок вычисления присущи почти всем проблемам кодогенерации.  


Реализация процесса трансляции описанным выше способом, как правило, приводит к получению программ, существенно уступающих ручным программам по качеству использования предоставляемых вычислительной системой ресурсов, таких как время, память и т. д. Поэтому часто универсальный способ трансляции дополняется специальными приемами и методами, направленными на улучшение качества выходной программы и получивших название ''оптимизации'' ''программ'' (program optimization, compiler optimization). Проблема построения оптимальной программы алгоритмически не разрешима, и поэтому основная задача оптимизации состоит в удалении неоптимальностей из выходной программы, возникающих в ней из-за универсального способа трансляции. При этом основные способы оптимизации транслируемой программы заключаются в удалении вычислений или объектов из процессов выполнений программы или в замене в них сложных вычислений на более простые. Многие оптимизации можно реализовать, применяя так называемую ''смешанную стратегию'' (mixed strategy) программирования. Суть этого метода состоит в том, что для программирования семантически богатой конструкции входного языка (такой, как цикл или процедура) транслятор использует помимо универсального способа перевода целый ряд специализированных, ориентированных на конкретные, но зато часто встречающиеся в реальных программах варианты использования этой конструкции. Однако обычно оптимизирующие трансляторы используют метод ''оптимизирующих преобразований (''optimizing transformations), который в отличие от смешанной стратегии обладает достаточной языковой независимостью.
Реализация процесса трансляции описанным выше способом, как правило, приводит к получению программ, существенно уступающих ручным программам по качеству использования предоставляемых вычислительной системой ресурсов, таких как время, память и т. д. Поэтому часто универсальный способ трансляции дополняется специальными приемами и методами, направленными на улучшение качества выходной программы и получивших название [[Оптимизация программ|''оптимизации'' ''программ'']] (program optimization, compiler optimization).

Навигация