Чи є різниця між ними? Відповідно до книги Уллмана , компілятори перетворюють одну мову на іншу (як правило, низький рівень), і так це робить асемблер. Чим вони відрізняються?
Чи є різниця між ними? Відповідно до книги Уллмана , компілятори перетворюють одну мову на іншу (як правило, низький рівень), і так це робить асемблер. Чим вони відрізняються?
Відповіді:
Асемблер переводить код складання в машинний код. Переклад механічний і може бути здійснений лише одним способом. На відміну від цього, компілятор має більше свободи, коли збирає відповідну мову програмування - він може оптимізувати, наприклад, і навіть неоптимізуючі компілятори створюють різний код. Також компілятори можуть бути записані таким чином, що розділяє "передній" (відповідний мові програмування) та "бек-енд" (відповідний архітектурі комп'ютера), тоді як у асемблерів два завжди однакові.
Суть полягає в тому, що писати компілятор веселіше, ніж асемблер. Мови складання зазвичай розроблені так, щоб вони були майже тривіальними для розбору та перевірки типу і, як правило, залучають багато генераторів, керованих таблицею ("опкод для додавання - 01110", "для інструкцій із завантаження реєстр операндів призначення визначається бітами 17 по 21 "). Зазвичай найцікавішою частиною асемблера є частина, яка розбиває символьні позначки на числа.
Однак більшість асемблерів може виконати невелику кількість арифметичних (наприклад, додавання символічних міток з малими константами), а більшість асемблерів або мають, або інтегруються з засобом макрообробки. (У більшості систем Unix макро-функція фактично надається за допомогою запуску попереднього процесора C над складанням, перш ніж передавати його належному асемблеру.)
Асемблер MIPS повинен був піти на крок за цим і прийняв кілька цікавих рішень для генерації коду та зробив невелику кількість оптимізації. Мова машини MIPS вимагає, наприклад, різних кодових послідовностей для завантаження різних констант, і тому асемблер повинен був вибрати послідовність коду після побудови константи . Крім того, машинний код MIPS мав поняття слотів затримки , але відповідальність асемблера відповідала за те, щоб абстрагувати їх та подати компілятору більш "нормальну" абстрактну мову складання. Таким чином, асемблеру MIPS потрібно виконати місцеве планування інструкцій.
Відмінність ще більше розмивається деякими роботами Нормана Рамзі , зокрема його мовою C- портативного монтажу. (Відповідна доповідь - це Рамзі та Пейтон Джонс, "Єдина проміжна мова, яка підтримує багатореалізацію винятків", прог. Lang. Impl. І Dsgn. (PLDI-21): 285–298, 2000. ) І нарешті, там також є набраною мовою асемблера від Девіда Уокера та Грега Морріссета з асемблером, який може гарантувати безпеку пам’яті.
Тут трохи спрощена відповідь, реальність складніша. Я б очікував, що різниця між Assembler (A) і Compiler (C) буде серед іншого:
Ми схильні називати мову складання "низьким рівнем", а мова-джерело компілятор розуміє "високий рівень" (це грубе спрощення, але все ж).
Мовою збірки ви можете, наприклад, зробити операцію додавання, сказавши:
Мовою високого рівня ви можете написати:
І це може призвести до однієї інструкції або до сотні інструкцій залежно від ряду обставин, одне - це те, для чого CPU компілятор створює інструкції.
Як ви бачите, найчастіше мова на мові джерела збірки: (A) один рядок вихідного коду дає один рядок коду CPU, і це дуже залежить від того, на який процесор ви орієнтовані. Компілятор мови (C) високого рівня обробляє всі ці деталі для вас - один рядок вихідного коду може стати нульовим, один або багато опдодів CPU, а компілятор обробляє деталі того, що може зробити процесор.
Сьогодні компілятор часто складається з декількох різних етапів. Їх можна назвати frontend / backkend або beeing називати іншими речами. Я зазвичай бачу їх як чотири етапи:
Написання хороших укладачів - професія висококваліфікована - виготовити компілятор іграшкової мови можна в другій половині дня аматуером (або ну трохи довше).