Скачать презентацию Основные фазы компиляции Основные фазы компиляции Процесс Скачать презентацию Основные фазы компиляции Основные фазы компиляции Процесс

SPO-2 Основные фазы компиляции.pptx

  • Количество слайдов: 28

Основные фазы компиляции Основные фазы компиляции

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

Основные фазы компиляции № Название этапа 1 Синтаксический анализ 3 Контекстный анализ 4 Генерация Основные фазы компиляции № Название этапа 1 Синтаксический анализ 3 Контекстный анализ 4 Генерация промежуточного представления 5 Оптимизация 6 Результаты работы Лексический анализ 2 Используемые технологии и алгоритмы Генерация машинного кода 3

Основные фазы компиляции Лексический анализ Основная задача лексического анализа – разбить исходный текст программы Основные фазы компиляции Лексический анализ Основная задача лексического анализа – разбить исходный текст программы (последовательность символов) на отдельные лексемы и определить их тип. В основе работы лексических анализаторов обычно лежат конечные автоматы и регулярные выражения. 4

Основные фазы компиляции Пример работы лексического анализатора for(i=0; i<N; i++) for ключевое слово ( Основные фазы компиляции Пример работы лексического анализатора for(i=0; i

Основные фазы компиляции При выполнении лексического анализа обнаруживаются некоторые простейшие ошибки – неверные символы, Основные фазы компиляции При выполнении лексического анализа обнаруживаются некоторые простейшие ошибки – неверные символы, неправильная запись чисел, строк, операторов, идентификаторов. Например: d=b*b-4 ac; if (x=>3) char c=‘a”; Не обнаруживаются ошибки в структуре программы, например: a*2=b-3; if x<3) for{i=0; i

Основные фазы компиляции Режимы работы лексического анализатора 1. Выполнение полного прохода, в результате которого Основные фазы компиляции Режимы работы лексического анализатора 1. Выполнение полного прохода, в результате которого формируется список лексем: Lexical. Analyser lexer = new Lexical. Analyser(source); List lexemes = lexer. Get. Lexeme. List(); 2. Извлечение очередной лексемы по запросу: Lexical. Analyser lexer = new Lexical. Analyser(source); while ( lexer. has. Next. Lexeme() ) { Lexeme lexeme = lexer. Get. Next. Lexeme(); //. . . } 7

Основные фазы компиляции Часто при работе лексического анализатора строятся таблицы объектов – констант, строк, Основные фазы компиляции Часто при работе лексического анализатора строятся таблицы объектов – констант, строк, идентификаторов и т. п. № Идентификатор № Константа 1 i 1 2 N 2 3 0 3 for(i=0; i

Основные фазы компиляции Синтаксический анализ Основная задача синтаксического анализа – разбор структуры программы. Обычно Основные фазы компиляции Синтаксический анализ Основная задача синтаксического анализа – разбор структуры программы. Обычно структура программы представляется в виде дерева. Существует большое количество алгоритмов реализации синтаксических анализаторов, например, восходящий анализ или рекурсивный спуск. 9

Основные фазы компиляции Результатом синтаксического анализа является синтаксическое дерево со ссылками на таблицы объектов. Основные фазы компиляции Результатом синтаксического анализа является синтаксическое дерево со ссылками на таблицы объектов. 10

Основные фазы компиляции Пример работы синтаксического анализатора d=b*b– 4*a*c; = – d * b Основные фазы компиляции Пример работы синтаксического анализатора d=b*b– 4*a*c; = – d * b c * 4 a 11

Основные фазы компиляции Пример работы синтаксического анализатора for(i=0; i<N; i++) { … } for Основные фазы компиляции Пример работы синтаксического анализатора for(i=0; i

Основные фазы компиляции Пример работы синтаксического анализатора while (a!=b) if (a>b) a-=b; else b-=a; Основные фазы компиляции Пример работы синтаксического анализатора while (a!=b) if (a>b) a-=b; else b-=a; while if a!=b a>b a-=b b-=a 13

Основные фазы компиляции При выполнении синтаксического анализа обнаруживаются ошибки, связанные со структурой программы: неверная Основные фазы компиляции При выполнении синтаксического анализа обнаруживаются ошибки, связанные со структурой программы: неверная запись структурных операторов, ошибки в записи арифметических и логических выражений и т. п. Например: a*2=b-3; if x<3) for{i=0; i

Основные фазы компиляции Семантический (контекстный) анализ Основная задача семантического анализа – определить свойства (атрибуты) Основные фазы компиляции Семантический (контекстный) анализ Основная задача семантического анализа – определить свойства (атрибуты) объектов и убедиться в правильности их использования. В основе большинства алгоритмов семантического анализа лежат атрибутные грамматики. 15

Основные фазы компиляции Основными атрибутами объектов являются: 1. Тип данных 2. Область видимости Основные Основные фазы компиляции Основными атрибутами объектов являются: 1. Тип данных 2. Область видимости Основные виды проверок: 1. Проверка соответствия типов 2. Проверка правильности употребления имен 3. Проверка передачи управления 16

Основные фазы компиляции Во время семантического анализа синтаксическое дерево программы может быть дополнено неявными Основные фазы компиляции Во время семантического анализа синтаксическое дерево программы может быть дополнено неявными преобразованиями. Результатом семантического анализа является атрибутированное синтаксическое дерево. (атрибуты могут быть сосредоточены в таблицах объектов, так и рассредоточены в самом дереве) 17

Основные фазы компиляции Пример работы семантического анализатора int a, b, c; float d, e; Основные фазы компиляции Пример работы семантического анализатора int a, b, c; float d, e; a=1; b=-2; d=b*b-4*a*c; № Идентификатор Тип Инициализируется Используется 1 a int да да 2 b int да да 3 c int нет да 4 d float да нет 5 e float нет 18

Основные фазы компиляции Ошибки, выявляемые во время семантического анализа: – несоответствие типов: int a=2. Основные фазы компиляции Ошибки, выявляемые во время семантического анализа: – несоответствие типов: int a=2. 5; (Java) double a; int *b=&a; (C++) – неправильное употребление идентификатора: a=5; int a; double a; y=sin*x; 19

Основные фазы компиляции Генерация промежуточного представления выполняется для упрощения последующих этапов. Большинство алгоритмов основаны Основные фазы компиляции Генерация промежуточного представления выполняется для упрощения последующих этапов. Большинство алгоритмов основаны на синтаксически управляемой трансляции. 20

Основные фазы компиляции Для промежуточного представления программы используются: – графы (синтаксическое дерево, ОАГ); – Основные фазы компиляции Для промежуточного представления программы используются: – графы (синтаксическое дерево, ОАГ); – линеаризованная форма (префиксная, постфиксная запись); – табличная форма (трехадресный код) и т. д. 21

Основные фазы компиляции Оптимизация модификация внутреннего представления программы с целью получения более эффективного результирующего Основные фазы компиляции Оптимизация модификация внутреннего представления программы с целью получения более эффективного результирующего кода. Один из основных методов оптимизации – потоковый анализ. 22

Основные фазы компиляции Виды оптимизации – машинно-зависимые и машинно-независимые; – локальные и глобальные Критерии Основные фазы компиляции Виды оптимизации – машинно-зависимые и машинно-независимые; – локальные и глобальные Критерии оптимизации: – быстродействие; – объем машинного кода; – объем используемой памяти и т. п. 23

Основные фазы компиляции Глобальная оптимизация анализирует (и преобразовывает) структуру всей программы Локальная оптимизация анализирует Основные фазы компиляции Глобальная оптимизация анализирует (и преобразовывает) структуру всей программы Локальная оптимизация анализирует (и преобразовывает) небольшие фрагменты программы 24

Основные фазы компиляции Примеры конструкций, допускающих оптимизацию машинно-зависимая i++; x=0; машинно-независимая L=2*M_PI*R; локальная D=sqrt( Основные фазы компиляции Примеры конструкций, допускающих оптимизацию машинно-зависимая i++; x=0; машинно-независимая L=2*M_PI*R; локальная D=sqrt( (x 1 -x 2)*(x 1 -x 2)+(y 1 -y 2)*(y 1 -y 2)); глобальная for(i=0; i

Основные фазы компиляции Генерация кода последняя фаза трансляции. Результатом является ассемблерный модуль или объектный Основные фазы компиляции Генерация кода последняя фаза трансляции. Результатом является ассемблерный модуль или объектный (загружаемый) модуль. 26

Основные фазы компиляции Задачи, решаемые при генерации кода: – размещение переменных; – распределение и Основные фазы компиляции Задачи, решаемые при генерации кода: – размещение переменных; – распределение и назначение регистров; – выбор машинных команд; – управление потоком исполнения. Обязательной частью генерации кода является локальная и машинно-зависимая оптимизация. 27

Основные фазы компиляции Методики, используемые при генерации кода: – динамическое программирование; – таблицы решений; Основные фазы компиляции Методики, используемые при генерации кода: – динамическое программирование; – таблицы решений; и т. д. 28