Чи є реальна різниця між компілятором і асемблером?


15

Чи є різниця між ними? Відповідно до книги Уллмана , компілятори перетворюють одну мову на іншу (як правило, низький рівень), і так це робить асемблер. Чим вони відрізняються?


1
Асемблер - це компілятор, який виконує певний набір завдань. Терміни дещо розходяться на практиці, але застосовується базове визначення поняття "компілятор" (переклад між мовами).
Рафаель

Усі асемблери - це (прості) компілятори, оскільки вони перетворюють одну мову в іншу. Не всі компілятори є складальниками.
користувач253751

Відповіді:


16

Асемблер переводить код складання в машинний код. Переклад механічний і може бути здійснений лише одним способом. На відміну від цього, компілятор має більше свободи, коли збирає відповідну мову програмування - він може оптимізувати, наприклад, і навіть неоптимізуючі компілятори створюють різний код. Також компілятори можуть бути записані таким чином, що розділяє "передній" (відповідний мові програмування) та "бек-енд" (відповідний архітектурі комп'ютера), тоді як у асемблерів два завжди однакові.


2
Чому переклад можна зробити лише одним способом? Чи означає це, що вихідний код ASM не може бути створений для заданого машинного коду (та цільової архітектури)? Це звучить для мене протиінтуїтивно. Тому що якщо дана інструкція машинного коду може відображати кілька інструкцій ASM, то як машина вирішує, яку інструкцію виконати? Я щось пропускаю?
Утку

3
АТ(А)А

Дякую, я також бачу, що в книзі Уллмана компілятор має передню частину та резервний. Якщо я маю рацію, бекенд проводить оптимізацію проміжною мовою, генерацію машинного коду та оптимізацію машинного коду, і кожне з трьох завдань можна виконати більш ніж одним способом. це "резервна" частина асемблера? Чи мова проміжних є мовою складання? Я думаю, що так, але у вашій відповіді зазначається, що асемблер виконує свою роботу лише одним способом.
Тім

Я опублікував це тут cs.stackexchange.com/questions/98854/…
Тім

Проміжна мова зазвичай стосується мови, яка не залежить від машини.
Yuval Filmus

11

Суть полягає в тому, що писати компілятор веселіше, ніж асемблер. Мови складання зазвичай розроблені так, щоб вони були майже тривіальними для розбору та перевірки типу і, як правило, залучають багато генераторів, керованих таблицею ("опкод для додавання - 01110", "для інструкцій із завантаження реєстр операндів призначення визначається бітами 17 по 21 "). Зазвичай найцікавішою частиною асемблера є частина, яка розбиває символьні позначки на числа.

Однак більшість асемблерів може виконати невелику кількість арифметичних (наприклад, додавання символічних міток з малими константами), а більшість асемблерів або мають, або інтегруються з засобом макрообробки. (У більшості систем Unix макро-функція фактично надається за допомогою запуску попереднього процесора C над складанням, перш ніж передавати його належному асемблеру.)

Асемблер MIPS повинен був піти на крок за цим і прийняв кілька цікавих рішень для генерації коду та зробив невелику кількість оптимізації. Мова машини MIPS вимагає, наприклад, різних кодових послідовностей для завантаження різних констант, і тому асемблер повинен був вибрати послідовність коду після побудови константи . Крім того, машинний код MIPS мав поняття слотів затримки , але відповідальність асемблера відповідала за те, щоб абстрагувати їх та подати компілятору більш "нормальну" абстрактну мову складання. Таким чином, асемблеру MIPS потрібно виконати місцеве планування інструкцій.

Відмінність ще більше розмивається деякими роботами Нормана Рамзі , зокрема його мовою C- портативного монтажу. (Відповідна доповідь - це Рамзі та Пейтон Джонс, "Єдина проміжна мова, яка підтримує багатореалізацію винятків", прог. Lang. Impl. І Dsgn. (PLDI-21): 285–298, 2000. ) І нарешті, там також є набраною мовою асемблера від Девіда Уокера та Грега Морріссета з асемблером, який може гарантувати безпеку пам’яті.


0

Тут трохи спрощена відповідь, реальність складніша. Я б очікував, що різниця між Assembler (A) і Compiler (C) буде серед іншого:

  1. Один рядок вихідного коду відноситься безпосередньо до одного коду CPU (A) чи ні (C)
  2. Висока залежність від фактичного процесора (A) або незалежної від машини (C)

Ми схильні називати мову складання "низьким рівнем", а мова-джерело компілятор розуміє "високий рівень" (це грубе спрощення, але все ж).

Мовою збірки ви можете, наприклад, зробити операцію додавання, сказавши:

  • додати a, b (для одного конкретного процесора)
  • додати R5, R6 (для іншого процесора)
  • додати (A5), D2 (для іншого процесора)

Мовою високого рівня ви можете написати:

  • x = y + z;

І це може призвести до однієї інструкції або до сотні інструкцій залежно від ряду обставин, одне - це те, для чого CPU компілятор створює інструкції.

Як ви бачите, найчастіше мова на мові джерела збірки: (A) один рядок вихідного коду дає один рядок коду CPU, і це дуже залежить від того, на який процесор ви орієнтовані. Компілятор мови (C) високого рівня обробляє всі ці деталі для вас - один рядок вихідного коду може стати нульовим, один або багато опдодів CPU, а компілятор обробляє деталі того, що може зробити процесор.

Сьогодні компілятор часто складається з декількох різних етапів. Їх можна назвати frontend / backkend або beeing називати іншими речами. Я зазвичай бачу їх як чотири етапи:

  1. Перший етап зчитує фактичний вихідний код і створює внутрішнє представлення. Цей етап знає фактичну мову джерела.
  2. Другий етап розглядає внутрішнє представлення та робить ряд оптимізацій. У наш час компілятор зазвичай шукає, щоб зробити програму швидшою і не піклуватися про її збільшення. Оптимізація проводиться на внутрішньому представництві. Цікаво, що частини цього можуть бути загальними для кількох різних мов.
  3. Третій етап займає внутрішнє представлення та створює фактичний код для обраного процесора. На цьому етапі може бути кілька різних версій, орієнтованих на різні процесори. Насправді ви можете один раз написати вихідний код і потім скомпілювати його для різних CPUS.
  4. Заключна підготовка до "упаковки" програми (цей етап може бути лінкером).

Написання хороших укладачів - професія висококваліфікована - виготовити компілятор іграшкової мови можна в другій половині дня аматуером (або ну трохи довше).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.