Как происходит компиляция программы

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите 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 | Компиляция и линковка

На этапе анализа выполняется распознавание текста исход­ной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представ­ление программы, понятное компилятору.

На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблицах идентифи­каторов, порождается текст результирующей программы. Ре­зультатом этого этапа является код.

Кроме того, в составе компилятора присутствует часть, от­ветственная за анализ и исправление ошибок, которая при нали­чии ошибки в тексте исходной программы должна максимально полно информировать пользователя о типе ошибке и месте ее возникновения.

Эти этапы, в свою очередь, состоят из более мелких этапов, названных фазами компиляции. Состав фаз компиляции приве­ден на рисунке в общем виде. Их конкретная реализация и про­цесс взаимодействия могут различаться в зависимости от версии компилятора.

Лексический анализ- это часть компилятора, которая читает ли­теры программы на исходном языке и строит из них слова (лексимы) исходного языка. На вход лексического анализатора по­ступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического разбора.

Синтаксический разбор- это основная часть компилятора на этапе анализа. Она выполняет выделение синтаксической конст­рукции в тексте исходной программы, и проверяет правильность программы.

Читайте также:
Как пользоваться программой you cut

Семантический анализ- часть компилятора, проверяющая пра­вильность текста программы с точки зрения семантики входного языка.

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

Генерация кода — эта фаза, непосредственно связанная с порож­дением команд, составляющих предложение выходного языка и в целом текст результирующей программы. Генерация обычно включает в себя также оптимизацию- процесс, связанный с об­работкой уже порожденного текста.

Что такое компиляция, линковка? Что такое run time?

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

Источник: studfile.net

Этапы компиляции. Общая схема работы компилятора

На рис. 1 представлена общая схема работы компилятора. Из нее видно, что в целом процесс компиляции состоит из двух основных этапов: анализа и синтеза.

На этапе анализа выполняется распознавание текста исходной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представление программы, понятное компилятору.

На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице идентификаторов, порождается текст результирующей программы. Результатом этого этапа является объектный код (модуль). Если программа обращалась к функциям и данным другого модуля, компилятор транслирует эти обращения во внешние ссылки (external reference). Если же программа предоставляет доступ к своим данным и функциям другим программам, каждый доступный элемент представляется как внешнее имя (external name). Объектные модули хранят эти внешние имена и ссылки в структуре данных, называемой таблицей имен (symbol table).

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

Читайте также:
Программа требования энергетической безопасности при эксплуатации тепловых энергоустановок

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

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

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

Рассмотрим основные фазы компиляции.

Лексический анализ (сканер) — это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического разбора.

Синтаксический разбор — это основная часть компилятора на этапе анализа. Она выполняет выделение синтаксических конструкций в тексте исходной программы, обработанном лексическим анализатором. На этой же фазе компиляции проверяется синтаксическая правильность программы. Синтаксический разбор играет главную роль — роль распознавателя текста входного языка программирования.

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

Читайте также:
Какие прыжки входят в легкоатлетическую программу

Задачи семантического анализа:

· каждый используемый в программе идентификатор должен быть описан, но не более одного раза в одной зоне описания;

· При вызове функций число фактических параметров и их типы должны соответствовать числу и типам формальных параметров;

· Обычно в языке накладываются ограничения на типы операндов любой операции, определенной в этом языке, на типы левой и правой части в присваивании, на тип параметра цикла, на тип условия в операторе цикла и условном операторе, и т п.

Рис. 1. Общая схема работы компилятора.

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

Генерация кода — это фаза, непосредственно связанная с порождением текста результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Кроме непосредственно порождения текста результирующей программы генерация обычно включает в себя также оптимизацию — процесс, связанный с обработкой уже порожденного текста. Иногда оптимизацию выделяют в отдельную фазу компиляции, так как она оказывает существенное влияние на качество и эффективность результирующей программы.

Таблицы идентификаторов (иногда «таблицы символов») — это специальным образом организованные структуры данных, служащие для хранения информации об элементах исходной программы, которые затем используются для порождения текста результирующей программы. В конкретной реализации компилятора может быть как одна, так и несколько таблиц идентификаторов. Элементами исходной программы, информацию о которых необходимо хранить в процессе компиляции, являются переменные, константы, функции и т. п. — конкретный состав этих элементов зависит от входного языка. Термин «таблицы» вовсе не предполагает, что это хранилище данных должно быть организовано именно в виде таблиц или массивов информации.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru