Прочитавши деякі матеріали на цю тему, я все ще не впевнений, у чому різниця між складеною мовою та інтерпретованою мовою. Мені сказали, що це одна з відмінностей між Java та JavaScript. Хтось, будь ласка, допоможе мені зрозуміти це?
Прочитавши деякі матеріали на цю тему, я все ще не впевнений, у чому різниця між складеною мовою та інтерпретованою мовою. Мені сказали, що це одна з відмінностей між Java та JavaScript. Хтось, будь ласка, допоможе мені зрозуміти це?
Відповіді:
Яка різниця між складеною та інтерпретованою мовою?
Різниця не в мові; це в реалізації .
Отримавши це з моєї системи, ось відповідь:
У складеній реалізації оригінальна програма перекладається на рідні інструкції з машини, які виконуються безпосередньо апаратними засобами.
У інтерпретованій реалізації оригінальна програма перекладається на щось інше. Інша програма, яка називається "перекладач", потім вивчає "щось інше" і виконує всі необхідні дії. Залежно від мови та її реалізації існують різноманітні форми «чогось іншого». Від більш популярних до менш популярних може бути "щось інше"
Бінарні інструкції для віртуальної машини, яку часто називають байт-кодом , як це робиться в Lua, Python, Ruby, Smalltalk та багатьох інших системах (підхід був популяризований в 1970-х P-системою UCSD та UCSD Pascal)
Деревоподібне представлення оригінальної програми, наприклад дерева абстрактних синтаксисів, як це робиться для багатьох прототипів чи освітніх тлумачів
Токенізоване представлення вихідної програми, подібне до Tcl
Символи вихідної програми, як це було зроблено в MINT та TRAC
Одне, що ускладнює проблему, - це те, що можна перекласти (компілювати) байт-код в інструкції до рідної машини . Таким чином, успішна цілісна реалізація може з часом придбати компілятор. Якщо компілятор працює динамічно, поза кадром, його часто називають щойно введеним компілятором або компілятором JIT. JIT розроблені для Java, JavaScript, Lua, і я смію говорити для багатьох інших мов. У цей момент у вас може бути гібридна реалізація, в якій певний код інтерпретується, а якийсь код складається.
Java та JavaScript є досить поганим прикладом для демонстрації цієї різниці , оскільки обидві є інтерпретованими мовами . Java (інтерпретовано) та C (або C ++) (компілюється) могли бути кращим прикладом.
Чому закреслений текст? Як правильно вказано у цій відповіді , інтерпретована / складена стосується конкретної реалізації мови, а не мови як такої . Хоча твердження типу "C - це компільована мова", як правило, правдиві, ніщо не може зупинити когось із написання перекладача мови C. Насправді перекладачі для C дійсно існують .
В основному, компільований код може виконуватися безпосередньо процесором комп'ютера. Тобто виконуваний код вказаний у "рідній" мові процесора ( мові збірки ).
Код інтерпретованих мов, однак, повинен бути перекладений під час виконання з будь-якого формату в інструкції з процесорної машини. Цей переклад робиться перекладачем.
Інший спосіб сказати , що інтерпретовані мови коду перекладаються на машинні інструкції покроково під час виконання програми, тоді як компільовані мови перекладають код перед виконанням програми.
Ось основна різниця між компілятором та мовою перекладача.
Мова компілятора
Мова перекладача:
Компілятор, як правило, зчитує комп'ютерний код вищого рівня та перетворює його в або п-код, або в нативний машинний код. Інтерпретатор працює безпосередньо з p-коду або інтерпретованого коду, такого як Basic або Lisp. Зазвичай компільований код працює набагато швидше, компактніший і вже знайшов усі синтаксичні помилки та багато неправомірних помилок посилань. Інтерпретований код виявляє такі помилки лише після того, як програма намагається інтерпретувати код, що стосується. Інтерпретований код часто корисний для простих додатків, які будуть використовуватися лише один раз або максимум пару разів, а може навіть для прототипування. Складений код краще для серйозних програм. Спочатку компілятор приймає всю програму, перевіряє на помилки, компілює її, а потім виконує. В той час, як перекладач робить цей рядок за рядком, тому він бере один рядок, перевіряє його на помилки,
Якщо вам потрібна додаткова інформація, просто "Google" для "різниці між компілятором і перекладачем".
Це дуже мутне відмінність, і насправді це не властивість самої мови, а програми, яку ви використовуєте для виконання коду на цій мові.
Однак більшість мов використовуються в основному в тій чи іншій формі, і так, Java по суті завжди компілюється, тоді як JavaScript по суті завжди інтерпретується.
Скомпілювати вихідний код - це запустити на ньому програму, яка генерує двійковий, виконуваний файл, який при запуску має поведінку, визначену джерелом. Наприклад, javac компілює файли .java, що читаються людиною, у машиночитані файли .class.
Для інтерпретації вихідного коду запустіть на ньому програму, яка виробляє задану поведінку одразу, не створюючи файл посередника. Наприклад, коли ваш веб-браузер завантажує stackoverflow.com, він інтерпретує купу javascript (який ви можете подивитися, переглядаючи джерело сторінки) і створює безліч приємних ефектів, які мають ці сторінки - наприклад, подання заявок або маленький сповіщувач бруски поперек.
Інтерпретована мова виконується під час виконання відповідно до таких інструкцій, як у сценарії оболонок, а компільована мова - це та, яка компілюється (змінена на мову складання, яку може зрозуміти процесор), а потім виконується як у c ++.
Як уже говорилося, складені та інтерпретовані є специфічними для реалізації мови програмування; вони не притаманні мові. Наприклад, є перекладачі С.
Однак ми можемо (і на практиці це робимо) класифікувати мови програмування на основі найпоширенішої (іноді канонічної) реалізації. Наприклад, ми кажемо, що С складається.
По-перше, ми повинні без неоднозначності визначити інтерпретаторів та компіляторів:
Інтерпретатор для мови X являє собою програму (або машина, або просто якийсь - то механізм в цілому) , який виконує будь-яку програму р , написаний на мові X таким чином, що він виконує ефекти і оцінює результати , як це наказано специфікацією X .
Компілятор від X до Y являє собою програма (або машина, або просто якийсь - то механізм в цілому) , який переводить будь-яку програму р з деякого мови X в семантичний еквівалентну програмі р » на деякій мові Y таким чином , що інтерпретує р ' з перекладачем Y дасть ті ж результати , і мають ті ж ефекти , як інтерпретувати р з перекладачем X .
Зауважте, що з точки зору програміста, процесори є машинними перекладачами відповідної рідної мови машини.
Тепер ми можемо зробити орієнтовну класифікацію мов програмування на 3 категорії залежно від її найпоширенішої реалізації:
Іноді м'які та жорсткі компільовані мови відносяться до просто складених, тому C #, Java, C, C ++ вважаються компільованими.
У рамках цієї категоризації JavaScript раніше був інтерпретованою мовою, але це було багато років тому. Сьогодні це JIT-компільований на рідній машинній мові у більшості основних реалізацій JavaScript, тому я б сказав, що він потрапляє у м'які компільовані мови.