И компилятор, и ассемблер берут текст, читаемый человеком, и превращают его в двоичный объект определенного формата.
Разница в основном в следующем:
Направление, из которого происходят специфические особенности.
В компиляторе специфические особенности приходят сверху, изязык программирования, на который он нацелен.
Языки высокого уровня являются абстрактными в том смысле, что они разработаны с учетом абстрактной машины, они скрывают детали оборудования.
Компилятор должен отобразитьоперация в абстрактной машине в работу в целевой машине (реальной машине).
В ассемблере подробности исходят снизу, от ISA , на который он нацелен.
Сборка бетон (не 100% бетон, см. Например, псевдоинструкция ), это мнемоника для кодов операций конкретного ЦП.
Ассемблер должен позволять программисту работать с мнемоникой так же, как они работают с кодами операций, поскольку цель состоит в том, чтобы проинструктироватьПроцессор напрямую, поэтому между инструкциями по сборке и машинными инструкциями существует точное соотношение 1: 1.
Сложность
Языки высокого уровня имеют сложный синтаксис, который имеет тенденцию быть похожим на английский, синтаксический анализ и отображение, которые должен делать компилятор, довольноcomplex.
Лексер / токенизатор и парсер необходимы для создания AST , который используется для соответствующей генерации машинного кода, и это требует сохранения контекста между узламиtree.
Мы также ожидаем, что компиляторы оптимизируют AST и сгенерированный код.
Сборка имеет синтаксис на основе строки, лексер и анализатор ограничены линией за раз и часто могут комбинироваться и выполняться с помощью интеллектуального поиска в таблице.
Нет сложного управления состоянием.
Практически нет места для оптимизации и нет причудливой, сложной для реализации функции для отображения в машинном коде, на самом деле отображение является простым, как это уже было сделано программистом.
Компиляторы ботов и ассемблер должны поддерживать некоторый формат объектов и файлов исполнения, поэтому возникает некоторая сложность.
Цели
Компиляторинструмент, который выполняет задачу абстрагирования деталей аппаратного обеспечения от его пользователя, мы хотим написать исходный код, который в идеале может запускаться при перекомпиляции на любом оборудовании.
Ассемблер - это инструмент, который пригодится, когда кто-то не хочет абстрагировать аппаратное обеспечение, а хочет полностью использовать его возможности.
Таким образом, ассемблер представит набор низкоуровневых деталей (например, сегментов), которые компилятор, вместо этого, попытается скрыть.
Мы можем думать оКомпилятор как человек, который следит за рецептом приготовления пищи, когда он говорит «смешайте молоко», человек должен на самом деле взять правильный инструмент (деревянную ложку?), положить его в молоко и сделать вращательное движение.
Этосложная вещь.
Ассемблер похож на ребенка, он не поймет, «смешай молоко», мы должны сказать ему: «возьми деревянную ложку из нарисованного слева, это похоже на длинную палку из дерева свыпуклый конец ", затем," Держите контейнер неподвижно и рукой "," Положите деревянную ложку на глубину 4-5 дюймов в молоко "," сделайте круг, двигаясь ровно и не слишком быстро, по часовой стрелке "," повторите в течение 20 секунд".
Это более простая инструкция для анализа и в то же время позволяет инструктору иметь больший контроль над всей операцией, например, если он хочет изменить глубину залегания ложки.
Так почему у нас есть ассемблеры?
Поскольку нам нужен способ генерирования машинных инструкций точно , мы могли бы использовать для этого компилятор с определенным языком, но с учетом списканизкоуровневые инструкции гораздо менее структурированы, чем абстрактные операции, конечным результатом будет прославленный ассемблер (более или менее похожий на наличие программного обеспечения для управления версиями, такого как Git, просто для фиксации рабочего каталога, полного копий с вставленным копированием).
Поэтому мы держим их отдельно: простая структура для ассемблера, сложные грамматики для компилятора.