前言
刚接触编程的小伙伴大概率会对编程语言的不同种类产生疑惑,并且不知如何区分以及理解这几种不同的编程语言种类
本篇文章将使用类比的思想方法来解释编译型语言、解释型语言与脚本语言的联系与区别,如有疑问,欢迎留言讨论
种类名称的来源
在解释他们之间的区别之前,我们不妨先了解一下这些语言诞生背后有哪些故事。如果觉得历史无聊或者文字过多,可以直接前往联系与区别部分,不过这部分内容的价值是隐性的,是否跳过取决于个人选择,我推荐阅读。若真要跳过,这有一个传送门:点我。
要解释为什么需要将编程语言分成三类,我们不妨回溯思考一下,为什么会产生三种不同类型的编程语言。而问到编程语言的产生,自然而然地应该能够想到是因为程序员们或者说计算机从业者们有这样的需求。因此,三种不同种类的语言应该可以对应三种不同的需求。
在早期的计算机世界里,没有接近人类自然语言的程序语言(高级程序语言),此时的程序员们通常会使用的程序语言一般为汇编语言(低级程序语言),当然科技的诞生就是为了解放生产力,复杂、可读性差的汇编语言已经无法满足人们对于便捷开发的需求了,于是乎各种大佬云起,用汇编开发了早期的编程语言来提高开发效率,然后一个跨时代的东西出现了——Unix操作系统与C语言,在这篇文章中不需要了解Unix是什么,但是可以留个这东西很厉害的印象,以后可能会介绍。后面的历史我做一些省略,直接前往微软开发出Windows操作系统与苹果开发出MacOS操作系统的时代。此时其实还有一个重要的操作系统Linux也诞生了,不过Linux的发展还需要一段时间。到了这个时候,大概已经是21世纪初了,市面上流行的编程语言已经非常接近人类的自然语言来,比如在C中输出语句的函数名就叫做printf(print formatted message)。而这时候对于程序运行的不同需求已经开始出现了。
运行效率优先
运行效率对应着编译型编程语言,至其缘由,我缓缓道来。上文说了我将使用类比思维来便于理解,这里我类比的对象是人与人之间的交流。
假设有小明和李华两个人,他们彼此之间需要交流内心的想法。假如两人面对面时可以用什么方法交流呢?(口口相传,逃)这很容易想到,如果两人为同一语言使用者,比如两人都是汉语母语者,那么他们就可以很方便的交换想法。再进一步完善情景,假设李华是小明的班长,此时需要小明配合完成一件事情,那么如果她的表达像编译型编程语言一样,会发生什么情形呢?我们知道,编译型编程语言会直接将程序代码(人类自然语言,高级语言)转换成机器语言(由0、1组成的二进制指令,低级语言),来完成人类想法及程序算法的究极转化,那么同样的如果此时的李华拥有如编译型编程语言般的表达能力,她就能直接操控将自己的想法传入小明的脑中(假设她真可以做到),使得小明能够几乎百分百的知晓李华想要他去做的事情(传达过程有三体人交流的既视感)
而这其实也是编译型编程语言真正在做的,它能将我们编写的代码近乎直接转化为机器可识别的机器代码,从而实现了高效率。有测试称在实现同样功能下,C++编译(编码翻译)生成的程序的运行效率是汇编代码的80%~90%,可见其效率之高。
平台兼容性优先
平台兼容性优先则对应着解释型语言与脚本语言。上文中有提到过现如今主要有三种不同的操作系统,Windows,MacOS与Linux,这里我们不展开讨论三个系统的优缺点,我们只考虑我们编写的程序是否能同时在这三个操作系统中正常运行,也就是程序的兼容性是否达到了我们的预期。
在讲解释型编程语言与脚本语言的工作原理前,不如先解释解释为何编译型编程语言的兼容性不能够满足我们跨平台的需求。上文已经粗略的用类比法描述了编译型编程语言在编译代码时所完成的事情,如果我未表达清楚而诞生了新的疑惑,欢迎评论提问。编程性编程语言虽然在编译代码时能够将代码转换成当前电脑可识别运行的机器码,但是当前机器可识别运行的机器码,就一定能被所有电脑识别运行嘛?就好像虽然大家都会认汉字,但在拥有认识汉字的能力后却并不意味着也同时拥有了认清所有人写出来的汉字的能力。所以同一份代码在A电脑上编译运行成功,并不能保证一定能在B电脑上运行成功。甚至可能还会出现在A电脑上能够正常打开的程序,移植到B电脑上就打不开了的奇特现象。所以为了解决这个问题,往往需要对代码进行兼容性测试,并且还需要在不同平台下编译生成与之对应的可执行文件后(可以直接运行的机器代码文件,在windows下就是exe文件)才可以实现全平台通用的功能,这对于想要实现小功能的工具类程序是非常不方便的,因为这也意味着同一份代码需要进行多次编译。(QQ就有多平台发行版本)
就是在这种需求的背景下才出现了很多支持一次编译代码后就能够跨平台运行的程序语言。这时候,出现了一个问题,既然这种语言这么方便,为什么没有取代编译型编程语言啊。其实是因为它为了满足兼容性要求而牺牲了一些性能。原来,解释型语言在编译生成代码时,并不会将代码直接转换成本地机器代码,而是会转换成一种介于人类语言与机器语言的中间代码,然后在运行程序时,解释型语言又会根据当前运行程序的电脑的一些特性,创建一个脑中脑(虚拟机),从而为中间代码创建运行环境,并以此提供一些必要的运行条件,至此才有了一次编译,处处运行的成果。
脚本语言就更牛了,直接跳过编译环节,用脚本解释器来动态运行源代码,比如有一个Python的代码文件start.py
,运行它只需要在命令行中键入python start.py
即可,无需编译成对应的可执行文件,这对于需要反复试错的代码简直就是一种救赎,而且能够直接运行代码的特性也使得脚本解释器有着极高的容错能力(意味着出现BUG时,BUG也越奇怪,嘿嘿)。至于原理嘛,其实也很简单,就是让脚本解释器直接拥有阅读人类代码的能力,同时脚本解释器就像一个翻译官,一边阅读解析人类代码,一边将其翻译成机器代码然后交给计算机运行。
讲完了脚本语言与解释型语言的运行原理,也许就可以理解为什么说这两种语言在一定程度上牺牲了运行效率。机器当然更喜欢它可以直接读取运行机器代码,而不是中间代码,甚至是源代码。同样的,机器运行机器代码的速度当然会快于运行中间代码或源代码的速度,而且,机器其实并不能直接运行中间代码与源代码,上文原理已经解释过了,如还有疑问,欢迎留言。
有舍才有得啊。
联系区别与建议
首先从本质上讲,编程语言只是人类为了向计算机表达想法而设计出来的一种语言,既然是语言,不管是编译型语言也好,解释型语言也罢,或者说脚本语言,它们都是为了实现人类与计算机之间的高效交流才被设计出来的,其实简单点来理解的话,可以将它们都理解成一种交流沟通的工具。那么,既然是工具,当然是怎么好用怎么来啦,并不需要因为某种语言的普遍缺点,而去轻视某种语言,因为是人成为了工具的创造者与使用者,而不是工具成为了人的枷锁与桎梏。所以,希望大家在专攻于一门语言的同时,也能够去了解和尝试更多拥有其他特点的语言。这就好比武器虽有刀枪棍棒,却各有人爱。当然啦,大家都用说明有用它的道理,也不要特立独行而错失大局。比如你可以选择一门热门语言作为吃饭工具,但同时钻研一门自己特别喜欢的语言作为业余爱好玩耍。
这里的联系区别我含糊地略讲过了,23333,要详细地讲清楚它们之间的共性与个性完全可以另起一篇博文,在此讲清楚的话,怕是会劝退大部分人。
结语
总的来说,这篇博文发的还是太仓促了,以及大面积的文字对于大部分入门的伙伴来说还是不够友好,不过这是第一篇开门作,往后的初识语言系列会配合一些我在B站上找到的精华视频同步编写,至于原因,下一篇博客我会具体地讲一讲视频学习与文字学习在入门阶段的不同作用。