12

我正在阅读这篇关于 V8(Google 的 Javascript 引擎)的优秀文章:https ://developers.google.com/v8/design#mach_code 。

有一次,他们说 Javascript 直接编译成机器语言,没有任何字节码或解释器。

去引用:

V8 在第一次执行时将 JavaScript 源代码直接编译为机器码。没有中间字节码,没有解释器。

那么,为什么 Javascript 仍然与“脚本”和“解释”语言一起列出,当它被明确编译时(至少在 V8 中)?



编辑:如果已编译,我可以以某种方式从 Javascript 创建可执行文件吗?那需要以某种方式将其链接到 V8 吗?

考虑到这个问题,我找到了这句话:

V8 可以独立运行,也可以嵌入到任何 C++ 应用程序中。

在这里:http ://code.google.com/p/v8/ 。

4

3 回答 3

19

这就是为什么“解释语言”和“编译语言”是草率术语的例子。语言是编译还是解释是实现的属性,而不是语言本身的属性。

许多人将“动态类型语言”(如 JavaScript)与“解释”混淆,将“静态类型语言”与“编译”混淆,但这些只是相关性而非绝对性。可以编译动态语言(尽管它通常比编译静态语言更棘手),并且可以解释静态语言(例如:Hugs 是 Haskell 的解释器)。

于 2012-07-10T20:11:23.440 回答
3

它是一种脚本语言,因为 JS 代码旨在作为源代码提供和运行。

如果编码器要提供编译后的二进制文件供您执行,那么它就不是脚本。

此外,无论它在 Chrome 上做什么,相同的 Javascript 源代码也必须在其他平台上运行,这可能或多或少是一个传统的脚本环境。这也不会改变代码本身作为脚本的性质。

即使你把它编译到了极致,JS本质上仍然是一种脚本语言。几乎所有您能想到的脚本语言(Perl、PHP ......)都有合适的传统编译器;这不会阻止它们成为脚本语言,也不会阻止它们的源代码成为脚本。

同样,许多传统上编译的语言都有解释器。

最后,将一种语言“编译”成另一种语言的概念进一步混淆了这个问题。这已经存在了一段时间,但这个想法已经真正开始使用像 Coffeescript 这样的旨在编译成 Javascript 的语言。那么你把编译后的 Coffeescript 代码称为什么?

该术语并不是真的很有帮助,尤其是现在,但是在您所问的上下文中,您的问题的最终答案是,是的,Javascript 仍然是一种脚本语言。

于 2012-07-10T20:15:04.987 回答
0

在这里,让我演示一下代码:

exeFuncDefinedLater(100); // prove that js is a compiling language
  
function exeFuncDefinedLater(num) {
  console.log("Your number is: " + num);
}

这段代码可以在 Chrome 浏览器和 Node js 上运行。

如果有人说 js 是解释型语言,那么这段代码就会崩溃,就像你运行 later() 时,它不应该知道后面的函数体。

这可以证明 js 是一种编译语言,因为它编译了稍后的函数(所以机器可以知道它),然后执行它。

于 2016-08-03T01:17:36.443 回答