3分钟搞懂什么是编译执行和解释执行《轻松搞定大厂面试》

简介: 3分钟搞懂什么是编译执行和解释执行《轻松搞定大厂面试》

理解

在讲"Java是解释执行还是编译执行?"前,先理解一下什么是解释执行,什么又是编译执行。

语言本身用解释型语言还是编译型语言来划分就是不准确的。

设计语言的人,也不会考虑先考虑什么型,而是在设计中发现某种方式更好,便会选择使用。语言属于XX型是呈现给大家的一个印象。


编程语言,是程序员们操控电脑以实现各种功能的主要方式,而解释执行与编译执行,是计算机编程语言的两种执行方式。


更多的时候,某个语言使用到了编译执行也用到了解释执行。


现在来笼统的给大家解释一下。


编译:将源代码一次性转换为机器码的过程(机器码有保存为文件,下次运行的时候直接运行机器码)


解释:将源代逐行转换为机器码并运行的过程(机器码并没有保存下来)


编译执行(编译器):将一段程序直接翻译成机器码(对于C/C++这种非跨平台的语言)或者中间码(Java这种跨平台语言,需要JVM再将字节码编译成机器码)。编译执行是直接将所有语句都编译成了机器语言,并且保存成可执行的机器码。执行的时候,是直接进行执行机器语言,不需要再进行解释/编译。


解释执行(解释器):在执行程序时,再将中间码(例如Java的字节码通过JVM解释成机器码)一行行的解释成机器码进行执行。这个运行过程是解释一行,执行一行。


执行编译过程的程序叫做编译器。


执行解释过程的程序叫做解释器。


图片理解

image.png

根本区别

王垠所说的编译型语言和解释型语言的本质都是解释执行的,个人比较赞同。

编译型和解释型的语言之所以可以说相同,是因为这些语言从文本形式的源代码到最终产生的结果,所经历的过程是一样的。


根本区别是运行时,解释型需要将程序解释成机器码来运行,并没有保存机器码,是在运行过程中进行。


而编译型在运行之前就已经让编译器给程序编译成机器码了。


这也是为什么编译运行会比解释运行快的根本原因。

神比喻

在知乎上看到一个比喻,非常好。

编译相当于做好了一桌子菜,可以直接开吃了。

而解释就相当于吃火锅,需要一边煮一边吃。

那么自然,吃的效率也会低一些。

扩展点

机器码

也就是机器能够直接执行的二进制代码文件。

编译型语言与解释型语言

虽然说将语言划分为编译型语言还是解释型语言不太好,但是还是要讲下,通常大家怎么认为的。


编译型语言的代表是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有什么区别?


目录
相关文章
|
2月前
|
存储 设计模式 Java
深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!
深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!
41 2
|
3月前
|
存储 C++
面试题:C++函数调用的过程?
面试题:C++函数调用的过程?
31 0
|
5月前
|
算法 编译器 C语言
算法小白的心得笔记:分清楚执行程序和动态链接库的编译方式。
-fPIC 选项:这个选项告诉编译器生成位置无关代码(Position Independent Code)。这种代码同样可以在内存的任何位置执行,因为它使用的是相对地址而不是绝对地址。这对于动态库是必要的,因为动态库在被加载时,其在内存中的位置是不确定的。
27 0
|
6月前
|
存储 自然语言处理 算法
通过实际的例子,介绍编译器的工作过程
通过实际的例子,介绍编译器的工作过程
44 0
|
10月前
|
存储
编译与解释的区别
编译与解释的区别
95 0
|
10月前
|
存储 自然语言处理 编译器
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
多线程顺序运行的 4 种方法,面试随便问!
多线程顺序运行的 4 种方法,面试随便问!
196 0
|
测试技术
软件测试面试题:lr中,如果你想停止执行出错的脚本,怎么做?
软件测试面试题:lr中,如果你想停止执行出错的脚本,怎么做?
68 0
|
SQL 测试技术
软件测试面试题:解释以下函数及他们的不同之处?
软件测试面试题:解释以下函数及他们的不同之处?
49 0
|
前端开发 计算机视觉 Python
代码报错还好说,源码报错才难搞!分享自己源码报错的解决过程!
代码报错还好说,源码报错才难搞!分享自己源码报错的解决过程!
86 0
代码报错还好说,源码报错才难搞!分享自己源码报错的解决过程!