【问题标题】:Why is JS interpreted and not compiled? [closed]为什么 JS 是解释而不是编译? [关闭]
【发布时间】:2021-11-07 19:07:20
【问题描述】:

我看了很多解释、编译、即时编译等方面的东西,但是我还没有找到一个清晰的解释来解释为什么JS被创建为解释语言,为什么仍然没有能力编译js代码。

我有一些想法,但我不确定其中的任何一个:

  1. 如果浏览器可以执行(或只是传递给操作系统)二进制代码,这将是一个很大的漏洞,因为任何命令都可以注入二进制代码(例如,从文件系统中删除所有文件)。如果这是真的,是否有可能教浏览器以某种方式验证二进制代码?对于后端来说,这不是问题。那么,为什么 NodeJS 不能执行编译后的 JS(PHP、Python 也一样,为什么会被解释)?
  2. 无法对二进制代码进行优化。这是真的吗?优化的解释型 js 是否比编译型(二进制)js 更快?
  3. 不同的 CPU(架构)需要不同的二进制代码。这意味着不可能为任何客户端生成通用二进制代码。这就是 WebAssembly 模块使用一些中间代码的原因?还有为什么不将编译后的代码用于后端?

如果有人能解释上述一些或任何其他原因,我将不胜感激。

【问题讨论】:

  • 实际上 V8 Javascript 引擎确实会编译代码。它只是在运行中自动编译成它可以执行的字节码。为了您的阅读乐趣:v8.dev/blog/background-compilationgithub.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


【解决方案1】:

首先让我们说,除非您在早期参与 Javascript 的设计讨论,否则我们没有人真正“知道”为什么。我们能做的最好的事情就是尝试根据他们的目标和选择来推断为什么会做出某些选择。

如果您查看网页中 Javascript 的原始设计要求,您会看到如下内容:

  1. 必须在许多平台上运行。
  2. 必须易于嵌入到 HTML 页面中。
  3. 必须易于编程。
  4. 最初并不是一个需要最大化执行性能的环境。
  5. 不是 Java。

让我们看看这些......

关于#1,好的,在很多平台上运行意味着它不能编译为本机机器码 - 期间。它可以编译为通用字节码,如 Java 或 webAssembly,但请继续阅读其他要求。

关于 #2,它希望可嵌入网页中,以便您可以执行以下操作:

<div onclick='alert("hi")'>Click me</div>

然后,很难将预先编译的代码放入其中。您可能必须编译整个网页。这创建了一个全新的范例和浏览器(需要预编译的代码和 HTML)。虽然世界最终可能会去那里,但这肯定不是一个简单的方法(需要重做浏览器)。

关于#3,“编程简单”,人们普遍认为解释型“脚本”比需要编程环境、编译器设置和一些构建工具的语言更容易上手。做简单的事情更快更简单。

关于#4,“性能”。在 Javascript 的早期,它是一种辅助语言,可以帮助向网页添加一些客户端逻辑。最初的目标比今天使用的 Javascript 简单得多。我相当怀疑是否设想过需要一种预编译语言来满足其初始目标。因此,请保持简单,并以更简单的方式实现目标。

关于#5:“不是Java”。 Java 是当时众所周知的工具。但是,Java 并不是超级简单,需要预编译,有 IP 产权负担等等……所以,Javascript 天生就是 C 和 Java 开发人员都熟悉的东西,但对于新手来说要简单得多。容易做简单的事情。


对于像nodejs这样的环境,他们实际上可以有一个预编译步骤,但是nodejs的早期设计者决定使用开源的V8 Javascript引擎,而不是自己制作Javascript引擎。另外,在服务器世界中,您的代码通常在服务器启动时加载一次,V8 将其编译为本机代码和字节码的组合,因此要求开发人员预编译它并不一定会给您带来很多好处。这就是现在实际编译 Javascript 很重要的地方,它只是在加载时编译,而不需要开发人员进行预编译。

现在,如果您想在预编译步骤中获得类型检查的好处,您可以使用 TypeScript 并将其预编译为 Javascript。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2011-09-25
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多