Перш за все, мова програмування може бути інертно і компільована. Інтерпретація та компіляція - це лише методи генерації виконуваного коду з вихідного коду. За допомогою інтерпретатора вихідний код читається та інтерпретується інтерпретатором, який потім виконує код під час його інтерпретації. З іншого боку, компілятор зчитує вихідний код і генерує виконуваний двійковий файл із вихідного коду - так що програма може запускатися як окремий процес незалежно.
Тепер, перш ніж хтось задається питанням ... Так, C / C ++ / C # / Java можна інтерпретувати, і так, сценарії JavaScript та Bash можуть бути складені. Чи є перекладачі чи компілятори для цих мов - інше питання.
Тепер фактично відповісти на питання, коли ми будемо використовувати "інтерпретовану мову" над "складеною мовою". Питання саме по собі дещо заплутане, але я припускаю, що це означає, коли віддавати перевагу інтерпретації над компіляцією. Одним із мінусів компіляції є те, що він генерує деяку накладну витрату завдяки процесу компіляції - вихідний код повинен бути зібраний до виконуваного машинного коду, тому він не підходить для завдань, які вимагають мінімальної затримки при виклику вихідного коду для виконання програми. З іншого боку, компільований вихідний код майже завжди швидший, ніж еквівалентний інтерпретований вихідний код через накладні витрати, спричинені інтерпретацією коду. Інтерпретатори з іншого боку можуть викликати і запускати вихідний код з дуже маленькими викликами накладних витрат, але за рахунок виконання робочого часу.
Зрештою, майже неможливо згадати будь-які певні випадки використання, коли слід віддати перевагу один за одним, але, наприклад, один (на мій підкреслення дуже нереальний) випадок, коли вихідний код програми динамічно змінюється між викликами програми і надмірні витрати на компіляцію занадто високий, щоб він був життєздатним вибором. У цьому випадку, мабуть, було б бажано інтерпретувати вихідний код замість компіляції.
Однак є щось, що можна вважати прикладом у реальному світі: вихідний код hidnig після розгортання. З ріднимСкомпільований код розробник розгортає виконуваний макін-код програми та даних. З інтерпретованим кодом повинен бути розгорнутий сам вихідний код, який потім може бути перевірений та реінжинірований з набагато меншими зусиллями, ніж те, що стосується реверсивного коду машинного коду. Єдиним винятком цього є такі мови, як C # і Java, які компілюються до прямої мови / байт-коду (MSIL для C # та Java-байт-код для Java), який потім розгортається і компілюється "вчасно" під час виконання, як і інтерпретатор. Однак існують так звані декомпілятори для MSIL та Java Bytecode, які можуть реконструювати оригінальний вихідний код з відносно хорошою точністю, і як така реверсивна інженерія таких продуктів набагато більш тривіальна, ніж продукти реверсивної інженерії, які розгорнуті в рідному машинному коді.