Резюме, яке я даю нижче, базується на "Укладачах, принципах, техніці та інструментах", Ахо, Лам, Сетхі, Уллман, (Pearson International Edition, 2007), сторінки 1, 2, з додаванням деяких власних ідей.
Два основні механізми обробки програми - складання та інтерпретація .
Компіляція приймає як вхід вихідну програму на даній мові та виводить цільову програму цільовою мовою.
source program --> | compiler | --> target program
Якщо мова мови є машинним кодом, він може бути виконаний безпосередньо на деякому процесорі:
input --> | target program | --> output
Компіляція включає сканування та переклад усієї програми введення (або модуля) і не передбачає її виконання.
Інтерпретація приймає як вхід вихідну програму та її вхід і виробляє вихід вихідної програми
source program, input --> | interpreter | --> output
Інтерпретація зазвичай включає обробку (аналіз та виконання) програми по одній заяві за раз.
На практиці багато мовних процесорів використовують поєднання двох підходів. Наприклад, програми Java спочатку перекладаються (компілюються) в проміжну програму (байт-код):
source program --> | translator | --> intermediate program
вихід цього кроку виконується (інтерпретується) віртуальною машиною:
intermediate program + input --> | virtual machine | --> output
Щоб ще більше ускладнити речі, JVM може виконати своєчасну компіляцію під час виконання для перетворення байтового коду в інший формат, який потім виконується.
Крім того, навіть при компіляції на машинну мову є інтерпретатор, який працює за вашим бінарним файлом, який реалізований базовим процесором. Тому навіть у цьому випадку ви використовуєте гібрид компіляції + інтерпретації.
Отже, реальні системи використовують суміш цих двох, тому важко сказати, чи є даний мовний процесор компілятором чи перекладачем, оскільки він, ймовірно, використовуватиме обидва механізми на різних етапах його обробки. У цьому випадку, мабуть, було б доцільніше використовувати інший, більш нейтральний термін.
Тим не менш, складання та інтерпретація - це два різних види обробки, як описано на діаграмах вище,
Щоб відповісти на початкові запитання.
Компілятор створив би машинну мову, яка працює безпосередньо на фізичному обладнанні?
Не обов'язково компілятор перекладає програму, написану для машини M1, на еквівалентну програму, написану для машини M2. Цільова машина може бути реалізована апаратно або бути віртуальною машиною. Концептуально різниці немає. Важливим моментом є те, що компілятор розглядає фрагмент коду і перекладає його на іншу мову, не виконуючи його.
Отже, перекладач не виробляє машинну мову, але компілятор робить це для свого введення?
Якщо, виробляючи, ви посилаєтесь на вихід, тоді компілятор виробляє цільову програму, яка може бути машинною мовою, інтерпретатор цього не робить.