Яка різниця між складеною та інтерпретованою мовою?


118

Прочитавши деякі матеріали на цю тему, я все ще не впевнений, у чому різниця між складеною мовою та інтерпретованою мовою. Мені сказали, що це одна з відмінностей між Java та JavaScript. Хтось, будь ласка, допоможе мені зрозуміти це?

Відповіді:


165

Яка різниця між складеною та інтерпретованою мовою?

Різниця не в мові; це в реалізації .

Отримавши це з моєї системи, ось відповідь:

  • У складеній реалізації оригінальна програма перекладається на рідні інструкції з машини, які виконуються безпосередньо апаратними засобами.

  • У інтерпретованій реалізації оригінальна програма перекладається на щось інше. Інша програма, яка називається "перекладач", потім вивчає "щось інше" і виконує всі необхідні дії. Залежно від мови та її реалізації існують різноманітні форми «чогось іншого». Від більш популярних до менш популярних може бути "щось інше"

    • Бінарні інструкції для віртуальної машини, яку часто називають байт-кодом , як це робиться в Lua, Python, Ruby, Smalltalk та багатьох інших системах (підхід був популяризований в 1970-х P-системою UCSD та UCSD Pascal)

    • Деревоподібне представлення оригінальної програми, наприклад дерева абстрактних синтаксисів, як це робиться для багатьох прототипів чи освітніх тлумачів

    • Токенізоване представлення вихідної програми, подібне до Tcl

    • Символи вихідної програми, як це було зроблено в MINT та TRAC

Одне, що ускладнює проблему, - це те, що можна перекласти (компілювати) байт-код в інструкції до рідної машини . Таким чином, успішна цілісна реалізація може з часом придбати компілятор. Якщо компілятор працює динамічно, поза кадром, його часто називають щойно введеним компілятором або компілятором JIT. JIT розроблені для Java, JavaScript, Lua, і я смію говорити для багатьох інших мов. У цей момент у вас може бути гібридна реалізація, в якій певний код інтерпретується, а якийсь код складається.


7
Сер, у мене є такі питання 1. На якій мові написано те, що "щось інше"? 2. А в контексті JavaScript, чи змінюється "щось інше" від браузера до браузера? 3. Скажіть, мій сценарій працює в Google Chrome і Internet Explorer, чи інтерпретується він однаково в обох браузерах?
JavaHopper

@Norman це було дивним поясненням. Однак ось кілька плутанин, які я все ще маю. У скомпільованій реалізації оригінальна програма перетворюється на вказівки щодо рідної машини. Як це? Наприклад, я думав, що, наприклад, C після компіляції створить код складання, який знову-таки все-таки потрібно зібрати за допомогою власного асемблера в машинний код базової машини. То як же це відрізняється від VM (python або JVM тощо), що робить те саме у випадку інтерпретованої мови?
qre0ct

58

Java та JavaScript є досить поганим прикладом для демонстрації цієї різниці , оскільки обидві є інтерпретованими мовами . Java (інтерпретовано) та C (або C ++) (компілюється) могли бути кращим прикладом.

Чому закреслений текст? Як правильно вказано у цій відповіді , інтерпретована / складена стосується конкретної реалізації мови, а не мови як такої . Хоча твердження типу "C - це компільована мова", як правило, правдиві, ніщо не може зупинити когось із написання перекладача мови C. Насправді перекладачі для C дійсно існують .

В основному, компільований код може виконуватися безпосередньо процесором комп'ютера. Тобто виконуваний код вказаний у "рідній" мові процесора ( мові збірки ).

Код інтерпретованих мов, однак, повинен бути перекладений під час виконання з будь-якого формату в інструкції з процесорної машини. Цей переклад робиться перекладачем.

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


8
Ява інтерпретується? З вікіпедії: "Програми Java зазвичай компілюються в байт-код (файл класу), який може працювати на будь-якій віртуальній машині Java (JVM) незалежно від архітектури комп'ютера."
Особа

