『无为则无心』Python基础 — 2、编译型语言和解释型语言的区别
1、什么是计算机语言
计算机就是一台用来计算机的机器,人让计算机干什么计算机就干什么。我们需要通过计算机的语言来控制计算机,所谓计算机的语言就是编程语言。
计算机语言其实和人类的语言没有本质的区别,不同点就是交流的主体不同。也就是说中文、英文是人和人之间的交流语言,而计算机语言(编程语言)是人和计算机交流的语言。
计算机语言发展经历了三个阶段:
(1)机器语言
- 最早的一种计算机语言。
- 机器语言通过二进制编码来编写程序,二进制编码就是1和0,计算机也只认识1和0。
- 执行效率高,但编写起来太麻烦。
(2)汇编语言
- 使用符号(如ABC和各种符号)来代替二进制编码。
编写程序时,不需要使用二进制,而是直接编写符号。
编写完成后,需要将符号转换为机器码,然后再由计算机执行。 - 符号转换为机器码的过程称为汇编。
- 将机器码转换为符号的过程,称为反汇编 。
- 汇编语言一般只适用于某些硬件,和硬件的关系太紧密,兼容性比较差 。
就好比不同硬件厂商识别符号的标准是不一样的。 - 现在的一些硬件驱动还是会用到汇编语言进行编写。
(3)高级语言
- 高级语言的语法基本和现在英语语法类似,并且和硬件的关系没有那么紧密了。
也就是说通过高级语言开发程序可以在不同的硬件系统中运行。 - 高级语言都会有自己的编译器,所编写的代码都会运行在自己的编译器上。
不同系统上安装想对应的编译器,实现一份源码一次编译,到处运行。 - 高级语言学习起来也更加的容易,现在我们知道的语言基本都是高级语言。如
C
、C++
、C#
、Java
、Golang
、Python
等等。
2、高级语言中的编译型语言和解释型语言
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言(二进制编码)。所以使用任何高级语言编写的程序,若想被计算机运行,都必须将其转换成计算机语言,也就是机器码,这个过程就叫编译。比如,一行Python的命令print('hello')
,必需要转换为类似1010101
这样的机器码 ,计算机才能够识别你的命令。
根据从源码转换二进制编码的时机不同,语言分成了两大类:编译型语言和解释型语言。
(1)编译型语言
对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe
文件,可执行程序里面包含的就是机器码。只要我们拥有可执行程序,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”。
在运行的时候,我们只需要运行编译生成的可执行程序,不再需要源代码和编译器了,所以说编译型语言可以脱离开发环境运行。
编译型语言一般是不能跨平台的,也就是不能在不同的操作系统之间随意切换。
编译型语言使用的转换工具称为编译器。常见的编译型语言有C
、C++
、Golang
等。
总结:
- 编译一次后,脱离了编译器也可以运行,并且运行效率高。
- 可移植性差,跨平台性比较差。
(2)解释型语言
对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的不进行任何处理。每次执行程序时可能使用的功能不同,这个时候需要转换的源代码也不一样。
因为每次执行程序都需要重新转换源代码,所以解释型语言的执行效率天生就低于编译型语言,甚至存在数量级的差距。计算机的一些底层功能,或者关键算法,一般都使用 C/C++
实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。
在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境或者运行环境 。
解释型语言使用的转换工具称为解释器。常见的解释型语言有Python
、JavaScript
、PHP
、Shell
等。
总结:
- 每次执行代码都需要解释一次,执行速度比较慢。
- 不能脱离解释器独立运行。
- 跨平台性比较好。
(3)编译型语言和解释型语言执行流程
如下图所示:
3、知识扩展:
(1)扩展1
当我们说“下载一个程序(软件)”时,不同类型的语言有不同的含义:
- 对于编译型语言,我们下载到的是可执行文件,源代码被作者保留,所以编译型语言的程序一般是闭源的。
- 对于解释型语言,我们下载到的是所有的源代码,因为作者不给源代码就没法运行,所以解释型语言的程序一般是开源的。
(2)扩展2
编译器就是一个“翻译工具”,类似于将中文翻译成英文、将英文翻译成俄文。但是,翻译源代码是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个步骤,期间涉及到复杂的算法和硬件架构。解释器与此类似,有兴趣的读者请参考《编译原理》一书,本文不再赘述。
(3)扩展3
Java
和 C#
是一种比较奇葩的存在,它们是半编译半解释型的语言,源代码需要先转换成一种中间形式的文件(字节码文件),然后再将中间文件拿到虚拟机(JVM)中执行。Java
和C#
引领了这种风潮,它的初衷是在跨平台的同时兼顾执行效率。
4、关于 Python
Python 属于典型的解释型语言,所以运行 Python 程序只需要解释器的支持,只要你在不同的平台安装了不同的解释器,你的代码就可以随处运行,不用担心任何兼容性问题,真正的“一次编写,到处运行”。
Python 几乎支持所有常见的平台,比如 Linux、Windows、Mac OS 等,你所写的 Python代码无需修改,就能在这些平台上正确运行,Python 的可移植性是很强的。
最后,一句话介绍Python:Python是解释型语言,是一个强类型的动态脚本语言。
- 强类型:不允许不同类型相加。例如:整形+字符串会报类型错误。
- 动态:不用对变量的数据类型进行声明,且确定一个变量的类型是在第一次给它赋值的时候。
- 脚本语言:一般是解释性语言,运行代码只需要一个解释器,不需要编译。
Tips1
动态类型语言和静态类型语言:
(1)什么是动态类型语言和静态类型语言
动态类型语言:
动态类型语言是在程序运行时确定数据类型的语言。变量使用之前不需要进行类型声明,会在你第一次赋值给变量时,在内部记录数据类型,如Python。静态类型语言:
静态类型语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,如Java。(2)两者优缺点
动态类型语言优缺点:
- 优点:代码相对比较简洁,无需编写各种类型代码,方便用户阅读;
- 缺点:调试不方便,代码命名容易混;
静态类型语言优缺点:
- 优点:在调试时比较方便,代码规范。
- 缺点:代码相对繁琐,需要在定义变量的时候就判断变量的类型。
Tips2
强类型定义语言和弱类型定义语言:
(1)什么是强类型语言和弱类型语言
强类型定义语言:
强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。弱类型定义语言:
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。(2)两者区别
- 强类型语言是一旦变量的类型被确定,就不能转化的语言。
- 弱类型语言则反之,一个变量的类型是由其应用上下文确定的。
(3)优缺点
静态语言的优势:
- 由于类型的强制声明,使得IDE有很强的代码感知能力,故在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障;
- 由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最低;
动态语言的优势:
- 思维不受束缚,可以任意发挥,把更多的精力放在产品本身上。
- 集中思考业务逻辑实现,思考过程即实现过程。