Разницы нет, потому что «скомпилированный язык программирования» и «интерпретируемый язык программирования» не являются осмысленными понятиями. Любой язык программирования, и я имею в виду любой, может быть интерпретирован или скомпилирован. Таким образом, интерпретация и компиляция - это методы реализации, а не атрибуты языков.
Интерпретация - это метод, при котором другая программа, интерпретатор, выполняет операции от имени интерпретируемой программы для ее запуска. Если вы можете вообразить, что читаете программу и делаете то, что она говорит, шаг за шагом, скажем, на бумаге, это то, что делает переводчик. Распространенной причиной для интерпретации программы является то, что интерпретаторы пишутся относительно легко. Другая причина заключается в том, что интерпретатор может отслеживать, что программа пытается сделать во время работы, чтобы обеспечить соблюдение политики, скажем, безопасности.
Компиляция - это метод, при котором программа, написанная на одном языке («исходный язык»), переводится в программу на другом языке («объектный язык»), что, как мы надеемся, означает то же самое, что и исходная программа. При выполнении перевода, как правило, компилятор также пытается преобразовать программу таким образом, чтобы сделать объектную программу быстрее (без изменения ее значения!). Распространенная причина для компиляции программы заключается в том, что есть хороший способ быстро запускать программы на объектном языке без дополнительных затрат на интерпретацию исходного языка.
Исходя из приведенных выше определений, вы, возможно, догадались, что эти два метода реализации не являются взаимоисключающими и даже могут быть взаимодополняющими. Традиционно, объектным языком компилятора был машинный код или что-то подобное, что относится к любому количеству языков программирования, понимаемых конкретными процессорами компьютера. Затем машинный код запускается «на металле» (хотя, если присмотреться, можно увидеть, что «металл» работает во многом как интерпретатор). Однако сегодня очень распространено использование компилятора для генерации объектного кода, который должен интерпретироваться - например, именно так Java работала (а иногда и до сих пор) работает. Есть компиляторы, которые переводят другие языки в JavaScript, который затем часто запускают в веб-браузере, который может интерпретировать JavaScript, или скомпилируйте виртуальную машину или собственный код. У нас также есть интерпретаторы машинного кода, которые можно использовать для эмуляции одного типа оборудования на другом. Или можно использовать компилятор для генерации объектного кода, который затем является исходным кодом для другого компилятора, который может даже скомпилировать код в памяти как раз вовремя для его запуска, что в свою очередь. , , Вы поняли идею. Есть много способов объединить эти понятия.