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有什么区别?


目录
相关文章
面试题:多态是编译时行为还是运行时行为?
面试题:多态是编译时行为还是运行时行为?
76 0
|
XML 开发框架 Java
《Spring6核心源码解析》已完结,涵盖IOC容器、AOP切面、AOT预编译、SpringMVC,面试杠杠的!
全网首个全面解析Spring6核心源码的专栏,涵盖:IOC容器、AOP切面、声明式事务、AOT预编译和SpringMVC,让你从根本上彻底掌握Spring6核心技术。
541 1
《Spring6核心源码解析》已完结,涵盖IOC容器、AOP切面、AOT预编译、SpringMVC,面试杠杠的!
面试时通常让你默写的运行时异常与编译时异常举例
面试时通常让你默写的运行时异常与编译时异常举例
|
移动开发 JavaScript 算法
web前端面试高频考点——Vue原理(diff算法、模板编译、组件渲染和更新、JS实现路由)
web前端面试高频考点——Vue原理(diff算法、模板编译、组件渲染和更新、JS实现路由)
218 0
|
自然语言处理 编译器 程序员
掌握C++编译过程:面试中常见问题解析
C++是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C++代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C++程序从源代码到可执行文件的转换过程,包括预处理、编译、汇编和链接四个阶段。
169 0
掌握C++编译过程:面试中常见问题解析
|
前端开发 JavaScript
前端学习案例-js预编译面试题2
前端学习案例-js预编译面试题2
80 0
前端学习案例-js预编译面试题2
|
前端开发 JavaScript
前端学习案例-js预编译面试题1 原
前端学习案例-js预编译面试题1 原
73 0
前端学习案例-js预编译面试题1 原
|
编译器 程序员 C语言
程序的编译与链接(预处理详解)+百度面试笔试题+《高质量C/C++编程指南》笔试题
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
122 0
|
Java
【java面试题001】Boolean b = new Boolean(“abcde”); 会编译报错吗?
【java面试题001】Boolean b = new Boolean(“abcde”); 会编译报错吗?   不会编译报错,在Boolean的构造函数中,除了”true”和”false”之外的字符串虽然不会造成编译错误,但是会返回false。
1225 0
|
Java .NET 程序员
《.NET程序员面试秘笈》----面试题15 .NET程序是如何编译的
【考点】CLR的知识,中间语言的知识。
2043 0

热门文章

最新文章