【03|计算机编程思维课-区分编译型语言和解释型语言】
大家好,我是贺哥,五一假期节后第一天,学习不能停,今天我们继续更新专栏,前两讲链接如下
【为什么计算机基础很重要】https://t.zsxq.com/0djQz29X6
【基础语言入门&学习方法】https://t.zsxq.com/0dwJyEbWt
1、静态类型语言和动态类型语言
编程语言按照数据类型大体可以分为两类:一类静态类型语言,另一类是动态类型语言。
(1)静态类型语言
静态类型语言在编译时便已经确定变量的类型。
- 静态类型语言的优点首先是在编译时就能发现类型不匹配的错误,编辑器可以帮助我们提前避免程序在运行期间有可能发生的一些错误。其次,如果在程序中明确地规定了数据类型,编译器还可以针对这些信息对程序进行一些优化工作,提高程序执行速度。
- 静态类型语言的缺点首先是迫使程序员依照强契约来编写程序,为每个变量规定数据类型,归根结底只是辅助我们来编写可靠性搞程序的一种手段, 而不是编写程序的目的。但我们大部分人编写程序的目的是,为了完成公司的需求,来交付到生产环境。另外一个就是说,类型的声明也会增加更多的代码,在程序编写过程中,这些细节会让我们程序员的精力,从思考业务逻辑上分散开来。
(2)动态类型语言
动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。
- 动态类型语言的优点编写的代码数量更少,看起来也更简洁,程序员可以把经历更多地放在业务逻辑上面。虽然不区分类型在某种情况下会让程序变得难以理解,但整体而言,代码量越少,越专注于逻辑表达,对阅读程序是越有帮助。
- 动态类型语言的缺点无法保证变量的类型,从而在程序的运行期有可能发生类型相关的错误。这就好像在商店买了一包牛肉味辣条,但是真正吃到嘴里才知道是不是牛肉味。
动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性,由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法。
2、编译型语言和解释型语言
说完了静态和动态,我们再来认识一下编译型和解释型,其实这两种才是讨论比较广泛的。
因为任何程序最终都要经过源码编译或解释转换成二进制,才能被计算机识别。
上面的源码指的是,由程序员使用各种编程语言编写的还未经编译或者解释的程序文本,对于计算机而言,计算机其实完全不认识源代码的,也根本无法执行,计算机只能识别某些特定的二进制指令,在程序真正运行之前必须将源代码转换成二进制指令,才能让计算机真正执行。
编译和解释都是对源代码的处理方式,由于他们的操作方法不同,所以会有不同的运行效果。
- 编译是把源代码的每条语句都编译成机器语言, 并最终生成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,在运行时会有很好的性能。
- 解释是只在执行到对应的语句时才会将源代码一行一行的解释成机器语言,给计算机来执行,所以使用解释器来执行的语言也被称为动态语言。
(1)编译型语言
程序在执行之前需要一个专门的编译过程,把程序编译成机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了,程序执行效率高,依赖编译器,如 C/C++、Golang 等,比如 Windows 平台,它们可以编译后生成 .exe文件,之后无需再次编译,直接运行 .exe文件即可。
对于编译型语言 ,开发完成后需要将所有的源代码都转换成可执行文件,可执行文件里面包含的就是机器码,只要我们拥有可执行文件,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”。
在运行的时候,只需要编译生成的可执行文件,不再需要源代码和编译器了,所以说编译器语言可以脱离开发环境运行,但编译型语言一般是不能跨平台的,也就是不能在不同的操作系统之间随意切换。
编译型语言不能跨平台表现在:
- 可执行文件不能跨平台,因为不同操作系统对可执行文件的内部结构有着截然不同的要求,彼此之间也不能兼容。
- 源代码不能跨平台,不同平台支持的函数、类型、变量等有可能不同,基于某个平台编写的源代码一般不能拿到另一个平台下编译。
编译型语言往往会花费较长的编译时间,但编译完成后,会有很好的运行性能,因此,编译型语言编写的程序每次修改都要再次经历一遍完整编译过程后,修改效果才能生效,迭代时间会比解释型语言要长。
由于要经历完整的编译过程,因此程序有任何语法错误都能在编译器被发现,大大降低程序的运行错误。
(2)解释型语言
相对于编译型,解释型程序不需要编译,程序在运行时才翻译成机器语言,每执行一次,都要翻译一次,因此效率比较低。在运行程序时才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译,依赖解释器,如 Java、C#、PHP、JavaScript、Python 等。
对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成激起码,用不到的不进行任何处理。每次执行程序时可能会使用不同的功能,这个时候需要转换的源代码也不一样。
因为每次执行程序都需要重新转换源代码,所以解释型语言的执行效率天生就低于编译型语言,甚至存在数量级的差距。计算机的一些底层功能或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。
在运行解释型语言的时候,我们始终都需要源代码和解释器,所以它无法脱离开发环境。相比于编译型语言,解释型语言几乎都能够跨平台,可以做到“一次编写,到处运行”。
解释型语言之所以能够跨平台,是因为有了解释器这个中间层,在不同的平台下,解释器会将相同的源代码转换成不同的机器码,解释器帮助我们屏蔽了不同平台之间的差异。
注意:
- 我们所说的跨平台是指源代码跨平台,而不是解释器跨平台。解释器用来将源代码转换成机器码,它就是一个可执行程序,是不能跨平台的。
- 官方需要针对不同的平台开发不同的解释器,这些解释器必须要能够遵守同样的语法,识别同样的函数,完成同样的功能,只有这样,同样的代码在不同平台的执行结果才是相同的。
解释型语言不需要编译,程序执行到了,解释器才会去解释对应的语句,所以更多的时间花费在了运行期间,但这类语言编写的程序的修改不需要经历漫长的编译过程,效果能够很快生效。
由于没有经历编译过程,因此即便语法错误,也只能等到运行期间才会被发现。
3、执行流程
编译型语言和解释型语言的执行流程:
4、差异总结
编译型语言和解释型语言的差异总结如下图:
注意,当我们说“下载一个程序(软件)”时,不同类型的语言有不同的含义:
- 对于编译型语言,我们下载到的是可执行文件,源代码被作者保留,所以编译型语言的程序一般是闭源的。
- 对于解释型语言,我们下载到的是所有的源代码,因为作者不给源代码就无法被运行,所以解释型语言的程序一般是开源的。
最后,来一张图总结下
作为一个编程开发者,基本的动态类型、静态类型语言要分得清楚,不然下次面试或者和别人交流,还傻傻分不清就岂不是显得你比较菜哈哈 (ง •̀_•́)ง
如果觉得有帮助,动手点个赞 (♡ര‿ര)给我康康
