Прежде всего, язык программирования может быть как интерпретированным, так и скомпилированным. Интерпретация и компиляция - это просто методы генерации исполняемого кода из исходного кода. При использовании интерпретатора исходный код читается и интерпретируется интерпретатором, который затем выполняет код так, как он его интерпретирует. Компилятор, с другой стороны, читает исходный код и генерирует исполняемый двоичный файл из исходного кода, так что программа может запускаться как отдельный процесс независимо.
Теперь, прежде чем кому-то интересно ... Да, C / C ++ / C # / Java можно интерпретировать, и да, скрипты JavaScript и Bash можно компилировать. Есть ли рабочие интерпретаторы или компиляторы для этих языков - другой вопрос.
Теперь, чтобы фактически ответить на вопрос, когда мы будем использовать «интерпретируемый язык» вместо «скомпилированного языка». Сам вопрос несколько сбивает с толку, но я предполагаю, что это означает, когда следует предпочесть интерпретацию компиляции. Одним из недостатков компиляции является то, что она генерирует некоторые издержки из-за процесса компиляции - исходный код должен быть скомпилирован в исполняемый машинный код, поэтому он не подходит для задач, которые требуют минимальной задержки при вызове исходного кода для выполнения программы. С другой стороны, скомпилированный исходный код почти всегда быстрее, чем эквивалентный интерпретируемый исходный код, из-за накладных расходов, вызванных интерпретацией кода. Переводчики, с другой стороны, могут вызывать и запускать исходный код с очень небольшими накладными расходами, но за счет производительности во время выполнения.
В конце концов, почти невозможно упомянуть какие-либо конкретные случаи использования, когда нужно отдавать предпочтение одному за другим, но, например, один (на мой взгляд, очень нереальный) случай, когда исходный код программы динамически изменяется между вызовами программы и накладные расходы на компиляцию слишком велики. высоко для того, чтобы быть жизнеспособным выбором. В этом случае интерпретация исходного кода вместо компиляции, вероятно, была бы желательна.
Тем не менее, есть нечто, что можно рассматривать как реальный пример: исходный код hidnig после развертывания. С роднойСкомпилированный код разработчик развертывает исполняемым программным кодом Macine и данными. При интерпретированном коде должен быть развернут сам исходный код, который затем может быть проверен и подвергнут повторному проектированию с гораздо меньшими усилиями, чем то, что требуется для обратного инжиниринга собственного машинного кода. Единственным исключением из этого являются такие языки, как C # и Java, которые компилируются в непосредственный язык / байт-код (MSIL для C # и Java-байт-код для Java), который затем развертывается и компилируется «вовремя» во время выполнения, что-то вроде интерпретатора. Однако существуют так называемые декомпиляторы для MSIL и Java Bytecode, которые могут воссоздать исходный исходный код с относительно хорошей точностью, и, таким образом, обратное проектирование таких продуктов гораздо более тривиально, чем продукты обратного проектирования, которые развернуты в собственном машинном коде.