我读了一篇关于V8的优秀文章,这是谷歌的Javascript引擎:https://developers.google.com/v8/design#mach_code.
有一次,他们说Javascript是直接编译成机器语言的,没有任何字节码或解释器。
报价:
V8将JavaScript源代码直接编译为机器代码首先执行。没有中间字节代码,没有口译译员
那么,当Javascript被清楚地编译(至少在V8中)时,为什么它仍然与"脚本"one_answers"解释"语言一起列出呢?
编辑:如果经过编译,我可以用Javascript创建一个可执行文件吗?这需要以某种方式将其连接到V8?
考虑到这个问题,我发现了这句话:
V8可以独立运行,也可以嵌入到任何C++应用程序中。
此处:http://code.google.com/p/v8/.
这就是为什么"解释语言"one_answers"编译语言"是草率术语的例子。编译或解释语言是实现的属性,而不是语言本身的属性。
许多人将"动态类型语言"(如JavaScript)与"解释"混淆,将"静态类型语言"与"编译"混淆,但这些只是相关性,而不是绝对性。编译动态语言是可能的(尽管它通常比编译静态语言更棘手),也可以解释静态语言(例如:Hugs是Haskell的解释器)。
它是一种脚本语言,因为JS代码是作为源代码提供和运行的。
如果编码器要提供一个编译后的二进制文件供您执行,那么它就不是一个脚本。
此外,无论它在Chrome上做什么,相同的Javascript源代码也必须在其他平台上运行,这些平台可能或多或少是传统的脚本环境。这也不会改变代码本身作为脚本的性质。
即使你极端地编译它,JS本质上仍然是一种脚本语言。几乎所有你能想到的脚本语言(Perl、PHP……)都有合适的传统编译器;这并不能阻止它们成为脚本语言,也不能阻止它们的源代码成为脚本。
同样,也有许多传统汇编语言的口译员。
最后,将一种语言"编译"成另一种语言的概念进一步混淆了这个问题。这种想法已经存在了一段时间,但随着Coffeescapet等旨在编译成Javascript的语言的出现,这种想法已经真正流行起来。那么,你把编译后的Coffeescapet代码称为什么呢?
术语并没有那么有用,尤其是现在,但在你问这个问题的背景下,你的问题的最终答案是,是的,Javascript仍然是一种脚本语言。
这里,让我演示一下代码:
exeFuncDefinedLater(100); // prove that js is a compiling language
function exeFuncDefinedLater(num) {
console.log("Your number is: " + num);
}
这段代码可以在Chrome浏览器和Node.js上运行。
如果有人说js是一种解释语言,那么这段代码就会崩溃,因为当你运行later()时,它不应该知道后面的函数体。
这可以证明js是一种编译过的语言,因为它稍后会编译函数(这样机器就可以知道它),然后执行它