javascript的编译器与Web浏览器不同

时间:2015-05-01 17:22:13

标签: javascript browser

所以我要问每个网络浏览器都有自己的编译器示例IE从网站编译Javascript并生成字节码的序列A.

另一方面,谷歌浏览器从同一网站编译相同的Javascript并生成序列B.

我想知道这是因为如果是这样的话,在Javascript上运行编译器并将生成的字节代码上传到网站而不是Javascript本身是有益的。并根据每个浏览器发送不同的字节码。

还是有一些其他限制。

4 个答案:

答案 0 :(得分:5)

正如其他人所指出的,有不同的ECMAScript engines,其中一些使用 JIT(即时)编译器,而其他一些使用运行时解释器,是现在大多数浏览器的首选选项,因为它比后一选项具有一些性能优势。

您可以在https://softwareengineering.stackexchange.com/questions/138521/is-javascript-interpreted-by-design

上看到有关此问题的其他问题

例如,V8是Google Chrome中使用的JavaScript引擎node.js,也可以嵌入到C ++应用程序中。

关于将编译或预编译的代码发送到客户端而不是原始JS的想法,有一些项目正在处理类似的事情:

  

Asm.js由一个严格的JavaScript子集组成,其中使用手动内存管理(如C)的静态类型语言编写的代码由source-to-source compiler转换为Emscripten,例如LLVM (基于ahead-of-time)。通过将语言功能限制为适合http://ejohn.org/blog/asmjs-javascript-compile-target/优化和其他性能改进的功能,可以提高性能。

关于Asm.js的一个重要事实是,现有的JavaScript引擎在其代码风格方面确实运行良好,因此您可以立即开始使用它!但它产生的代码仍然是( 的一个子集)我们知道的JS,但是以某种方式编写,可以帮助JS引擎更快地运行它:

Asm.js Compilation and Execution Pipeline

当然,对于你可以用它做什么还有很多限制,因为主要面向只使用数字。见https://blog.mozilla.org/research/2015/02/23/the-emterpreter-run-code-before-it-can-be-parsed/

对Asm.js的真正支持仍然是一个限制,所以你不能使用"use asm"这样的东西,虽然你可以在今天的浏览器上运行Asm.js代码并获得一些性能改进,但它不会可以在优化Asm.js代码的浏览器中使用它。但是,我们可能会开始在(希望接近)未来的那些和其他一些改进。见Google Closure Compiler

与此同时,对于更通用的JS,需要使用的不仅仅是数字,您可以使用 FAQ 。我建议您首先查看online tool,然后您可以在{{3}}中开始使用它。

答案 1 :(得分:1)

有多种JavaScript(或更确切地说是 ECMAScript )实现广泛使用,而理论上有标准,最广泛使用的是 ES5 (ECMAScript 5) - 是的,并非所有浏览器中的所有内容都正确,一致地实现(我正在看着你,旧的 IE )。

这是 ES5 的良好兼容性表格(您今天写的那个):http://kangax.github.io/compat-table/es5/

对于闪亮的新 ES6 来说同样的事情:http://kangax.github.io/compat-table/es6/

请注意这些表格顶部的免责声明:

  

请注意,其中一些测试代表存在,不是功能或完全符合

此外,关于JavaScript是编译还是解释语言的问题:它绝对是解释语言 - 至少最初是。 今天使用的最常见的JavaScript引擎实现 JIT (即时编译器),在执行之前将大部分JavaScript转换为字节或机器代码(ergo - 编译)

这些引擎中使用最广泛(也是性能最佳)的是 V8 ,由WebKit使用(因此存在于Chrome,Safari,Opera等... - Node.JS正在使用它以及)。详细了解 V8 及其 JIT 实施:How the V8 engine works?

答案 2 :(得分:1)

是的,每个浏览器都有自己的ECMAScript引擎实现,最常见的是实现/支持ECMA-262,通常称为JavaScript。虽然有几个大型相关的浏览器引擎系列,如Webkit,但每个引擎都可以拥有自己的JavaScript引擎。例如,正如许多人所指出的那样,谷歌使用的是V8引擎。因为这些引擎各自的工作方式略有不同,所以没有一组代码可以确定它们是确定性的,就像Java代码在支持JVM的任何机器上运行相同。

本质上,JavaScript不像传统语言(如Java或C / C ++)那样编译。这就是为什么在没有第三方程序的帮助下,在代码运行之前,您无法在JavaScript代码中找到非语法错误。 ECMAScript是一种解释语言。

现在,这是棘手的部分。大多数现代JavaScript引擎实际上都会编译JavaScript,通常编译为另一种语言(也称为源到源编译或转换),例如C,以对其执行性能优化。当然,在某些时候,所有代码都被编译成字节代码。

编写适用于所有主流浏览器的JavaScript的最佳选择是使用核心/标准功能。例如,这意味着在使用new Date()时以“yyyy / mm / dd”而不是“yyy-mm-dd”的形式传递时间戳字符串,因为Firefox不支持后一种格式 - Chrome开发人员只需添加它对你好IE以不同方式处理某些非标准功能而臭名昭着。我是http://caniuse.com/的忠实粉丝来帮助解决这个问题。

答案 3 :(得分:0)

现在大多数javascript引擎都是JIT编译器。更多信息:What does a just-in-time (JIT) compiler do?

所以是的,javascript是编译的(不是解释的),而且大多数主流浏览器都采用不同的方式。