将代码翻译成机器代码时,主要有两种方法:解释器和编译器。 JavaScript 通常被称为解释性语言,但这并不完全准确,我将解释原因。
解释器与编译器
解释器逐行翻译代码,这非常适合快速运行代码。这是一种快速开始执行的方法,但有一个缺点——它不能优化重复性任务。例如,如果您的代码有一个重复相同结果的循环,解释器将每次处理它而不进行任何优化,从而减慢速度。
另一方面,编译器一次性获取整个代码并将其转换为机器代码。这个过程一开始需要更长的时间,但是在初始编译之后,它运行得更快。这是因为编译器可以优化重复性任务,例如循环,从而使代码更加高效。
输入 JIT(即时)编译器
在 2000 年代末,工程师看到了解释器和编译器的优势,并决定创建更好的东西 - JIT(即时)编译器。这种混合方法结合了两全其美的优点。
工作原理如下:
当您向浏览器提供 JavaScript 文件时,代码会通过解析器,将其转换为抽象语法树 (AST)。
此时,需要做出一个决定:
如果代码不需要优化,它会直接进入解释器,解释器将代码翻译为机器可读的指令(二进制)。
如果代码具有重复或复杂的任务,探查器会检测优化的需要并将其转发给编译器,编译器会优化代码并进行翻译。
这是更好理解的最佳图表
那么,当有人问“JavaScript 是一种解释性语言吗?”时你可以说“技术上是”,但这取决于实施。由于 JIT 编译,JavaScript 同时使用解释器和编译器。
这里有一个例子来演示解释器和编译器之间的效率差异。
function calculateSum() { let sum = 0; for (let i = 0; i < 1000000; i++) { sum += i; } return sum; } console.log(calculateSum());
在此示例中,解释器将逐一执行循环的每次迭代。另一方面,JIT 编译器会注意到可以优化循环,从而加快第一次运行后的执行速度。
结论
了解 JavaScript 的底层工作原理有助于您欣赏它的灵活性和效率。解释器和编译器的结合(得益于 JIT)使 JavaScript 能够在现代浏览器中快速高效地运行。
下次有人将 JavaScript 称为解释性语言时,您可以解释一下,虽然它一开始是这样的,但在需要优化时它也可以表现得像编译语言。
以上是为什么 JavaScript 不仅仅是一种解释性语言:了解 JIT 编译的详细内容。更多信息请关注PHP中文网其他相关文章!