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

Части компилятора

Существуют в основном три фазы структуры компилятора. Передняя часть, средняя часть и задняя часть. Все они выполняют там задание один за другим.

Внешний интерфейс

Внешний интерфейс проверяет синтаксис и семантику исходного языка. Его часто называют аналитической частью. Он разбивает программу на более мелкие части и структурирует их грамматически. Затем он создает промежуточное представление программы (IR). IR создается для дальнейшей обработки, такой как оптимизация и перевод. Если часть анализа обнаружила какие-либо ошибки в синтаксисе и семантике, она информирует пользователя о необходимости предпринять дальнейшие действия.

Средний конец

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

Бэкэнд

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

Фазы компилятора

Лексический анализ

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

Синтаксический анализ

Второй этап — синтаксический анализ или синтаксический анализ. Он использует имя токена, полученное в процессе лексического анализа, и создает промежуточное представление (IR) для грамматической структуры токена. Представление — это синтаксическое дерево, в котором внутренний узел представляет операцию, а дочерний узел представляет аргумент операции.

Семантический анализ

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

Генерация промежуточного кода

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

Оптимизация кода

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

Генерация кода

Генератор кода использует IR в качестве входных данных и преобразует его в целевой язык. Если целевым языком является машинный код, то регистры и ячейки памяти для переменной, используемой в программе. Затем ИР транслируется в последовательность машинных инструкций. Одной из основных частей генерации кода является выделение регистров для переменных.

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