Можно ли считать Javascript интерпретируемым языком при использовании Google Chrome (V8)?
Я читал эту прекрасную статью о V8, движке Javascript от Google: https://developers.google.com/v8/design.
В какой-то момент они говорят, что Javascript компилируется непосредственно в машинный язык, без какого-либо байт-кода или интерпретатора.
Цитировать:
V8 компилирует исходный код JavaScript непосредственно в машинный код при его первом запуске. Нет промежуточных байтовых кодов, нет интерпретатора.
Итак, почему Javascript все еще указан вместе с языками "сценариев" и "интерпретированных", когда он четко скомпилирован (по крайней мере, в V8)?
Редактировать: могу ли я как-нибудь создать исполняемый файл из Javascript, если он скомпилирован? Что бы как-то связать его с V8?
Учитывая этот вопрос, я нашел эту цитату:
V8 может работать автономно или может быть встроен в любое приложение C++.
Здесь: http://code.google.com/p/v8/.
3 ответа
Вот почему "интерпретируемый язык" и "скомпилированный язык" являются примерами небрежной терминологии. Компилируется или интерпретируется язык - это атрибут реализации, а не самого языка.
Многие люди путают "динамически типизированные языки" (например, JavaScript) с "интерпретируемым" и "статически типизированный язык" с "скомпилированным", но это всего лишь корреляции, а не абсолюты. Можно скомпилировать динамический язык (хотя обычно это сложнее, чем компилировать статический), и можно интерпретировать статический язык (например: Hugs - интерпретатор для Haskell).
Это язык сценариев, потому что код JS предназначен для предоставления и запуска в качестве исходного кода.
Если бы кодировщик предоставил вам исполняемый двоичный файл, то он не был бы сценарием.
Кроме того, независимо от того, что он делает в Chrome, тот же исходный код Javascript должен также работать на других платформах, которые могут быть более или менее традиционными средами сценариев. Это также не меняет природу самого кода как скрипта.
Даже если вы дошли до крайности при компиляции, JS по-прежнему остается языком сценариев. Существуют подходящие традиционные компиляторы, доступные практически для каждого языка сценариев, который вы можете себе представить (Perl, PHP....); это не мешает им быть языками сценариев или их исходным кодом.
Аналогично, существуют интерпретаторы для многих языков, которые традиционно компилируются.
Наконец, проблема еще более запутана концепцией "компиляции" одного языка в другой. Это уже давно, но идея действительно взлетела с такими языками, как Coffeescript, которые предназначены для компиляции в Javascript. Итак, что вы называете скомпилированным кодом Coffeescript?
Терминология не очень полезна, особенно сейчас, но окончательный ответ на ваш вопрос, в контексте, который вы задаете, заключается в том, что да, Javascript все еще является языком сценариев.
Вот, позвольте мне продемонстрировать код:
later(); // prove that js is a compiling language
function later(num) {
console.log("Your number is: " + num);
}
Этот фрагмент кода может работать как в браузере Chrome, так и в Node js.
Если кто-то скажет, что js является интерпретируемым языком, то этот фрагмент кода потерпит крах, так как, когда вы запускаете позже (), он не должен знать тело более поздней функции.
Это может доказать, что js является скомпилированным языком, так как он компилирует более позднюю функцию (чтобы машина могла знать это), а затем выполнял ее.