JIT(just-in-time)原理

2019-01-24  本文已影响0人  sarah_wqq

原理

对于解释性语言(如JS、Python)来说,解释器将代码一行行得翻译为机器语言,边翻译边执行。而对于编译性语言(C/C++/Java)来说,编译器提前对所有代码进行编译和优化,后续执行程序的时候直接运行机器代码即可,所以编译性语言的执行效率大大高于解释性语言。
解释器运行同样的代码一次以上的时候,比如执行一个循环,解释器不得不一次又一次的进行翻译,效率非常低下。

JIT(即时编译)可以解决一部分反复翻译的问题

在 JavaScript 引擎中增加一个监视器监控着代码的运行情况,记录代码一共运行了多少次、如何运行的等信息。如果同一行代码运行了多次,这个代码段就会被送给JIT机制进行编译和优化,将编译后的机器代码保存在缓存中,下次直接执行这块机器代码即可,大大提高了一些情况下代码的执行效率。

V8引擎中使用

V8有两个编译器

V8引擎还在内部使用多个线程

当第一次执行JavaScript代码时,V8利用full-codegen,直接将解析的JavaScript翻译成机器代码而无需任何转换。当代码运行一段时间后,Profiler线程已经收集了足够的数据以确定哪种方法应该进行优化。接下来,Crankshaft从另一个线程开始对代码优化和缓存。

优化方法:

WebAssembly中使用

WebAssembly是一种新的字节码格式,缩写是"wasm", .wasm 为文件名后缀,是一种新的底层安全的二进制语法。
WebAssembly不算一种一门编程语言,而是一种编译机制,很多浏览器都支持WebAssembly,对WebAssembly格式的解码速度要快得多得多得多。

Python中使用

PyPy可以提供JIT。

上一篇 下一篇

猜你喜欢

热点阅读