6
@ Персонман, який технічно "інтерпретується", оскільки JVM виконує код, а не сама ОС. Її дійсно смислова різниця більше, як можна сказати, що складність сучасних ОС робить різницю в основному неактуальною для більшості ситуацій. Ви говорите про різницю між ОС, яка запускає додаток, і ОС, що працює з додатком, який працює з кодом.
GrayWizardx

5
Я думаю, ви маєте на увазі, що файли класу самі інтерпретуються Java VM. Це начебто розумно, але джерело Java справді збирається в байт-код Java VM. Ви можете створити фізичну машину Java, яка не вимагатиме від VM інтерпретувати її в машинний код іншої архітектури. Тож видається точнішим сказати, що Java компілюється. Все-таки, це хороший приклад того, як розрізнення є заплутаним і своєрідним довільним. Зрештою, складений C інтерпретується процесором, правда?
Особа

13
Java є досить поганим прикладом або компільованої, або інтерпретованої мови, оскільки вона по суті є обома. Якби я збирався робити порівняння, я б пішов з C і Lisp, щоб уникнути плутанини.
Білл Ящірка

7
@stakx - фактично байт-коди Java зазвичай компілюються в рідний код компілятором JIT. Єдиний спосіб отримати чисту поведінку перекладача - це явно вимкнути компілятор JIT при запуску JVM.
Стівен C

15

Ось основна різниця між компілятором та мовою перекладача.

Мова компілятора

  • Приймає всю програму як єдиний вхід і перетворює її в об'єктний код, який зберігається у файлі.
  • Створюється проміжний код об'єкта
  • наприклад: C, C ++
  • Скомпільовані програми запускаються швидше, оскільки компіляція проводиться перед виконанням.
  • Потреба в пам'яті більше обумовлена ​​створенням об'єктного коду.
  • Помилка відображається після складання всієї програми
  • Вихідний код --- Компілятор --- Код машини --- Вихід

Мова перекладача:

  • Приймає одну інструкцію як єдиний вхід і виконує інструкції.
  • Проміжний код об'єкта НЕ генерується
  • наприклад: Perl, Python, Matlab
  • Інтерпретовані програми працюють повільніше, оскільки компіляція та виконання відбуваються одночасно.
  • Потреба в пам'яті менша.
  • Помилка відображається для кожної інструкції.
  • Вихідний код --- Перекладач --- Вивід

5

Компілятор, як правило, зчитує комп'ютерний код вищого рівня та перетворює його в або п-код, або в нативний машинний код. Інтерпретатор працює безпосередньо з p-коду або інтерпретованого коду, такого як Basic або Lisp. Зазвичай компільований код працює набагато швидше, компактніший і вже знайшов усі синтаксичні помилки та багато неправомірних помилок посилань. Інтерпретований код виявляє такі помилки лише після того, як програма намагається інтерпретувати код, що стосується. Інтерпретований код часто корисний для простих додатків, які будуть використовуватися лише один раз або максимум пару разів, а може навіть для прототипування. Складений код краще для серйозних програм. Спочатку компілятор приймає всю програму, перевіряє на помилки, компілює її, а потім виконує. В той час, як перекладач робить цей рядок за рядком, тому він бере один рядок, перевіряє його на помилки,

Якщо вам потрібна додаткова інформація, просто "Google" для "різниці між компілятором і перекладачем".


3
Гм, не впевнений, де у вас щось із цього, крім перших двох тверджень. Технічно це було правдою кілька поколінь тому з багатьма інтерпретованими мовами, але залежно від платформи та уваги до деталей можна інтерпретувати код, який виконує близький до або навіть скомпільований код для певної діяльності.
GrayWizardx

Маючи на увазі, що такі мови, як Java, C # та JavaScript, які сьогодні майже заполоняють весь світ програмування, було б несправедливо сказати, що «Скомпільований код краще для серйозних програм».
Сисір

2

Це дуже мутне відмінність, і насправді це не властивість самої мови, а програми, яку ви використовуєте для виконання коду на цій мові.

