1、先看个问题
function func(age) {
console.log(age);
var age = 25;
console.log(age);
function age() {}
console.log(age);
}
func(18);
输出什么?
2、js是什么语言
js是弱类型,动态语言,静态作用域,解释型语言。 但是这个解释型,现在有点假了。 因为,也加入了jit。
3、基础概念
js是动态语言,JAVA是静态语言。
区分规则:静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。
js是解释型语言,JAVA也是解释型语言。
区分规则:根据计算机程序运行的机制,我们把,不需要编译成机器码的执行方式,叫做解释执行。
与解释执行对应的,是编译成目标代码,直接在 CPU 上运行。而根据编译时机的不同,又分为 AOT 和 JIT。AOT提前编译。
jit的优势
一般来说,一个稍微大点儿的程序,静态编译一次,花费的时间很长,而这个等待时间是很煎熬的。如果采用 JIT 机制,你的程序就可以像,解释执行的程序一样,马上运行,得到反馈结果。
其次,JIT 能保证代码的可移植性。在某些场景下,我们没法提前知道,程序运行的目标机器,所以,也就没有办法提前编译。Java 语言,先编译成字节码,到了具体运行的平台上,再即时编译成,目标代码来运行,这种机制,使 Java 程序具有很好的可移植性。
再比如,很多程序会用到 GPU 的功能,加速图像的渲染,但针对不同的 GPU,需要编译成不同的目标代码,这里也会用到即时编译功能。
最后,JIT 是编译成机器码的,在这个过程中,可以进行深度的优化,因此程序的性能要比解释执行高很多。
原来一些解释执行的语言,后来也采用 JIT 技术
而从实际应用来看,原来一些解释执行的语言,后来也采用 JIT 技术,优化其运行机制,在保留即时运行、可移植的优点的同时,又提升了运行效率,JavaScript 就是其中的典型代表。基于谷歌推出的 V8 开源项目,JavaScript 的性能获得了极大的提升,使基于 Web 的前端应用的体验,越来越好,这其中就有 JIT 的功劳。
对应:
动态语言对应静态语言,强类型语言对应弱类型语言,解释性语言对应编译型语言。 静态作用域(词法作用域)对应动态作用域。
js作用域:
全局作用域,函数作用域,块级作用域。
v8的jit时机
JIT(just-in-time)是什么
一般来说,每个浏览器、运行时都可能实现自己的JIT编译器,但通常其理论是一样的,遵循相同的结构。
解释器
由于JS是解释型语言,JS引擎需要将代码逐行翻译为可执行的代码,可执行的代码有多种形式,其中较常见的有基于AST直接执行及ByteCode的执行方式。
监视器(分析器)
在解释器执行代码时,监视器会对代码进行分析,跟踪不同的语句被命中的次数,随着次数的不断增长,该语句会被标记为warm、hot、very hot(SpiderMonkey中的really hot)。换句话说,监视器会检测哪些部分的代码被使用最多,然后将它们发送给JIT进行编译和存储。JIT引擎会针对这些代码逐行进行机器码编译,然后存储在一张表的单元中(表单元指向被编译的机器码)。
warm 将解释执行代码发送给JIT引擎,将其编译为机器码,但此处不会进行替换
hot 解释执行代码将被替换为warm编译出的机器码执行
very hot 将解释执行的代码发送给优化编译器,创建和编译出更高效的机器码执行代码并进行替换