javascript 的编译器是否因网络浏览器而异

Do compilers for javascript differ from web browser to web browser

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

另一方面,google chrome 从同一网站编译相同的 Javascript 并生成序列 B 。

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

或者还有其他一些限制。

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

ES5(你今天写的那个)的兼容性很好table:http://kangax.github.io/compat-table/es5/

对于闪亮的新 ES6 也是一样的:http://kangax.github.io/compat-table/es6/

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

Please note that some of these tests represent existence, not functionality or full conformance.

另外,关于JavaScript是编译还是解释语言的问题:肯定是解释 语言——至少最初是这样。 但是当今使用的最常见的JavaScript引擎实现了JIT(即时编译器),翻译了大部分JavaScript 在执行之前转换为字节或机器代码(ergo - 编译)。

这些引擎中使用最广泛(并且性能最高)的是 V8,由 WebKit 使用(因此存在于 Chrome、Safari、Opera、. .. - Node.JS 也在使用它)。阅读有关 V8 及其 JIT 实现的更多信息:How the V8 engine works?

是的,每个浏览器都有自己的 ECMAScript 引擎实现,最常见的是 implementing/supporting ECMA-262,通常称为 JavaScript。虽然有几个大型相关的浏览器引擎系列,例如 Webkit,但每个引擎还可以有自己的 JavaScript 引擎。例如,正如许多人指出的那样,Google 使用 V8 引擎。因为这些引擎各自做的事情有点不同,所以没有一组代码承诺在它们之间是确定性的,就像说 Java 代码在任何支持 JVM 的机器上 运行 一样.

从本质上讲,Java脚本的编译方式与传统语言 Java 或 C/C++ 不同。这就是为什么在没有第 3 方程序的帮助下,您无法在 JavaScript 代码中找到非语法错误,直到该代码 运行s。 ECMAScript 是一种解释型语言。

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

要编写适用于所有主要浏览器的 Java 脚本,最好的办法是使用 core/standard 功能。例如,这意味着在使用 new Date() 时以 "yyyy/mm/dd" 而不是 "yyy-mm-dd" 的形式传递时间戳字符串,因为 Firefox 不支持后一种格式 - Chrome 开发人员只是添加了它对你好IE 以不同方式处理某些非标准功能而臭名昭著。我非常喜欢 http://caniuse.com/ 来帮助解决这个问题。

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

所以是的,javascript 是编译的(不是解释的),大多数主流浏览器的做法都不一样。

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

您可以在以下位置查看有关此问题的另一个问题:https://softwareengineering.stackexchange.com/questions/138521/is-javascript-interpreted-by-design

例如,V8 is the JavaScript engine used in Google Chrome, node.js也可以嵌入到C++应用程序中。

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

Asm.js consists of a strict subset of JavaScript, into which code written in statically-typed languages with manual memory management (such as C) is translated by a source-to-source compiler such as Emscripten (based on LLVM). Performance is improved by limiting language features to those amenable to ahead-of-time optimization and other performance improvements.

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

当然,对于您可以用它做什么,也有很多限制,因为它主要面向只处理数字。参见 http://ejohn.org/blog/asmjs-javascript-compile-target/

对 Asm.js 的真正支持仍然是一个限制,因此您不能使用 "use asm" 之类的东西,尽管您可以 运行 Asm.js 在当今的浏览器和获得一些性能改进,它不会像在可以 优化 Asm.js 代码 的浏览器中那样好。但是,我们可能会在(希望不久的将来)开始进行该改进和其他一些改进。参见 https://blog.mozilla.org/research/2015/02/23/the-emterpreter-run-code-before-it-can-be-parsed/

同时,对于需要处理更多数字的更通用的 JS,您可以使用 Google Closure Compiler. I would recommend that you take a look at the FAQ first, and then you could start playing with it in the online tool.