Однак більшість мов використовуються в основному в тій чи іншій формі, і так, Java по суті завжди компілюється, тоді як JavaScript по суті завжди інтерпретується.

Скомпілювати вихідний код - це запустити на ньому програму, яка генерує двійковий, виконуваний файл, який при запуску має поведінку, визначену джерелом. Наприклад, javac компілює файли .java, що читаються людиною, у машиночитані файли .class.

Для інтерпретації вихідного коду запустіть на ньому програму, яка виробляє задану поведінку одразу, не створюючи файл посередника. Наприклад, коли ваш веб-браузер завантажує stackoverflow.com, він інтерпретує купу javascript (який ви можете подивитися, переглядаючи джерело сторінки) і створює безліч приємних ефектів, які мають ці сторінки - наприклад, подання заявок або маленький сповіщувач бруски поперек.


У той час як Java спочатку переводиться в байт-код і лише під час виконання JVM перетворює його в машинний код; чи правильно сказати, що вона складена і не інтерпретована?
Сисір

1
Я думаю, ви можете сказати, що байт-код Java інтерпретується, звичайно, але ніхто не пише байт-код Java. Сама Java зазвичай компілюється в байт-код.
Особа

2

Інтерпретована мова виконується під час виконання відповідно до таких інструкцій, як у сценарії оболонок, а компільована мова - це та, яка компілюється (змінена на мову складання, яку може зрозуміти процесор), а потім виконується як у c ++.


0

Як уже говорилося, складені та інтерпретовані є специфічними для реалізації мови програмування; вони не притаманні мові. Наприклад, є перекладачі С.

Однак ми можемо (і на практиці це робимо) класифікувати мови програмування на основі найпоширенішої (іноді канонічної) реалізації. Наприклад, ми кажемо, що С складається.

По-перше, ми повинні без неоднозначності визначити інтерпретаторів та компіляторів:

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

Компілятор від X до Y являє собою програма (або машина, або просто якийсь - то механізм в цілому) , який переводить будь-яку програму р з деякого мови X в семантичний еквівалентну програмі р » на деякій мові Y таким чином , що інтерпретує р ' з перекладачем Y дасть ті ж результати , і мають ті ж ефекти , як інтерпретувати р з перекладачем X .

Зауважте, що з точки зору програміста, процесори є машинними перекладачами відповідної рідної мови машини.

Тепер ми можемо зробити орієнтовну класифікацію мов програмування на 3 категорії залежно від її найпоширенішої реалізації:

  • Жорстко скомпільовані мови: Коли програми повністю скомпільовані на машинній мові. Єдиний використовуваний перекладач - це процесор. Приклад: Зазвичай для запуску програми на C складається вихідний код на машинній мові, який потім виконується центральним процесором.
  • Інтерпретовані мови: коли немає компіляції жодної частини оригінальної програми на машинну мову. Іншими словами, не створюється новий машинний код; виконується лише існуючий машинний код. Необхідно також використовувати інтерпретатор, крім CPU (як правило, програму). Приклад: У канонічній реалізації Python вихідний код складається спочатку в байт-код Python, а потім цей байт-код виконується CPython, програмою інтерпретатора для байт-коду Python .
  • М'які мови компіляції: Коли використовується інший інтерпретатор, крім процесора, але також частини оригінальної програми можуть бути складені на машинній мові. Це випадок Java, де вихідний код спочатку збирається в байт-код, а потім байт-код може бути інтерпретований інтерпретатором Java та / або подальший компілятор компілятором JIT.

Іноді м'які та жорсткі компільовані мови відносяться до просто складених, тому C #, Java, C, C ++ вважаються компільованими.

У рамках цієї категоризації JavaScript раніше був інтерпретованою мовою, але це було багато років тому. Сьогодні це JIT-компільований на рідній машинній мові у більшості основних реалізацій JavaScript, тому я б сказав, що він потрапляє у м'які компільовані мови.

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