В чем разница между скомпилированным и интерпретированным языком? - PullRequest
107 голосов
/ 17 апреля 2010

После прочтения некоторого материала на эту тему я все еще не уверен, в чем разница между скомпилированным языком и интерпретируемым языком. Мне сказали, что это одно из различий между Java и JavaScript. Кто-нибудь, пожалуйста, помогите мне понять это?

Ответы [ 6 ]

153 голосов
/ 17 апреля 2010

В чем разница между скомпилированным и интерпретируемым языком?

Разница в языке не ;это в реализации .

Получив это из моей системы, вот ответ:

  • В скомпилированной реализации,исходная программа преобразуется в собственные машинные инструкции, которые выполняются непосредственно аппаратными средствами.

  • В интерпретированной реализации исходная программа переводится во что-то другое.Другая программа, называемая «переводчик», затем проверяет «что-то еще» и выполняет все необходимые действия.В зависимости от языка и его реализации, существует множество форм «чего-то еще».От более популярного к менее популярному «что-то еще» может быть

    • Двоичные инструкции для виртуальной машины, часто называемые байт-кодом , как это делается в Lua, Python,Ruby, Smalltalk и многие другие системы (этот подход популяризировался в 1970-х годах U-системой PCS и UCSD Pascal)

    • Древовидное представление исходной программы, например:абстрактно-синтаксическое дерево, как это делается для многих прототипов или образовательных интерпретаторов

    • Маркированное представление исходной программы, подобное Tcl

    • Символы исходной программы, как это было сделано в MINT и TRAC

Одна вещь, которая усложняет проблему, состоит в том, что можно перевести (компилироватьбайт-код в машинные инструкции .Таким образом, успешная интерпретируемая реализация может в конечном итоге получить компилятор.Если компилятор работает динамически, за кулисами, его часто называют компилятором точно в срок или JIT-компилятором.JIT были разработаны для Java, JavaScript, Lua и, я полагаю, многих других языков.В этот момент у вас может быть гибридная реализация, в которой некоторый код интерпретируется, а другой код компилируется.

53 голосов
/ 17 апреля 2010

Java и JavaScript являются довольно плохим примером для демонстрации этой разницы , потому что оба являются интерпретируемыми языками . Java (интерпретировано) и C (или C ++) (скомпилировано) могли бы быть лучшим примером.

Почему зачеркнутый текст? Поскольку этот ответ правильно указывает, интерпретируется / компилируется о конкретной реализации языка, а не о языке per se . Хотя такие выражения, как "C - это скомпилированный язык", обычно верны, ничто не мешает кому-то написать интерпретатор языка Си. На самом деле, интерпретаторы для C существуют .

По сути, скомпилированный код может выполняться непосредственно процессором компьютера. То есть исполняемый код указывается на «родном» языке процессора ( ассемблер ).

Однако код интерпретируемых языков должен быть переведен во время выполнения из любого формата в машинные инструкции процессора. Этот перевод сделан переводчиком.

Другой способ обозначения состоит в том, что интерпретируемые языки код переводится в машинные инструкции шаг за шагом , а программа выполняется, в то время как скомпилированные языки имеют код был переведен до выполнения программы.

11 голосов
/ 21 августа 2018

Вот основная разница между компилятором и языком интерпретатора.

Язык компилятора

  • Принимает всю программу как один ввод и преобразует ее в объектный код, который хранится в файле.
  • Сгенерирован промежуточный объектный код
  • например: C, C ++
  • Скомпилированные программы работают быстрее, потому что компиляция выполняется перед выполнением.
  • Требуется больше памяти из-за создания объектного кода.
  • Ошибка отображается после компиляции всей программы
  • Исходный код --- Компилятор --- Машинный код --- Вывод

Язык переводчика:

  • Принимает одну инструкцию как один ввод и выполняет инструкции.
  • Промежуточный объектный код НЕ генерируется
  • Например: Perl, Python, Matlab
  • Интерпретированные программы работают медленнее, потому что компиляция и выполнение происходят одновременно.
  • Требуется меньше памяти.
  • Ошибка отображается для каждой отдельной инструкции.
  • Исходный код --- Интерпретатор --- Выход
4 голосов
/ 17 апреля 2010

Компилятор, как правило, читает компьютерный код на языке высокого уровня и преобразует его в p-код или в машинный код. Интерпретатор запускается непосредственно из p-кода или интерпретируемого кода, такого как Basic или Lisp. Как правило, скомпилированный код работает намного быстрее, более компактен и уже обнаружил все ошибки синтаксиса и многие недопустимые ошибки ссылок. Интерпретированный код находит такие ошибки только после того, как приложение попытается интерпретировать уязвимый код. Интерпретируемый код часто хорош для простых приложений, которые будут использоваться только один раз или, самое большее, пару раз, или, возможно, даже для прототипирования. Скомпилированный код лучше подходит для серьезных приложений. Компилятор сначала берет всю программу, проверяет наличие ошибок, компилирует ее и затем выполняет. Принимая во внимание, что интерпретатор делает это построчно, поэтому он берет одну строку, проверяет ее на наличие ошибок и затем выполняет ее.

Если вам нужна дополнительная информация, просто Google для «разницы между компилятором и интерпретатором».

2 голосов
/ 17 апреля 2010

Это очень мрачное различие, и на самом деле, как правило, это не свойство самого языка, а скорее программы, которую вы используете для выполнения кода на этом языке.

Тем не менее, большинство языков используются в основном в той или иной форме, и да, Java по сути всегда компилируется, тогда как javascript по сути всегда интерпретируется.

Чтобы скомпилировать исходный код, нужно запустить на нем программу, которая генерирует исполняемый двоичный файл, который при запуске имеет поведение, определенное источником. Например, javac компилирует файлы java, читаемые человеком, в машиночитаемые файлы .class.

Чтобы интерпретировать исходный код, запустите на нем программу, которая сразу же создаст определенное поведение, не создавая промежуточный файл. Например, когда ваш веб-браузер загружает stackoverflow.com, он интерпретирует кучу javascript (который вы можете посмотреть, просмотрев исходный код страницы) и производит много приятных эффектов, которые эти страницы оказывают, например, upvoting или небольшой уведомитель бары через вершину.

1 голос
/ 18 декабря 2013

Интерпретируемый язык выполняется во время выполнения в соответствии с инструкциями, как в сценариях оболочки, а скомпилированный язык - это язык, который компилируется (изменен на язык ассемблера, который может понять процессор), а затем исполняется как в c ++.

...