vlambda博客
学习文章列表

第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)“