Разница между компилятором и ассемблером
Содержание
Компилятор и Ассемблер играет важную роль в выполнении программы. Некоторые компиляторы напрямую генерируют исполняемый код вместо кода сборки. Компилятор берет предварительно обработанный исходный код и переводит его в код сборки. Ассемблер берет код сборки из компилятора и переводит его в перемещаемый машинный код. В этой статье я рассмотрел различия между компилятором и ассемблером с помощью сравнительной таблицы, показанной ниже, просто посмотрите.
- Сравнительная таблица
- Определение
- Ключевые отличия
- Вывод
Сравнительная таблица
Основа для сравнения | составитель | ассемблер |
---|---|---|
основной | Создает код на ассемблере или непосредственно исполняемый код. | Создает перемещаемый машинный код. |
вход | Предварительно обработанный исходный код. | Код на ассемблере. |
Фазы / Проходы | Фазы компиляции: лексический анализатор, синтаксический анализатор, семантический анализатор, генерация промежуточного кода, оптимизация кода, генерация кода. | Ассемблер делает два прохода над заданным вводом. |
Выход | Код ассемблера, сгенерированный компилятором, является мнемонической версией машинного кода. | Перемещаемый машинный код, сгенерированный ассемблером, представлен двоичным кодом. |
Определение компилятора
компилятор это компьютерная программа, которая читает программу, написанную на исходном языке, переводит ее на эквивалентный язык ассемблера и пересылает код ассемблера на ассемблер, В то время как перевод исходного кода в ассемблерный код компилятор также сообщает ошибка в исходном коде своему пользователю.
Компиляторы также классифицируются как однопроходный, многопроходный, load-and-go, отладка и оптимизация. Классификация выполняется на основе того, какую функцию выполняет компилятор и как она была построена. Несмотря на эти сложности, основная задача компилятора остается неизменной.
Компиляция выполняется в две части, аналитическая часть а также часть синтеза, аналитическая часть разбивает исходный код на составные части и образует промежуточное представление исходного кода. часть синтеза формирует целевой код из промежуточного представления.
Компиляция выполняется в следующие фазы:
Лексический анализатор, синтаксический анализатор, семантический анализатор, генератор промежуточного кода, оптимизатор кода, генератор кода, таблица символов и обработчик ошибок.
- лексический анализатор читает символы исходного кода и группирует их в потоки токенов, Каждый токен представляет логическую последовательность символов, таких как ключевое слово, идентификаторы, операторы, Последовательность символов, которая формирует токен, называется лексема.
- синтаксический анализатор анализирует токен, полученный из лексического анализатора, и группирует токены в иерархическая структура.
- семантический анализатор проверяет исходный код на любой семантическая ошибка.
- Генератор промежуточного кода генерирует промежуточное представление исходного кода
- Оптимизатор кода оптимизирует промежуточный код для ускорения работы машинного кода.
- генератор кода наконец генерирует целевой код, который является перемещаемый машинный код или код сборки.
- таблица символов структура данных, которая содержит запись для каждого идентификатора в исходном коде
- Обработчик ошибок обнаруживает ошибку в каждой фазе и обрабатывает эти ошибки.
Определение ассемблера
Некоторые компиляторы выполняют задачу ассемблера и напрямую генерируют перемещаемый машинный код вместо ассемблерного кода, который затем напрямую передается компоновщику / загрузчику. ассемблер принимает в качестве входных данных код сборки, сгенерированный компилятором, и переводит его в перемещаемый машинный код.
Давайте посмотрим, чем машинный код отличается от кода сборки. Код сборки это мнемонический версия машинного кода. Это означает, что ассемблерный код использует имена для представления операций и даже дает имена адресам памяти. С другой стороны, Машинный код использования двоичные коды для представления операций и адресов памяти.Даже самая простая форма ассемблера выполняет два прохода над входом. первый проход обнаруживает все идентификаторы в коде сборки, который обозначает место хранения и хранить их в таблица символов (кроме таблицы символов компиляторов). место хранения назначено к идентификатору, который встречается в первом проходе.
в второй проходвход снова сканируется, и на этот раз код операции являются переведенный в последовательность битов представляя эту операцию в машинном коде. Второй проход также переводит идентификаторы в адреса определено в таблице символов. Таким образом, второй проход генерирует перемещаемый машинный код.
- Основное различие между компилятором и ассемблером заключается в том, что компилятор генерирует ассемблерный код, и некоторые компиляторы также могут напрямую генерировать исполняемый код, тогда как ассемблер генерирует перемещаемый машинный код.
- Компилятор принимает в качестве входных данных предварительно обработанный код генерируется препроцессором. С другой стороны, ассемблер берет код сборки в качестве ввода.
- Компиляция происходит в два этапа, которые фаза анализа а также фаза синтеза, На этапе анализа вход проходит через лексический анализатор, синтаксический анализатор, семантический анализатор в то время как анализ синтеза происходит через промежуточный генератор кода, оптимизатор кода, генератор кода, С другой стороны, ассемблер передает ввод через две фазы, Первая фаза обнаруживает идентификаторы и выделяет адреса для них, во второй фазе код сборки преобразуется в двоичный код.
- Код сборки, сгенерированный компилятором, является мнемоническая версия машинного кода. Тем не менее, перемещаемый машинный код, сгенерированный ассемблером, является двоичный перемещаемый код.
Вывод:
Ассемблер может не потребоваться, так как некоторые компиляторы напрямую генерируют исполняемый код. Если используется ассемблер, он требует компоновщика, чтобы связать все встроенные библиотеки с библиотечными функциями, используемыми в исходном коде.