【问题标题】:Does chrome understand compiled javascript?chrome能理解编译好的javascript吗?
【发布时间】:2015-04-22 18:43:23
【问题描述】:

不是让 V8 动态编译 JavaScript 并 然后 执行它,难道不能只预先编译 JavaScript,然后将机器代码嵌入页面中,而不是将 JavaScript 嵌入到页面中吗?页面?

【问题讨论】:

  • asm 仍然意味着多次编译,对吧?
  • 不会有任何这样的机器代码依赖于架构吗?如果我需要为我希望支持的每个架构都包含一个编译版本(然后为其他可能根本不支持机器代码的浏览器包含一个纯 JavaScript 版本),这似乎是一个收益最小的功能。
  • 不是所有的javascript都可以编译成机器码。有些事情,例如eval,意味着您还需要将 javascript 编译器编译到浏览器或编译后的代码中。如果你仍然需要一个 javascript 编译器,为什么不直接使用它呢。
  • 按我的理解,V8 JavaScript 引擎无论如何都会编译成机器码,所以为什么不提前做呢?

标签: javascript google-chrome v8 javascript-engine


【解决方案1】:

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

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

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

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

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

【讨论】:

  • @你好,Nacl 不能解决 (1)(还有 PNacl,但那不是机器代码)。对于 (2),它会进行实际的代码验证——但要做到这一点,机器代码必须遵守特定的模式并包含额外的检查,也就是说,它不像任意机器代码那样有效或不受限制。
  • 我个人认为这是比我更好的答案(因为我没有解决重大的安全问题)。我会继续关注其基于规范的解释,但我认为这一点更重要。 (我谦虚地将这个提交给@Hello 接受,但这取决于你。)
  • @AndreasRossberg:(1) 架构信息不能简单地在请求标头中发送,并且响应是特定于架构的吗? (2) 也许这可以优化,因为它可以以与浏览器类似的方式工作,并且只理解符合 Web 标准的代码?
  • @ThreaT, re (1):这并不能解决服务器仍然需要为所有可能的客户端平台存储(或生成)机器代码的问题,包括在未来; re (2): Nacl 已经仔细地指定了一种代码格式,如何将它(或类似的东西)变成一个适当的标准来简化问题?
  • @AndreasRossberg:(1) 我认为这不是什么大问题,这里的主要问题是网络相关的,而不是存储相关的。 (2) 我猜你是对的。任何安全或标准化层总是会减慢它的速度,但始终是必要的,除非涉及某种允许使用某些脚本的证书/签名过程......
【解决方案2】:

按照我的理解,V8 JavaScript 引擎无论如何都会编译成机器码,那为什么不提前做呢?

根据W3C HTML5 Scripting specification,浏览器不能支持具有特殊type属性的机器代码(就像Chrome对Dart语言所做的那样)没有基于标准的原因: p>

下面列出了用户代理必须识别的 MIME 类型字符串,以及它们所引用的语言:

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

用户代理可能支持其他语言的其他 MIME 类型...

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

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

像字节码这样的独立于架构的折衷解决方案似乎很差:您仍然需要包含两次脚本(一次用于字节码,一次通常用于不支持它的脚本)并且您需要进行某种运行-对字节码进行时间处理以将其转换为机器码。

multi-includes-with-fallback 问题正是其他脚本语言没有进入 Web 环境的原因:它们需要协调的跨供应商支持才能发挥作用。 Google 正在尝试 Dart,但他们看到的成功程度还有待观察。

注意Chrome does cache compiled versions of scripts,所以一个脚本只需要编译一次,编译后的代码就会被缓存起来,供用户重新访问页面时重复使用。

【讨论】:

  • 那么页面对于每台计算机的呈现方式是否不同? chrome 生成的机器代码对于每台正在编译 javascript 页面的计算机是唯一的吗?
  • “chrome 生成的机器码对每台计算机都是唯一的”——JavaScript 需要编译为处理器能够理解的机器码,是的。每个 JavaScript 引擎都针对特定的架构进行编译。这不会影响用户所看到的页面“呈现”,但会影响生成的机器代码:您显然无法在 x86 处理器上运行 ARM 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多