从浏览器到JS系列(一)JS引擎,JS虚拟机,JS运行时(4)

1.什么是解释器和编译器

2.什么是JIT

接上一篇剩下的问题:

1.什么是解释器和编译器

这个问题在前面的文章中其实已经被解释得差不多了。一般来说CPU只能执行机器码(机器语言),而一般程序员写代码的语言是高级程序语言,无法被CPU直接执行,所以就需要个中介去翻译,去联接两者。对静态语言而言处理这事的就叫编译器,对动态语言而言就是解释器。这样就十分泾渭分明了,静态语言对应编译器,动态语言对应解释器。但这样的解释是不够,只有简单的是什么,就像一个萝卜一个坑一样一个一个安下去。很多时候不必太关注是什么,而要关心做了什么。就像编程中的鸭式辨型。

简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。比方说,当你写了 var a = 1 + 1; 这样一段代码,JavaScript引擎做的事情就是看懂(解析)你这段代码,并且将a的值变为2。

学过编译原理的人都知道,对于静态语言来说(如Java、C++、C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器(Interpreter)。这两者的区别用一句话来概括就是:编译器是将源代码编译为另外一种代码(比如机器码,或者字节码),而解释器是直接解析并将代码运行结果输出。 比方说,firebug的console就是一个JavaScript的解释器。

但是,现在很难去界定说,JavaScript引擎它到底算是个解释器还是个编译器,因为,比如像V8(Chrome的JS引擎),它其实为了提高JS的运行性能,在运行之前会先将JS编译为本地的机器码(native machine code),然后再去执行机器码(这样速度就快很多),相信大家对JIT(Just In Time Compilation)一定不陌生吧。

————我们应该如何去了解JavaScript引擎的工作原理

 实际上很多解释器内部是以“编译器+虚拟机”的方式来实现的,先通过编译器将源码转换为AST或者字节码,然后由虚拟机去完成实际的执行。所谓“解释型语言”并不是不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已。 

————虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 

最后一个问题:什么是JIT 

在主流商用JVM(HotSpot、J9)中,Java程序一开始是通过解释器(Interpreter)进行解释执行的。当JVM发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“热点代码(Hot Spot Code)”,然后JVM会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为:即时编译器(Just In Time Compiler,JIT)

JIT编译器是“动态编译器”的一种,相对的“静态编译器”则是指的比如:C/C++的编译器

JIT并不是JVM的必须部分,JVM规范并没有规定JIT必须存在,更没有限定和指导JIT。但是,JIT性能的好坏、代码优化程度的高低却是衡量一款JVM是否优秀的最关键指标之一,也是虚拟机中最核心且最能体现虚拟机技术水平的部分。

————JIT编译器

JIT是"just in time"的简写,在编程中它指代一种动态编译技术。即在运行时将"热点代码"编译成相关机器码并存储起来以待下次运行(本地代码)。这样的优点是运行速度更快,缺点也很显然,就是占据更多的空间(因为需要将编译好的机器码存储起来),以空间换时间,那如何更精准地识别"热点代码",更有效地利用空间应该就是JIT的优化内容之一

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值