Дизайн компилятора - Обзор
Компьютеры - это сбалансированное сочетание программного и аппаратного обеспечения. Аппаратное обеспечение - это просто часть механического устройства, и его функции контролируются совместимым программным обеспечением. Аппаратное обеспечение понимает инструкции в форме электронного заряда, который является аналогом двоичного языка в программировании. В двоичном языке есть только два алфавита: 0 и 1. Для инструктирования аппаратные коды должны быть записаны в двоичном формате, который представляет собой просто последовательность единиц и нулей. Написание таких кодов было бы сложной и обременительной задачей для компьютерных программистов, поэтому у нас есть компиляторы для написания таких кодов.
Система языковой обработки
Мы узнали, что любая компьютерная система состоит из аппаратного и программного обеспечения. Оборудование понимает язык, который люди не могут понять. Поэтому мы пишем программы на языке высокого уровня, который нам легче понять и запомнить. Затем эти программы загружаются в ряд инструментов и компонентов ОС, чтобы получить желаемый код, который может использоваться машиной. Это известно как система обработки языка.
Язык высокого уровня преобразуется в двоичный язык на разных этапах. Аcompilerэто программа, которая преобразует язык высокого уровня в язык ассемблера. Точно так жеassembler это программа, которая преобразует язык ассемблера в язык машинного уровня.
Давайте сначала поймем, как программа, использующая компилятор C, выполняется на главной машине.
Пользователь пишет программу на языке C (язык высокого уровня).
Компилятор C компилирует программу и переводит ее в программу сборки (язык низкого уровня).
Затем ассемблер переводит программу сборки в машинный код (объект).
Инструмент компоновщика используется для связывания всех частей программы вместе для выполнения (исполняемый машинный код).
Загрузчик загружает их все в память, после чего программа запускается.
Прежде чем погрузиться непосредственно в концепции компиляторов, мы должны понять несколько других инструментов, которые тесно работают с компиляторами.
Препроцессор
Препроцессор, обычно рассматриваемый как часть компилятора, - это инструмент, который производит ввод для компиляторов. Он занимается обработкой макросов, расширением, включением файлов, расширением языка и т. Д.
Переводчик
Интерпретатор, как и компилятор, переводит язык высокого уровня на машинный язык низкого уровня. Разница заключается в том, как они читают исходный код или ввод. Компилятор считывает весь исходный код сразу, создает токены, проверяет семантику, генерирует промежуточный код, выполняет всю программу и может включать много проходов. Напротив, интерпретатор считывает оператор из ввода, преобразует его в промежуточный код, выполняет его, а затем принимает следующий оператор в последовательности. Если возникает ошибка, интерпретатор останавливает выполнение и сообщает об этом. тогда как компилятор читает всю программу, даже если обнаруживает несколько ошибок.
Ассемблер
Ассемблер переводит программы на ассемблере в машинный код. Вывод ассемблера называется объектным файлом, который содержит комбинацию машинных инструкций, а также данные, необходимые для размещения этих инструкций в памяти.
Компоновщик
Компоновщик - это компьютерная программа, которая связывает и объединяет различные объектные файлы вместе, чтобы создать исполняемый файл. Все эти файлы могли быть скомпилированы отдельными ассемблерами. Основная задача компоновщика состоит в том, чтобы найти и определить местонахождение модуля / подпрограмм, на которые имеются ссылки, в программе и определить место в памяти, куда будут загружены эти коды, при этом инструкция программы будет иметь абсолютные ссылки.
Загрузчик
Загрузчик является частью операционной системы и отвечает за загрузку исполняемых файлов в память и их выполнение. Он вычисляет размер программы (инструкций и данных) и создает для нее место в памяти. Он инициализирует различные регистры для запуска выполнения.
Кросс-компилятор
Компилятор, работающий на платформе (A) и способный генерировать исполняемый код для платформы (B), называется кросс-компилятором.
Компилятор исходного кода
Компилятор, который берет исходный код одного языка программирования и переводит его в исходный код другого языка программирования, называется компилятором исходного кода.