2010-04-17 4 views
76

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

ответ

113

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

Разница заключается в том не на языке; он находится в реализации .

Попав что из моей системы, вот ответ:

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

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

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

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

    • Akenized Representatio п исходного текста программы, похожие на Tcl

    • характерах исходного текста программы, как это было сделано в MINT и ПРОФ

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

+4

Сэр, у меня есть следующие вопросы 1. На каком языке написано «что-то еще»? 2. И в контексте JavaScript, что «что-то еще» варьируется от браузера к браузеру? 3. Скажем, мой сценарий работает в Google Chrome и Internet Explorer, он интерпретируется одинаково в обоих браузерах? – JavaHopper

40

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

Почему текст с пропущенным текстом? Как this answer правильно указывает, интерпретируется/компилируется о конкретной реализации языка, а не о языке per se. Хотя такие утверждения, как «C - это скомпилированный язык», обычно true, ничто не мешает кому-либо писать переводчик на языке C. Фактически, interpreters for C do exist.

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

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

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

+6

Java интерпретируется? Из википедии: «Java-приложения обычно скомпилированы в байт-код (файл класса), который может работать на любой виртуальной машине Java (JVM) независимо от компьютерной архитектуры». – Personman

+4

@ Personman, который по-прежнему технически «интерпретируется», поскольку JVM выполняет код, а не сама ОС. На самом деле это семантическая разница, поскольку можно сказать, что сложность современных ОС делает разницу в основном неактуальной для большинства ситуаций. Вы говорите о разнице между ОС, запускающей приложение, и операционной системой, на которой запущено приложение, которое запускает код. – GrayWizardx

+4

Я полагаю, вы имеете в виду, что сами файлы классов интерпретируются виртуальной машиной Java. Это разумно, но источник java действительно компилируется в байт-код Java VM. Вы можете создать физическую Java-машину, которая не требует, чтобы виртуальная машина интерпретировала ее в машинный код другой архитектуры. Поэтому представляется более точным сказать, что Java компилируется. Тем не менее, это хороший пример того, как различие путается и является произвольным. В конце концов, скомпилированный C интерпретируется процессором, правильно? – Personman

2

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

, если Вам необходима дополнительная информация только Google для «разница между компилятором и интерпретатором»

+1

Умм, не уверен, где у вас есть некоторые из них за пределами первых двух утверждений. Это было технически верно несколько поколений назад со многими интерпретируемыми языками, но в зависимости от платформы и внимания к деталям можно интерпретировать код, который выполняет близкий или скомпилированный код для определенных действий. – GrayWizardx

2

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

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

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

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

1

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

Смежные вопросы