"); //-->
程序的编译和解释,你知道是什么吗?
如果你不清楚,或者了解的有点模糊,那么今天这篇文章也许会帮到你,不妨来看一看,花不了你几分钟的时间,却可以让你get到一些新的知识点或者加深你的理解!
先来简单了解下我们是要说程序的编译和解释,也就是要搞清楚,编译是个啥,解释又是个啥,以及它们之间有啥关系和区别,知道这些啥用,基础知识,可以帮助你更好的编程和学习新的技术知识。
正所谓基础不牢,地动山摇啊,来,先来看看编译和解释是个啥:
编译和解释都属于翻译,翻译的最终目的是把程序源代码变成计算机可以执行的机器语言,也就是二进制的形式. 编译的话是把源程序一次性的翻译成机器语言,这样的话计算机执行起来速度就比较快. 解释的话是程序在执行的时候,一条条的把源码翻译成机器语言,这样的速度就不如编译了.
你要是理解能力超强的话,那看上面这些就基本能掌握今天要说的大部分知识了,只不过这其中牵涉到一些细节性的知识点,以及考虑到大部分人的理解能力不是特别的超强,所以我还是有必要继续的详细的解释一下,如果你觉得只看上面明白的有点不知所以,那不妨跟着我继续往下。
说所低级语言和高级语言学过编程的你们对这两个概念也许并不陌生,啥是低级语言,就是机器语言,汇编语言这些吧,那你说C语言是不是低级语言,其实吧,人家C语言不能算作是低级语言,但是高级语言又算不上,介于两者之间吧。
高级语言就是我们常说的也是大家经常学的这些了,比如Java,Python和C++这些语言。
低级语言 :最基本的低级语言就是机器语言了,早期的编程就是使用机器语言,这样的难度是很大的,也就是0和1那种形式,对,是二进制的形式,二进制就是0和1组成的,不同的组合代表不同的含义或者指令,时代在进步,技术在发展,后来发展了一种把0和1组成的这种机器代码指令用一些助记符号来表示,这就形成了汇编,汇编依然是低级语言,它是需要翻译成机器代码才可以执行
其实可以将汇编代码翻译成不同平台上的机器代码,这叫做交叉汇编技术,不知道讲到这大家理解的怎么样,如果觉得读的酣畅淋漓,很爽的那种,那可以继续往下看,但凡是有点不明不白,那可以稍微停下来,重读一遍,不明白的地方尽量多读几遍,还好理解,既然花时间看这篇文章,还是希望大家有所收获,不能是看完了,啥也没有了。
再来看看高级语言。
上面也大致说了,所谓的高级语言也就是我们熟知的那些Java和跑Python等等,为啥说是高级语言,因为这些语言的设计逻辑大多是按照我们人的正常思维角度去设计的,所以看起啦门槛比较低,大部分高级语言都有自己的解释器,这个解释器就是把源码翻译成目标平台代码去执行。
状态还ok?我们接着往下。
翻译和执行(主要针对Java)这里我想带大家了解两个概念,一个是翻译,一个是执行,就是简单看看这俩货是个啥,这有助于你对编译和解释的理解。
翻译的目的是生成另外一套格式的代码,是将A变成B ,生成的这个B可以直接被计算机执行 ,那就是翻译一步到位,生成目标机器代码,可直接运行 ,这个就叫做编译。
当然 ,生成的B也有可能是个半成品,不能被计算机直接执行,是一种中间代码 需要再次翻译成目标机器代码 ,这个再次翻译的过程称为解释 ,前者从A生成B的过程,也就是生成中间代码的过程也是编译 所以编译可以直接一步到位 ,也可以编译成一个中间代码,再进行解释成计算机可以直接执行的目标代码。
因此,翻译包括两种,一是编译,二是解释。
上面了解了什么是翻译,那执行嘞,对于代码而言,执行的最终目的就是代码要在计算机中运行起来,要想运行起来,那就得经过前面的翻译过程,需要得到目标机器代码,才可以执行。
翻译由上面知道分为编译个解释,那么也即是会有编译执行和解释执行了。
编译执行和解释执行编译执行就是把源程序一步到位翻译成目标机器代码,然后直接运行。
解释执行是把生成的中间代码,就是不是源程序了,然后把中间代码一条一条的翻译成目标机器代码,翻译一条执行一条,边翻译边执行 ,Java就是这样的。
这其实就是在告诉你什么是编译,什么是解释。编译强调的是一次性做好准备工作,就是先把源码全部翻译成机器代码,想要运行的可以直接读取进行执行,但是解释则不同,强调的是用的话再翻译,也就是逐条翻译,翻译一点执行一点,边翻译边执行的这种。
单独看看解释其实我觉得编译比解释好理解点,比较纯粹,也就是把源程序一次性翻译成目标机器代码,直接给你全部一次性搞成你想要的,运行的话直接读取就行了,但是解释就稍显麻烦。
如果你是学Java的很可能对编译和解释就停留在上面的认知了,其实对于Java来说,上述理解很正确,编译和解释理解的也很到位,但是脱离Java放到其他高级语言之中,对于编译的理解没啥问题,但是对于解释的理解就有点偏差,这是因为在Java中,会编译生成中间码,也就是字节码,然后字节码依靠虚拟机解释成平台的目标机器码。
因为并不是其他语言也像java那样会生成中间码,先编译字节码,再解释成目标机器码,所以对于Java这门高级编程语言来说,既不能说是编译型语言也不能说是解释型语言,而是两者都包含。
谈到大家熟知的另外一门语言Python,它的翻译模式就跟Java很像,也是先编译成中间码码,然后再交由解释器去解释执行,但是像PHP这门语言就不同,它就是一门解释型语言。
对于PHP来说,就是把源程序直接进行逐条翻译成目标机器码然后执行 中间没有编译啥的,直接就是解释一条执行一条的这种,说的专业点也就是PHP将代码解释为opcode之后再交由Zend引擎执行。
像C和C++,就是编译型的语言,它会首先把源程序一次性编译成目标机器代码,然后再执行。
重要理解点,两者区别这里说一个编译额解释两者的一个区别,因为个人觉得知道这点,对理解编译和解释之间的不同是有很大帮助的。
我们看编译,经过上述的阐述,你应该知道了,编译讲究的是把源程序一次性翻译成目标机器代码,然后交由计算机去执行,这里面很重要的一点就是,程序代码经过编译之后会生成另外一种可存储的代码,计算机执行是去读取这些生成的代码,一般就是目标机器代码。
我们看Java的编译过程,它是生成中间码,也就是字节码,这个字节码你是可以看到的吧,就是javac命令之后的字节码文件,这是可见的可存储的另外一套代码,生成的是可存储的,这是编译的一个特征。
再反观解释,解释一般就是翻译和执行一起进行,逐条翻译,然后边翻译边执行,这个过程是不生成可存储的目标代码的。
对于编译来说,它的翻译和执行是分来的,先翻译成一份代码,然后再执行,但是对于解释则不同,它的翻译和执行是不分开的,翻译和执行同步进行的。
知道什么是编译和解释了吗到了这里,不知道你搞清楚编译和解释了吗?如果还是有点模糊,看看我下面的总结。
总结我们写的代码最终想要在计算机上运行,是要转换成计算机可以识别的机器代码的,这个过程叫做翻译,翻译的方式分为两种,一种是编译,一种解释:
1、编译:把源代码或者是源程序一次性的翻译成目标机器代码,然后再执行,速度比较快,类似吃火锅,先全部下完,然后再一起吃。2、解释:把源码或者源程序逐条进行翻译,就是翻译一条执行一条,类似吃火锅, 下着吃着。
最后提一点,关于编译和解释的一个背后的本质现象,就是在编译的过程中,控制权在原始程序,也就是源码或者源程序,因为是要把源程序一次编译成目标代码的,所以你源程序决定了编译后的最终机器代码,而解释则不同,它的控制权在于解释器,因为是读一条解释一条,这个中间解释的过程是解释器在主导。
再说回吃火锅,边吃边下,相当于你是那个解释器,你可以决定我吃啥,想吃啥就下啥,但是编译那种,就像吃火锅,一次性都放进锅里,你并不能决定你想吃啥就下啥,而是取决于你的食材,全部下在锅里,你也就只能吃那么多了,也就是只能在锅里选择了。
咋样,这下清楚了吗?如果还是不明白,那我建议再读一遍,或者留言说出你的疑惑。
另外由于本人技术能力有限,如果文章说的有不对的地方,烦请指正,大家一起学习!
ps:其实现在不能再那么肯定说什么什么语言是解释型还是编译型,毕竟技术在进步,比如大家都觉得C语言就是编译型语言,使用gcc编译,但是实际上在TCC上可以直接解释执行。再比如PHP真的就是解释型语言嘛,Facebook很早就搞过一个hiphop编译器,可以将PHP编译成C++再编译成二进制。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。