使用Google Chrome(V8)时,Javascript是否可以被视为一种解释型语言?

12
我正在阅读有关 V8(Google 的 JavaScript 引擎)的优秀文章:https://developers.google.com/v8/design#mach_code
其中提到 Javascript 直接编译成机器语言,没有任何字节码或解释器。
引用原话:
V8 首次执行 JavaScript 源代码时,将其直接编译为机器代码。没有中间字节码,也没有解释器。
那么,既然在 V8 中它显然是编译的,为什么 JavaScript 仍会被列为“脚本”和“解释型”语言之一呢?
编辑:如果 JavaScript 已经编译了,我是否可以通过某种方式创建可执行文件?这需要将其与 V8 链接起来吗?
考虑到这个问题,我找到了以下引用:
V8 可以独立运行,也可以嵌入任何 C++ 应用程序中。
这里:http://code.google.com/p/v8/

2
如果是这种情况,那么它就不再是一个[java]“脚本”了。可以叫它“JavaCompiled” :) - Quintium
该死,JavaScript听起来如此...诱人。 - corazza
2
我不认为他暗示了那个意思,@GabyakaG.Petrioli,他只是把单词分开了... - corazza
1
是的,但他通过将单词分开暗示了"java"部分本身具有重要意义...(无论如何...我只是为普通读者陈述这一点...) - Gabriele Petrioli
1
@GabyakaG.Petrioli - 我知道这不是Java。这只是一个用词的玩笑。用“脚本”来称呼某物,但实际上编译它只会改变事情。抱歉让你感到困惑。 - Quintium
显示剩余3条评论
3个回答

19
这就是为什么“解释型语言”和“编译型语言”是术语不严谨的例子。一个语言是编译还是解释是其实现的属性,而不是语言本身的属性。
许多人将“动态类型语言”(如JavaScript)与“解释型语言”混淆,将“静态类型语言”与“编译型语言”混淆,但这些只是相关性而非绝对。可以编译动态语言(虽然相对静态语言编译起来要困难一些),也可以解释静态语言(例如:Hugs是Haskell语言的解释器)。

3

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

如果编码人员为您提供编译后的二进制文件以执行,则不会是脚本。

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

即使你走到极端进行编译,JS在本质上仍然是一种脚本语言。几乎可以想到每种脚本语言都有适当的传统编译器(Perl,PHP...);这并不能阻止它们成为脚本语言,也不能阻止它们的源代码成为脚本。

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

最后,问题进一步混淆了将一种语言“编译”成另一种语言的概念。这已经存在一段时间了,但随着像Coffeescript这样的语言意图编译成Javascript,这个想法真正开始流行起来。那么你该如何称呼编译后的Coffeescript代码呢?

术语并不是真正有帮助的,特别是现在,但在你提问的上下文中,最终答案是:是的,Javascript仍然是一种脚本语言。


0

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

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

此段代码可在Chrome浏览器和Node.js上运行。
如果有人说js是一种解释型语言,那么这段代码会崩溃,因为当你运行later()时,它不应该知道later函数的内容。
这可以证明js是一种编译语言,因为它会编译later函数(使机器能够了解它),然后执行它。

2
实际上,这是由于变量提升 - Ben Rivers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接