Здесь задают много вопросов о интерпретируемых и скомпилированных языковых реализациях. Мне интересно, имеет ли это различие какое-либо значение. (На самом деле вопросы обычно касаются языков, но они действительно думают о наиболее популярных реализациях этих языков).
Сегодня практически ни одна реализация строго не интерпретируется. т.е. почти никто не анализирует и не запускает код по одной строке за раз. Кроме того, реализация, которая компилируется в машинный код, также становится все менее распространенной. Компиляторы все чаще нацелены на какую-то виртуальную машину.
Фактически, большинство реализаций сходятся на одной базовой стратегии. Компилятор создает байт-код, который интерпретируется или компилируется в собственный код через JIT. Это действительно смесь традиционных идей компиляции и интерпретации.
Поэтому я спрашиваю: есть ли полезное различие между интерпретируемыми реализациями и скомпилированной реализацией в наши дни?
источник
P-code
был введен в 1966 году первым. IBM Aix существует с 1986 года.Ответы:
Важно помнить, что интерпретация и компиляция - это не просто альтернативы друг другу. В конце концов, любая написанная вами программа (в том числе скомпилированная в машинный код) интерпретируется. Интерпретировать код просто означает взять набор инструкций и вернуть ответ.
С другой стороны, компиляция означает преобразование программы на одном языке на другой. Обычно предполагается, что когда происходит компиляция, код компилируется на язык «более низкого уровня» (например, машинный код, какой-то байт-код виртуальной машины и т. Д.). Этот скомпилированный код все еще интерпретируется позже.
Что касается вашего вопроса о том, есть ли полезное различие между интерпретируемыми и скомпилированными языками, я лично считаю, что каждый должен иметь общее представление о том, что происходит с кодом, который они пишут во время интерпретации. Итак, если их код JIT-компилируется, или кешируется байт-кодом и т. Д., Программист должен, по крайней мере, иметь общее представление о том, что это значит.
источник
Различие глубоко осмысленное, потому что скомпилированные языки ограничивают семантику способами, которые необязательно интерпретируются языками. Некоторые методы интерпретации очень трудно (практически невозможно) компилировать.
Интерпретированный код может выполнять такие вещи, как генерация кода во время выполнения и придание этому коду видимости в лексических привязках существующей области. Это один пример. Другое заключается в том, что интерпретаторы могут быть расширены интерпретируемым кодом, который может контролировать способ его оценки. Это основа для древних Lisp "fexprs": функций, которые вызываются с неоцененными аргументами и решают, что с ними делать (имея полный доступ к необходимой среде для обхода кода и оценки переменных и т. Д.). В скомпилированных языках вы не можете использовать эту технику; вместо этого вы используете макросы: функции, которые вызываются во время компиляции с неоцененными аргументами и переводят код, а не интерпретируют.
Некоторые языковые реализации построены вокруг этих методов; их авторы отвергают компиляцию как важную цель и предпочитают такую гибкость.
Интерпретация всегда будет полезна в качестве метода начальной загрузки компилятора. Для конкретного примера посмотрите на CLISP (популярная реализация Common Lisp). CLISP имеет компилятор, который написан сам по себе. Когда вы собираете CLISP, этот компилятор интерпретируется на ранних этапах сборки. Он используется для компиляции, а затем после компиляции выполняется компиляция.
Без ядра интерпретатора вам нужно было бы загрузиться с некоторым существующим Lisp, как это делает SBCL.
С устным переводом вы можете разработать язык с нуля, начиная с ассемблера. Разработайте базовые процедуры ввода-вывода и ядра, а затем напишите eval, все еще машинный язык. Как только вы получите eval, напишите на языке высокого уровня; ядро машинного кода выполняет оценку. Используйте эту возможность, чтобы расширить библиотеку многими другими подпрограммами и написать также компилятор. Используйте компилятор для компиляции этих подпрограмм и сам компилятор.
Интерпретация: важная ступенька на пути, ведущем к компиляции!
источник
На самом деле многие реализации языков все еще строго интерпретируются, вы просто можете не знать о них. Вот некоторые из них: языки оболочки UNIX, оболочки Windows cmd и PowerScript, Perl, awk, sed, MATLAB, Mathematica и так далее.
источник
Я думаю: Абсолютно Да .
Действительно, C ++ стремится портировать в домен компилятора некоторую концепцию высокого уровня, которая обычно передается интерпретаторам, но остается на стороне меньшинства ...
источник
Полезное различие: интерпретируемые программы могут изменять себя, добавляя или изменяя функции во время выполнения.
источник