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

Материал из WikiGrapp
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
Упрощенно процесс трансляции (перевода программы с одного языка на другой) можно представлять себе как последовательное выполнение двух фаз — фазы ''анализа'' и фазы ''синтеза''. Первая фаза включает решение таких задач, как ''лексический, синтаксический'' и ''контекстный'' анализ. В результате выполнения первой фазы формируется ''промежуточное представление''  (intermediate representation) исходной программы. Часть ''транслятора'' (compiler), выполняющая первую фазу, обычно называется ''первичным'' (front-end) транслятором. Часть транслятора, выполняющая вторую фазу, называется ''вторичным'' (back-end) транслятором и ''генератором кода'' (code generator), если выходным языком является машинный язык объектной ЭВМ.
Упрощенно процесс перевода (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), если выходным является язык низкого уровня.  


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

Версия от 08:36, 28 ноября 2024

Упрощенно процесс перевода (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), если выходным является язык низкого уровня.

Таким образом, генератор кода получает на входе промежуточное представление исходной программы и переводит его в объектный код, форма которого целиком определяется объектной машиной. Хотя имеется большая зависимость кодогенерации от объектного языка и операционной системы, такие вопросы как управление памятью, выбор команд, распределение регистров и порядок вычисления присущи почти всем проблемам кодогенерации.

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