第21题:JavaScript 编译 - JIT (just-in-time) compiler 是怎么工作的?
Posted 前端面试每天1题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第21题:JavaScript 编译 - JIT (just-in-time) compiler 是怎么工作的?相关的知识,希望对你有一定的参考价值。
答案:JIT compiler,通过对多次执行的代码的编译结果的存储,以及对变量类型的合理推测,尽管存在运行时间加长的可能,但还是整体降低了 javascript 代码的平均执行时间。 JIT 的原理 通过“概率推测”机制提升性能。
扩展阅读:
基本概念
有两种方式可以将程序翻译成机器可执行的指令,使用编译器 (Compiler) 或者是 解释器 (Interpreter)
(1)编译器 (Compiler):提前将结果翻译出来,并生成一个可执行程序。优点:不需要重复编译,并且可以在编译时对代码做优化;缺点:需要提前编译。
(2)解释器 (Interpreter):解释器是边翻译,边执行。优点:快速执行,不需要等待编译;缺点:相同的代码可能被翻译多次。
JIT Compiler产生的背景
JavaScript 刚出现的时候,是一个典型的解释型语言,因此运行速度极慢,后来浏览器引入了 JIT compiler,大幅提高了 JavaScript 的运行速度。主要是因为浏览器在 JavaScript engine 中加入了一个 monitor,用来观察运行的代码,并记录下每段代码运行的次数和代码中的变量的类型,提高运行速度。
JIT Compiler 机制
第1步:解释器 (Interpreter)执行打标。
当某一行代码被执行了几次,这行代码会被打上 Warm 的标签;当某一行代码被执行了很多次,这行代码会被打上 Hot 的标签;
第2步:Baseline(基础的) Compiler
被打上 Warm 标签的代码会被传给 Baseline Compiler 编译且储存,同时按照 行数 (Line number) 和 变量类型 (Variable type) 被索引。当发现执行的代码命中索引,会直接取出编译后的代码执行,从而不需要重复编译已经编译过的代码。
第3步:Optimizing(优化的) compiler
被打上 Hot 标签的代码会被传给 Optimizing compiler,这里会对这部分代码做更优化的编译。怎么样做更优化的编译呢?关键点就在这里,没有别的办法,只能用概率模型做一些合理的 ”假设 (Assumptions)“。
以上是关于第21题:JavaScript 编译 - JIT (just-in-time) compiler 是怎么工作的?的主要内容,如果未能解决你的问题,请参考以下文章