我正在阅读这篇关于V8的优秀文章,谷歌的Javascript引擎:https://developers.google.com/v8/design#mach_code。
有一次,他们说Javascript直接编译成机器语言,没有任何字节码或解释器。
引用:
V8将JavaScript源代码直接编译成机器代码 是第一次执行。没有中间字节代码,没有 解释
那么,为什么Javascript仍然与“脚本”和“解释”语言一起列出,当它被清楚地编译时(至少在V8中)?
考虑到这个问题,我发现了这句话:
V8可以独立运行,也可以嵌入到任何C ++应用程序中。
答案 0 :(得分:15)
这就是为什么“解释语言”和“编译语言”是草率术语的例子。语言是编译还是解释是实现的属性,而不是语言本身的属性。
许多人将“动态类型语言”(如JavaScript)与“已解释”和“静态类型语言”与“已编译”混淆,但这些仅仅是相关而不是绝对。编译动态语言是可能的(虽然它通常比编译静态语言更棘手),并且可以解释静态语言(例如:Hugs是Haskell的解释器)。
答案 1 :(得分:2)
它是一种脚本语言,因为JS代码旨在作为源代码提供和运行。
如果编码人员要提供一个编译的二进制文件供你执行,那么它就不是一个脚本。
此外,无论在Chrome上做什么,相同的Javascript源代码也必须在其他平台上运行,这可能或多或少是传统的脚本环境。这也不会改变作为脚本的代码本身的性质。
即使你极度编译它,JS仍然是一种脚本语言。几乎所有你能想到的脚本语言都有适当的传统编译器(Perl,PHP ....);这不会阻止他们成为脚本语言,也不会阻止他们的源代码成为脚本。
同样,有许多传统编译语言的解释器。
最后,将一种语言“编译”成另一种语言的概念使问题更加混乱。这已经存在了一段时间,但是这个想法实际上已经开始使用像Coffeescript这样的语言来编译成Javascript。那么你怎么称呼已编译的Coffeescript代码?
术语实际上并没有那么有用,特别是现在,但在您提出的上下文中,您的问题的最终答案是肯定的,Javascript仍然是一种脚本语言。
答案 2 :(得分:1)
在这里,让我演示代码:
later(); // prove that js is a compiling language
function later(num) {
console.log("Your number is: " + num);
}
这段代码可以在Chrome浏览器和Node js上运行。
如果有人说js是一种解释语言,那么这段代码就会崩溃,就像你以后运行()时一样,它不应该知道后面的函数体。
这可以证明js是一种编译语言,因为它编译后面的函数(因此机器可以知道它),然后执行它。