Учебники

Дизайн компилятора — Обзор

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

Система языковой обработки

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

Система языковой обработки

Язык высокого уровня преобразуется в бинарный язык на разных этапах. Компилятор — это программа, которая преобразует язык высокого уровня в язык ассемблера. Аналогично, ассемблер — это программа, которая конвертирует язык ассемблера в язык машинного уровня.

Давайте сначала разберемся, как программа, использующая компилятор C, выполняется на хост-машине.

  • Пользователь пишет программу на языке Си (язык высокого уровня).

  • Компилятор C компилирует программу и переводит ее в программу ассемблера (язык низкого уровня).

  • Затем ассемблер переводит программу сборки в машинный код (объект).

  • Инструмент компоновщика используется для связывания всех частей программы для выполнения (исполняемый машинный код).

  • Загрузчик загружает их все в память, а затем программа выполняется.

Пользователь пишет программу на языке Си (язык высокого уровня).

Компилятор C компилирует программу и переводит ее в программу ассемблера (язык низкого уровня).

Затем ассемблер переводит программу сборки в машинный код (объект).

Инструмент компоновщика используется для связывания всех частей программы для выполнения (исполняемый машинный код).

Загрузчик загружает их все в память, а затем программа выполняется.

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

препроцессор

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

переводчик

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

ассемблер

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

Linker

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

погрузчик

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

Кросс-компилятор

Компилятор, работающий на платформе (A) и способный генерировать исполняемый код для платформы (B), называется кросс-компилятором.

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

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