3分钟搞懂什么是编译执行和解释执行《每日一个Java知识点,轻松搞定大厂面试》
在讲"Java是解释执行还是编译执行?"前,先理解一下什么是解释执行,什么又是编译执行。
语言本身用解释型语言还是编译型语言来划分就是不准确的。
设计语言的人,也不会考虑先考虑什么型,而是在设计中发现某种方式更好,便会选择使用。语言属于XX型是呈现给大家的一个印象。
编程语言,是程序员们操控电脑以实现各种功能的主要方式,而解释执行与编译执行,是计算机编程语言的两种执行方式。
更多的时候,某个语言使用到了编译执行也用到了解释执行。
现在来笼统的给大家解释一下。
执行编译过程的程序叫做编译器。
执行解释过程的程序叫做解释器。
王垠所说的编译型语言和解释型语言的本质都是解释执行的,个人比较赞同。
编译型和解释型的语言之所以可以说相同,是因为这些语言从文本形式的源代码到最终产生的结果,所经历的过程是一样的。
根本区别是运行时,解释型需要将程序解释成机器码来运行,并没有保存机器码,是在运行过程中进行。
而编译型在运行之前就已经让编译器给程序编译成机器码了。
这也是为什么编译运行会比解释运行快的根本原因。
在知乎上看到一个比喻,非常好。
编译相当于做好了一桌子菜,可以直接开吃了。
而解释就相当于吃火锅,需要一边煮一边吃。
那么自然,吃的效率也会低一些。
也就是机器能够直接执行的二进制代码文件。
虽然说将语言划分为编译型语言还是解释型语言不太好,但是还是要讲下,通常大家怎么认为的。
编译型语言的代表是C、C++,C语言源代码被编译之后生成中间文件(.o和.obj),然后用连接器和汇编器生成机器码,也就是一系列基本操作的序列,机器码最后被执行生成最终动作。
解释型的语言代表Java、Python、Ruby,也经历了这些步骤,不同的是,C语言会把那些从源代码“变”来的基本操作序列(保存)起来,而Java/Python/Ruby直接将这些生成的基本操作序列(虚拟机)指令丢给虚拟机执行然后产生动作了。
所以我们看到的现象是,编译型语言要先编译再运行,而解释性语言直接“运行”源代码。
除了BASIC这样特别早期的解释型语言,是直接解释执行,现在的解释型语言都采取将代码编译为某种特定的虚拟机代码或者机器码的形式,然后再执行那些编译好的代码。BASIC这种直接解释的,我们可以将他的基本操作序列理解为直接执行基本操作的那些函数。
现在关于解释和编译的界限也不是特别清晰了。
Java需要预先把代码编译成虚拟机指令的,然后在运行这些虚拟机指令,有的教科书上会成为混合型或者半编译型。
像Python和lua这样就更不好分了,可以直接解释源代码运行,也可以编译为虚拟机指令然后再运行。
php编译之后的结果可以被Web Server缓存起来,甚至还可以先被翻译为C++,然后再编译。.NET 的CLR运行时是Windows的组成部分,编译好的.NET 系列语言的代码直接生成可执行文件,然后被“直接”执行,看起来跟C没有什么太大的差别。
JavaScript可以被V8引擎编译为机器码然后执行,如果在node.js下,这个编译结果被缓存起来了,你说这跟编译好再执行的C有什么区别?
下篇讲讲Java中的解释执行和编译执行