【发布时间】:2015-02-21 18:17:32
【问题描述】:
JavaScript 没有通用的字节码,但大多数 JavaScript 引擎都有自己的字节码。由于 JavaScript 文件作为源代码字符串传播,因此它们必须在执行之前将源代码字符串解析/编译为字节码。
但是,由于我们可以在 HTTP 请求中指定用户代理类型(例如浏览器类型和版本),我们不能让服务器为每个浏览器保留字节码并做出相应的响应以节省客户端时间吗?
是什么阻止我们采用这种方法?我认为浏览器不会有问题,即使某些 JavaScript 文件以字节码形式给出而其他文件以源字符串形式给出。同样,我们在 Python 中有 .pyc 文件,它可以很好地与 .py 文件一起运行。
[更新] 我能想到的潜在好处如下。
- 您可以在客户端节省解析时间。解析速度很快,但对于低端设备可能值得这样做。
- 您可以在字节码中添加一些提示。例如,JavaScriptCore(WebKit 的 JavaScript 引擎,简称 JSC)使用运行时收集的信息(例如类型)修补字节码。 JSC 的字节码被设计成它为此类信息提供了插槽。
在可维护性方面,如果客户端的浏览器不支持,服务器始终可以发送原始源代码字符串,并且没有那么多不同的JavaScript引擎。支持四种最流行的浏览器(Chrome、Firefox、IE 和 Safari)对我来说似乎是可行的。另外,我没有看到字节码指令集经常变化。
【问题讨论】:
-
如果浏览器正在推送更新并且内部字节码格式发生变化怎么办?
-
你认为这解决了什么问题?
-
浏览器 JavaScript 运行时的架构师不得不将他们的虚拟机固定在特定的指令集上,这将是一件可怕的事情。就目前而言,解析 JavaScript 的速度快得惊人,而且完全物有所值(在我看来)。
-
还要想想大型网站要处理所有主要浏览器的所有活动版本,包括移动设备浏览器,这将是一场什么样的噩梦。
-
@jray319 因为它们是特定于版本和实现的,这意味着它们只能从编译它们的同一个解释器中正确运行。此外,它破坏了一些自省工具。 Python 不是 Java,其中字节码是平台。在 Python 中,源代码是平台,而字节码只是一个未记录的实现细节。
标签: javascript webkit bytecode javascriptcore