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