chrome 是否理解已编译的 javascript?

Does chrome understand compiled javascript?

与其让 V8 编译 JavaScript 然后 然后 执行它,不如预先编译 JavaScript 然后再执行在页面中嵌入机器代码而不是在页面中嵌入 JavaScript?

The way I understand it, the V8 JavaScript engine compiles to machine code anyway so why not just do it beforehand?

根据 W3C HTML5 Scripting specification,浏览器 不能 支持具有特殊 type 属性的机器代码(如 Chrome 使用 Dart 语言):

The following lists the MIME type strings that user agents must recognize, and the languages to which they refer:

"application/ecmascript"
"application/javascript"
...

User agents may support other MIME types for other languages...

目前还没有浏览器实现这样的功能。

我怀疑这种方法的主要缺点是每个芯片架构都需要专门为其编译的脚本的机器代码版本。这意味着为了支持三种架构,一个页面需要包含三次编译脚本。 (而且应该第四次包含它,作为简单的 JavaScript,作为你没有包含的架构的后备,或者对于不能t/don不支持编译代码的浏览器。)这可能使用几乎无用的数据显着膨胀页面的大小。加载时间的增加似乎会显着抵消或完全超过您节省的编译时间。

像字节码这样的独立于体系结构的妥协解决方案看起来很糟糕:你仍然需要两次包含脚本(一次用于字节码,一次通常用于不支持它的脚本)并且你需要做一些运行- 对字节码进行时间处理以将其转换为机器码。

多重包含与回退问题正是其他脚本语言尚未进入 Web 环境的原因:它们需要协调的跨供应商支持才能发挥作用。 Google 正在尝试使用 Dart,但他们看到的成功程度还有待观察。

请注意 Chrome does cache compiled versions of scripts 因此脚本只需要编译一次,然后将编译后的代码缓存起来,以便用户再次访问该页面时重新使用。

在网络上传送机器码有两个主要问题:

  1. 便携性。没有服务器能够为所有可能的系统架构(现在和未来)提供适当的机器代码。例如,V8 已经支持 10 种不同的 CPU 架构。
  2. 安全。没有客户可以在不知道是否可信的情况下 运行 在他们的机器上使用随机机器代码。

要解决 (1),您通常需要交叉编译机器代码,这比从高级语言向下编译更困难且成本更高。要解决 (2),您需要验证收到的机器代码,这比编译高级语言更困难且成本更高。

机器代码也往往比高级代码大得多,因此也存在带宽问题。

现在,JavaScript 可能不是高级语言的特别好的选择。但这正是我们作为网络语言所坚持的。