Разница между компилятором и ассемблером

Автор: Laura McKinney
Дата создания: 1 Апрель 2021
Дата обновления: 11 Май 2024
Anonim
Основы программирования #2 Компилятор и интерпретатор
Видео: Основы программирования #2 Компилятор и интерпретатор

Содержание


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

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. Вывод

Сравнительная таблица

Основа для сравнениясоставитель ассемблер
основнойСоздает код на ассемблере или непосредственно исполняемый код.Создает перемещаемый машинный код.
входПредварительно обработанный исходный код.Код на ассемблере.
Фазы / ПроходыФазы компиляции: лексический анализатор, синтаксический анализатор, семантический анализатор, генерация промежуточного кода, оптимизация кода, генерация кода.Ассемблер делает два прохода над заданным вводом.
ВыходКод ассемблера, сгенерированный компилятором, является мнемонической версией машинного кода.Перемещаемый машинный код, сгенерированный ассемблером, представлен двоичным кодом.


Определение компилятора

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

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

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


Компиляция выполняется в следующие фазы:

Лексический анализатор, синтаксический анализатор, семантический анализатор, генератор промежуточного кода, оптимизатор кода, генератор кода, таблица символов и обработчик ошибок.

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

Определение ассемблера

Некоторые компиляторы выполняют задачу ассемблера и напрямую генерируют перемещаемый машинный код вместо ассемблерного кода, который затем напрямую передается компоновщику / загрузчику. ассемблер принимает в качестве входных данных код сборки, сгенерированный компилятором, и переводит его в перемещаемый машинный код.

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

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

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

  1. Основное различие между компилятором и ассемблером заключается в том, что компилятор генерирует ассемблерный код, и некоторые компиляторы также могут напрямую генерировать исполняемый код, тогда как ассемблер генерирует перемещаемый машинный код.
  2. Компилятор принимает в качестве входных данных предварительно обработанный код генерируется препроцессором. С другой стороны, ассемблер берет код сборки в качестве ввода.
  3. Компиляция происходит в два этапа, которые фаза анализа а также фаза синтеза, На этапе анализа вход проходит через лексический анализатор, синтаксический анализатор, семантический анализатор в то время как анализ синтеза происходит через промежуточный генератор кода, оптимизатор кода, генератор кода, С другой стороны, ассемблер передает ввод через две фазы, Первая фаза обнаруживает идентификаторы и выделяет адреса для них, во второй фазе код сборки преобразуется в двоичный код.
  4. Код сборки, сгенерированный компилятором, является мнемоническая версия машинного кода. Тем не менее, перемещаемый машинный код, сгенерированный ассемблером, является двоичный перемещаемый код.

Вывод:

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