Яка різниця між об'єктним кодом, машинним кодом та кодом складання?
Чи можете ви навести наочний приклад їх різниці?
Яка різниця між об'єктним кодом, машинним кодом та кодом складання?
Чи можете ви навести наочний приклад їх різниці?
Відповіді:
Машинний код - це двійковий (1 і 0) код, який може виконуватися безпосередньо процесором. Якби ви відкривали файл машинного коду в текстовому редакторі, ви побачили б сміття, включаючи недруковані символи (ні, не ті недруковані символи;)).
Об'єктний код - це частина машинного коду, яка ще не пов'язана з повною програмою. Саме машинний код для однієї конкретної бібліотеки чи модуля буде складати готовий продукт. Він також може містити заповнювачі або компенсації, не знайдені в машинному коді завершеної програми. Компоновщик буде використовувати ці наповнювачі та корекції для підключення все разом.
Код складання - це текстовий і (дещо) вихідний код, який читається людиною, який має здебільшого прямий аналог 1: 1 з інструкціями на машині. Це здійснюється за допомогою мнемоніки для фактичних інструкцій, регістрів чи інших ресурсів. Приклади включають в себе JMP
і MULT
інструкції стрибкової і множення цього процесора. На відміну від машинного коду, процесор не розуміє код складання. Ви перетворюєте код складання в машину за допомогою асемблера або компілятора , хоча ми зазвичай думаємо про компілятори в поєднанні з мовою програмування високого рівня, яка абстрагується далі від інструкцій процесора.
Побудова повноцінної програми передбачає написання вихідного коду для програми на зборах або на мові вищого рівня, як C ++. Вихідний код збирається (для збірного коду) або компілюється (для мов вищого рівня) для об'єктного коду, а окремі модулі з’єднуються разом, щоб стати машинним кодом для остаточної програми. Що стосується дуже простих програм, то крок зв’язування може не знадобитися. В інших випадках, таких як IDE (інтегрована середовище розробки), лінкер і компілятор можуть викликатися разом. В інших випадках може бути використаний складний файл створення сценарію чи рішення, щоб розповісти середовищу, як скласти остаточну програму.
Існують також інтерпретовані мови, які поводяться по-різному. Інтерпретовані мови покладаються на машинний код спеціальної програми перекладача. На базовому рівні перекладач аналізує вихідний код і негайно перетворює команди на новий машинний код та виконує їх. Сучасні перекладачі, які іноді також називають середовищем виконання або віртуальною машиною , набагато складніші: оцінюючи за один раз цілі розділи вихідного коду, кешуючи та оптимізуючи, де це можливо, та обробляти складні завдання управління пам'яттю. Інтерпретована мова також може бути попередньо складена до проміжного мови нижнього рівня або байтового коду, подібно до коду складання.
Інші відповіді дали хорошу характеристику різниці, але ви також попросили наочно. Ось схема, що показує, що вони проходять шлях від коду С до виконуваного файлу.
Код складання - це читане людиною представлення машинного коду:
mov eax, 77
jmp anywhere
Машинний код - це чистий шістнадцятковий код:
5F 3A E3 F1
Я припускаю, що ви маєте на увазі код об'єкта як у файлі об'єкта. Це варіант машинного коду, з тією різницею, що стрибки на зразок параметризовані таким чином, що лінкер може заповнити їх.
Асемблер використовується для перетворення коду асемблери в машинний код (об'єктний код). Лінкер пов'язує декілька об'єктних (і бібліотечних) файлів для створення виконуваного файлу.
Я колись писав програму асемблера в чистому шістнадцятковому періоді (асемблер не доступний), на щастя, це було ще на старому доброму (стародавньому) 6502.
Ще не згадуваний момент - це кілька різних типів коду складання. У найосновнішій формі всі числа, що використовуються в інструкціях, повинні бути вказані як константи. Наприклад:
$ 1902: BD 37 14: LDA $ 1437, X 1905 $: 85 03: STA $ 03 1907 $: 85 09: STA $ 09 $ 1909: CA: DEX $ 190A: 10: BPL $ 1902
Вищенаведений біт коду, якщо він зберігається за адресою 1900 доларів у картриджі Atari 2600, відображатиме ряд рядків у різних кольорах, зібраних із таблиці, що починається з адреси 1437 доларів. На деяких інструментах введення адреси разом з крайньою правою частиною рядка вгорі зберігатиме для пам’яті значення, показані в середньому стовпці, і починає наступний рядок із наступної адреси. Вводити код у цій формі було набагато зручніше, ніж вводити шістнадцятку, але треба було знати точні адреси всього.
Більшість асемблерів дозволяють використовувати символічні адреси. Наведений вище код буде написаний більше як:
rainbow_lp: lda ColorTbl, х ста WSYNC ста КОЛУБК декс bpl rainbow_lp
Асемблер автоматично відрегулює інструкцію LDA, щоб він посилався на будь-яку адресу, відображену на ярлику ColorTbl. Використання цього стилю асемблера набагато простіше писати та редагувати код, ніж це було б можливо, якби довелося вводити вручну та підтримувати всі адреси.
Вихідний код, код складання, машинний код, код об'єкта, байт-код, виконуваний файл та файл бібліотеки.
Усі ці терміни часто дуже бентежать для більшості людей через те, що вони думають, що вони взаємовиключні . Дивіться схему, щоб зрозуміти їх відносини. Опис кожного терміна наведено нижче.
Інструкції з легкої для читання (програмування) мови
Інструкції, написані мовою високого рівня (програмування),
наприклад, програмами C, C ++ та Java
Інструкції, написані мовою складання (різновид мови програмування низького рівня). Як перший крок процесу компіляції, код високого рівня перетворюється в цю форму. Це код складання, який потім перетворюється на фактичний машинний код. У більшості систем ці два етапи виконуються автоматично як частина компіляційного процесу.
наприклад, program.asm
Продукт процесу компіляції. Він може бути у вигляді машинного коду або байтового коду.
наприклад, file.o
Інструкції з машинної мови.
наприклад, a.out
Інструкція в проміжному вигляді, яку може виконати перекладач, такий як JVM.
наприклад, файл класу Java
Продукт зв’язування процесу. Вони є машинним кодом, який може бути безпосередньо виконаний процесором.
наприклад, файл .exe.
Зауважте, що в деяких контекстах файл, що містить байт-код або інструкції з мов скриптів, також може вважатися виконаним.
Деякий код компілюється в цю форму з різних причин, таких як повторне використання та пізніше використовується виконуваними файлами.
cc1
виконуваного файлу). Я думаю, що коло асфальту повинно простягати ліву частину кола "джерело", тому що деякий асм - це лише асм, а не джерело. Звичайно, це ніколи не об'єктний код, але деякий ASM - це крок на шляху від джерела до об'єктних файлів.
Код складання обговорюється тут .
"Мова збірки - це мова низького рівня для програмування комп'ютерів. Він реалізує символічне зображення числових машинних кодів та інших констант, необхідних для програмування певної архітектури процесора."
Тут розглядається машинний код .
"Код машини або мова машини - це система інструкцій та даних, що виконуються безпосередньо центральним процесорним блоком комп'ютера."
В основному, код асемблера - це мова, і він перекладається на об'єктний код (власний код, який працює центральний процесор) асемблером (аналогічним компілятору).
Я думаю, що це основні відмінності
Читання може зробити код поліпшеним або заміненим через 6 місяців після його створення з літними зусиллями. швидше виконання.
Сьогодні комп'ютери IMO досить швидкі, щоб програміст міг швидко виконувати програму OOP.
Збірка - це короткий описовий термін, який люди можуть зрозуміти, що їх можна безпосередньо перевести в машинний код, який фактично використовує процесор.
Незважаючи на те, що людина дещо зрозуміла, Ассемблер все ще низький. Щоб зробити щось корисне, потрібно багато коду.
Тому замість цього ми використовуємо мови вищого рівня, такі як C, BASIC, FORTAN (ОК, я знаю, що я датувався). При компілюванні вони виробляють об'єктний код. Ранні мови мали машинну мову як їх об'єктний код.
У багатьох мовах сьогодні такі JAVA і C # зазвичай компілюються в байт-код, який не є машинним кодом, а тим, який легко інтерпретувати під час виконання для створення машинного коду.
Вихідні файли ваших програм компілюються в об'єктивні файли, а потім лінкер пов'язує ці об’єктні файли разом, створюючи виконуваний файл, включаючи машинні коди вашої архітектури.
І об'єктний, і виконуваний файл включає машинний код архітектури у вигляді друкованих та недрукувальних символів, коли він відкривається текстовим редактором.
Тим не менш, дихотомія між файлами полягає в тому, що об'єктні файли можуть містити невирішені зовнішні посилання (наприклад printf
, наприклад). Отже, може знадобитися зв’язати його з іншими файлами об'єктів .. Тобто невирішені зовнішні посилання потрібні для вирішення, щоб отримати гідний виконуваний виконуваний файл, зв’язавшись з іншими об’єктними файлами, такими як бібліотека часу виконання C / C ++ .