Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Основное
Заметки
- Вышел новый релиз Fedora Linux 38
- Библиотека диапазонов (Ranges)
- Промежутки (span). C++20
- Стандарт C++23 завершен!
- Создатель языка C++ защитил его от нападок со стороны АНБ США
- Pydroid3 – Python для ОС Android
- Установка цветовых схем в Code::Blocks
- Релиз Fedora Linux 37
- Подключаем SSD-диск c exFat в Fedora 36
- Библиотека NumPy
Фаза Луны
Первая четверть Луны
Луна сейчас в Деве Возраст Луны 7 дней
Темы
Страница
Дата создания:
2015-01-11 04:45:39
Последняя правка:
2022-02-07 22:46:30
Источник: inf-w.ru
10.Этапы компиляции. Общая схема работы компилятора.
Процесс компиляции состоит из двух этапов — анализа и синтеза.
C++ с нуля | 08 | Компиляция и линковка
На этапе анализа выполняется распознавание текста исходной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представление программы, понятное компилятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблицах идентификаторов, порождается текст результирующей программы. Результатом этого этапа является код.
Кроме того, в составе компилятора присутствует часть, ответственная за анализ и исправление ошибок, которая при наличии ошибки в тексте исходной программы должна максимально полно информировать пользователя о типе ошибке и месте ее возникновения.
Эти этапы, в свою очередь, состоят из более мелких этапов, названных фазами компиляции. Состав фаз компиляции приведен на рисунке в общем виде. Их конкретная реализация и процесс взаимодействия могут различаться в зависимости от версии компилятора.
Лексический анализ- это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексимы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического разбора.
Синтаксический разбор- это основная часть компилятора на этапе анализа. Она выполняет выделение синтаксической конструкции в тексте исходной программы, и проверяет правильность программы.
Семантический анализ- часть компилятора, проверяющая правильность текста программы с точки зрения семантики входного языка.
Подготовка к генерации кода- это фаза, на которой компилятором выполняются предварительные действия, связанные с синтезом текста результирующей программы, но еще не ведущей к порождению текста на выходном языке. Обычно в эту фазу входят действия, связанные с идентификацией элементов языка, распределением памяти и т.д.
Генерация кода — эта фаза, непосредственно связанная с порождением команд, составляющих предложение выходного языка и в целом текст результирующей программы. Генерация обычно включает в себя также оптимизацию- процесс, связанный с обработкой уже порожденного текста.
Что такое компиляция, линковка? Что такое run time?
Таблица идентификаторов — это специальным образом организованные наборы данных, служащие для хранения информации об элементах исходной программы , которые затем используются для порождения текста результирующей программы.
Источник: studfile.net
Этапы компиляции. Общая схема работы компилятора
На рис. 1 представлена общая схема работы компилятора. Из нее видно, что в целом процесс компиляции состоит из двух основных этапов: анализа и синтеза.
На этапе анализа выполняется распознавание текста исходной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представление программы, понятное компилятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице идентификаторов, порождается текст результирующей программы. Результатом этого этапа является объектный код (модуль). Если программа обращалась к функциям и данным другого модуля, компилятор транслирует эти обращения во внешние ссылки (external reference). Если же программа предоставляет доступ к своим данным и функциям другим программам, каждый доступный элемент представляется как внешнее имя (external name). Объектные модули хранят эти внешние имена и ссылки в структуре данных, называемой таблицей имен (symbol table).
Кроме того, в составе компилятора присутствует часть, ответственная за анализ и исправление ошибок, которая при наличии ошибки в тексте исходной программы должна максимально полно информировать пользователя о типе ошибки и месте ее возникновения. В лучшем случае компилятор может предложить пользователю вариант исправления ошибки.
Эти этапы, в свою очередь, состоят из более мелких этапов, называемых фазами компиляции. Состав фаз компиляции на рис. 1 приведен в самом общем виде, их конкретная реализация и процесс взаимодействия могут, конечно, различаться в зависимости от версии компилятора. Однако в том или ином виде все представленные фазы практически всегда присутствуют в каждом конкретном компиляторе.
Компилятор в целом выполняет две основные функции. Во-первых, он является распознавателем для языка исходной программы. То есть он должен получить на вход цепочку символов входного языка, проверить ее принадлежность языку и, более того, выявить правила, по которым эта цепочка построена. Во-вторых, компилятор является генератором для языка результирующей программы.
Он должен построить на выходе цепочку выходного языка по определенным правилам, предполагаемым языком машинных команд или языком ассемблера. В случае машинных команд распознавателем этой цепочки будет выступать целевая вычислительная система, под которую создается результирующая программа.
Рассмотрим основные фазы компиляции.
Лексический анализ (сканер) — это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического разбора.
Синтаксический разбор — это основная часть компилятора на этапе анализа. Она выполняет выделение синтаксических конструкций в тексте исходной программы, обработанном лексическим анализатором. На этой же фазе компиляции проверяется синтаксическая правильность программы. Синтаксический разбор играет главную роль — роль распознавателя текста входного языка программирования.
Семантический анализ — это часть компилятора, проверяющая правильность текста исходной программы с точки зрения семантики входного языка. Кроме непосредственно проверки, семантический анализ должен выполнять преобразования текста, требуемые семантикой входного языка (например, такие как добавление функций неявного преобразования типов). В различных реализациях компиляторов семантический анализ может частично входить в фазу синтаксического разбора, частично — в фазу подготовки к генерации кода.
Задачи семантического анализа:
· каждый используемый в программе идентификатор должен быть описан, но не более одного раза в одной зоне описания;
· При вызове функций число фактических параметров и их типы должны соответствовать числу и типам формальных параметров;
· Обычно в языке накладываются ограничения на типы операндов любой операции, определенной в этом языке, на типы левой и правой части в присваивании, на тип параметра цикла, на тип условия в операторе цикла и условном операторе, и т п.
Рис. 1. Общая схема работы компилятора.
Подготовка к генерации кода — это фаза, на которой компилятором выполняются предварительные действия, необходимые для синтеза результирующей программы, но не ведущие к порождению текста на выходном языке. Обычно в эту фазу входят действия, связанные с идентификацией элементов языка, распределением памяти и т. п.
Генерация кода — это фаза, непосредственно связанная с порождением текста результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Кроме непосредственно порождения текста результирующей программы генерация обычно включает в себя также оптимизацию — процесс, связанный с обработкой уже порожденного текста. Иногда оптимизацию выделяют в отдельную фазу компиляции, так как она оказывает существенное влияние на качество и эффективность результирующей программы.
Таблицы идентификаторов (иногда «таблицы символов») — это специальным образом организованные структуры данных, служащие для хранения информации об элементах исходной программы, которые затем используются для порождения текста результирующей программы. В конкретной реализации компилятора может быть как одна, так и несколько таблиц идентификаторов. Элементами исходной программы, информацию о которых необходимо хранить в процессе компиляции, являются переменные, константы, функции и т. п. — конкретный состав этих элементов зависит от входного языка. Термин «таблицы» вовсе не предполагает, что это хранилище данных должно быть организовано именно в виде таблиц или массивов информации.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru