Javascript编译还是两遍解释?

5
我是一名初学者的JavaScript程序员,正在努力学习更多技术。我转向你们寻求帮助,有一个简单的问题:)。我正在阅读的O'Reilly书籍经常提到JavaScript代码的编译时间。我对函数式编程(scheme和类似语言)的了解告诉我,JavaScript实际上是由浏览器解释的,很可能需要通过两个JavaScript来进行处理。
我的判断是否不正确?或者该书所提到的编译时间实际上只是解释器的第一遍,类似于Perl或Python的功能?谢谢!

大多数动态语言实现都会首先将输入“解析”为某种抽象语法树 - 这是检测语法错误的部分。之后,AST可以直接运行(“遍历”),也可以转换为某种内部字节码和/或JIT。如何运行在ECMAScript规范中没有指定,并且在不同的实现之间差异很大。 - user166390
3个回答

11

这取决于浏览器。查看 WebKit 的 SquirrelFish Extreme 和 Google V8,了解最快的实现方式,并查看 Mozilla 的 JaegerMonkey 进行实现。

据我所知,V8 和 SFX 都是 JIT 编译器,它们将 JS 代码编译为本地代码。JaegerMonkey 和 TraceMonkey 在 Firefox 中组合形成一个系统,其中如果代码更适合跟踪执行,TraceMonkey 将其执行,如果代码更适合本地执行,JaegerMonkey 将其编译,就像 SFX 一样。


确实如此,除了遵循ECMAScript语言规范中概述的语义外,没有强制要求如何运行ECMAScript。 - user166390
你能否预编译 JavaScript 并根据接收到的用户代理将其发送到浏览器? - Ced

0

您有一句话可以引用来帮助理解上下文吗?

Javascript 在浏览器中编译(以纯源代码形式发送到浏览器)。但它只会在加载时进行编译。因此,如果您有一个 script 标签,后面跟着一个 div 标签,再后面是另一个 script 标签,那么它们将按顺序加载。浏览器将停止加载整个页面(仍会下载资源,只是不加载 HTML),直到您的脚本已加载(这是因为脚本可能包含 'document.write')。

<script>
var someVariable = 'hello world';
alert(document.getElementById('someid')); //alerts undefined
</script>

<div id='someid'></div>

<script>
alert(document.getElementById('someid')); //alerts 'someid'
alert(someVariable); //alerts 'hello world'
</script>

0
在JS中有读取时间和运行时间(我喜欢这样想,因为它不是真正的编译,而是解释)。听起来O'Reilly的书使用编译时作为读取时间的同义词。
读取时间是引擎读取所有代码并在全局范围内评估所有内容的时间。通常,这会设置事件钩子,以触发代码执行。
运行时间是其他所有时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接