编译器和解释器的区别在于是否编译和执行过程是否是同时进行。
编译器所干的事,将一门语言 X 编译为另一门语言 Y (可以是语言 X、高级语言、低级语言等),整个编译过程涉及词法分析、语法分析、语义分析。该过程往往由程序员在编写程序时完成。
而解释器则直接将语言 X 编写的程序在目标机器上运行。CPU就可以被当作某种指令集合的解释器。事实上,CPU的指令集合可能比我们看到的更复杂,其内部由更多的私有指令集合组成,转化为可见的公有指令集合。
引入解释器的思想,逐渐演化出JIT编译器(Just-in-Time Complier):和AOT编译器(Ahead-of-Time Complier)。
两者主要是区分编译过程出现的时机。前者在程序执行时进行编译;后者则是在程序执行前进行编译。需要注意的是,JIT编译器将语言 X 转化为机器代码时,需要解释器的参与。可以认为,没有解释器,亦不存在JIT编译器。
Java语言的编译和执行中,均涉及编译器和解释器。
首先,程序员在编写Java程序时,利用Java编译器,将Java语言编译成Java ByteCode;之后,执行过程中需要使用JVM(Java虚拟机)将ByteCode转化为机器代码。对于JVM的设计有两种,一种使用解释器直接在目标机器上执行,一种则是使用JIT编译器。前者使编译和执行的过程同时进行,对于执行次数比较少的ByteCode来说,此处的编译时间可以忽略不计;而对于频繁执行的ByteCode来说,编译时间是累加的。因此JVM通过统计ByteCode的执行次数来进行优化,其根据执行频率判断是否将ByteCode预先编译成机器代码,以节省时间,提高执行效率。
注:如文中有误或者不清楚的地方欢迎留言勘误。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。