V8引擎的JIT技术简述

      JIT,全称是 Just In Time,混合使用编译器和解释器的技术。而编译器启动速度慢,执行速度快。而解释器的启动速度快,执行速度慢。而JIT技术就是博两者之长。如图示:

V8引擎的JIT技术简述

      正常来说,一般的js代码,会通过V8提供的解析器,生成对应字节码,然后解释器直接解释执行字节码。但是这样子虽然启动快,但是会影响到js的执行效率。此时,通过在解释器解释字节码的时候增加一个监控模块,如果发现一段代码会被重复执行,则监控模块会将此段代码标记为热点代码,同时交给V8提供的编译器对这段字节码进行编译,编译为二进制代码,然后再对编译后的二进制代码执行优化操作,从而提供其执行效率。等后面V8再次执行这段代码,则会采用这段优化后的代码进行编译执行,从而提升代码的运行效率。

    而热点代码的是否有效,取决于不同的语言的实现。举js为例,由于js语言是一门动态语言,因为在程序运行的过程中可以动态增减属性,而经过优化编译器优化过的代码只能针对某种固定的结构,此时优化编译器就需要执行反编译的操作,回退到解释器解释执行的状态,因为会造成程序运行效率的降低。所以在日常编码中,建议使用稳定的数据结构,并且少使用delete等操作,同时推荐使用typescript这种静态语言支持的语言进行编码。

   Java使用的JIT技术,也是混合使用编译器和解释器。但是由于Java是一门静态语言,所以Java可以先使用编译器进行编译,然后再使用解释器来执行编译后的代码。这一点刚好和JS语言有所区别,这根语言是否为动态或者静态语言有关。

 

关于V8的JIT技术的疑问:

  • 热点代码的生成,跟js代码重复执行的次数有关,那这个次数是多少?其他虚拟机如JVM的次数又是多少?基于什么考虑而制定这个数目?可以进行调整吗?
  • 对于后面V8引擎支持的WebAssemby,在整个V8执行WebAssemby代码,是怎么处理的,跟处理普通的JS代码有什么不同?

 参考资料:

https://segmentfault.com/a/1190000016284865

http://yangxikun.github.io/php/2016/11/04/php-7-engine.html

https://zhuanlan.zhihu.com/p/39141067

https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/index.html

https://time.geekbang.org/column/article/211682

https://www.ibm.com/developerworks/cn/web/wa-lo-webassembly-status-and-reality/index.html

https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts