【发布时间】:2021-11-07 19:07:20
【问题描述】:
我看了很多解释、编译、即时编译等方面的东西,但是我还没有找到一个清晰的解释来解释为什么JS被创建为解释语言,为什么仍然没有能力编译js代码。
我有一些想法,但我不确定其中的任何一个:
- 如果浏览器可以执行(或只是传递给操作系统)二进制代码,这将是一个很大的漏洞,因为任何命令都可以注入二进制代码(例如,从文件系统中删除所有文件)。如果这是真的,是否有可能教浏览器以某种方式验证二进制代码?对于后端来说,这不是问题。那么,为什么 NodeJS 不能执行编译后的 JS(PHP、Python 也一样,为什么会被解释)?
- 无法对二进制代码进行优化。这是真的吗?优化的解释型 js 是否比编译型(二进制)js 更快?
- 不同的 CPU(架构)需要不同的二进制代码。这意味着不可能为任何客户端生成通用二进制代码。这就是 WebAssembly 模块使用一些中间代码的原因?还有为什么不将编译后的代码用于后端?
如果有人能解释上述一些或任何其他原因,我将不胜感激。
【问题讨论】:
-
实际上 V8 Javascript 引擎确实会编译代码。它只是在运行中自动编译成它可以执行的字节码。为了您的阅读乐趣:v8.dev/blog/background-compilation 和 github.com/thlorenz/v8-perf/blob/master/compiler.md。
-
@jfriend00 编译是一个实现细节。 OP 询问为什么 JS 在概念上被设计为一种解释性语言。毫无疑问,在解释/编译部门中,JS 严格属于解释类别。即使某些引擎涉及编译步骤。
-
关于“为什么”某些设计决策是在 20 年前做出的问题在这里通常毫无意义,因为在讨论决策时我们都没有在房间里。人们可以猜测他们是否想要,或者你可以去问 Brendan Eich,但这通常不是一个有用的讨论。至于我的猜测,问问自己为什么 HTML 是一种纯文本格式(与 PDF 相比也没有预编译),你可能会接近为什么 Javascript 是这样的,因为它最初是为了无缝而设计的进入那个 HTML 世界。 Nodejs 选择使用 V8 引擎,所以这就是它的原因。
-
@jfriend00 我不一定不同意,但我认为这里有一个明确的答案。只是不是一个非常令人满意的。如果它被解释,开发代码会更快。你写它,你就完成了。无需执行额外步骤。尽可能快地加入开发人员可能会考虑这一点。类似于 Java。
-
仅供参考,一个有趣的问题可能是为什么不选择一种现有的解释语言,例如 Python 并将其集成?但是,查了一下,JS 发布时 Python 才 4 岁,所以可能比 JS 概念诞生时还年轻,还没有显着的牵引力。 Perl 的存在时间稍长一些,并且在那个时候被普遍使用,所以这可能是一个考虑因素。 Basic 是当时最受欢迎的前 10 名中唯一的其他解释语言,但可能由于与 Microsoft 的 Visual Basic 的关联而受到污染。
标签: javascript node.js compilation interpretation