Python基础 | 0.4.Python是解释型的强类型动态语言
Python是解释型的强类型动态语言
虽然平时很少去区分语言的类型,但是作为程序员还是知道的好。
一、解释型语言与编译型语言
- 1.编译型语言
- 程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件(即计算机识别的二进制文件),运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。
- 例如 C/C++、Pascal/Object Pascal(Delphi)
- 2.解释型语言
- 程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨 平台性好。)
- 例如 JavaScript、VBScript、Perl、Python、Ruby
- Java 也是解释型语言。Java 虽然也经过了 编译 的步骤,但是是将代码编译成 .class 字节码文件(而不是像 C语言 直接编译成 二进制文件 直接运行),然后再通过 JVM(Java虚拟机)对 .class 文件读一行解释一行,因此 Java 也是解释型语言。
- 3.编译型语言与解释型语言优缺点比较
- a.运行速度
- 编译型语言的运行速度较快,同等条件下对系统要求最低(因为直接执行的是二进制文件)。因此常见与操作系统、游戏等等。
- 解释型语言的运行速度较慢(因为需要边解释边执行)。由于计算机技术的发展,尤其是计算机硬件的发展,对于一些场景如 Web ,速度并不影响使用体验。
- b.跨平台性
- 编译型语言的跨平台性较差(不同的操作系统识别的二进制文件是不同的,因此移植后,需要对程序重新编译,故跨平台性较差)。
- 解释型语言的跨平台性较强(对 Python 来说,在 Windows 平台和 Linux 平台安装各自的解释器<也可称为虚拟机,或者说 Python解释器包含虚拟机>,因此,程序移植之后,可以直接使用平台对应的解释器直接运行,故跨平台性较强)。
- c.程序更改之后的操作
- 对于编译型语言来说,程序更改之后的操作较为麻烦,因为当局部更改一小段代码之后,整个程序都需要重新编译,然后整体执行。
- 对于解释性语言来说,程序更改之后的操作较为简单,因为即使更改了局部的代码,仍可以直接执行,因为解释型语言读取一行解释执行一行代码。
- a.运行速度
- 4.因此说 Python 是解释型语言。
二、动态类型语言和静态类型语言
- 1.静态类型语言
- 如果一个编程语言的类型检查,可在不测试运行时期表达式的等价性的情况下进行(好像可以认为是在编译时期检查数据类型),该语言即是静态类型的。
- 2.动态类型语言
- 如果一个编程语言支持运行时期(动态)调度已标记的数据(好像可以认为是在运行时期检查数据类型),该语言既是动态类型的。
- 3.实践中的静态和动态类型检查
- 动态类型语言经常出现在脚本语言和RAD语言中。动态类型语言在解释型语言中极为普遍,编译型语言则偏好无须运行时期标记的静态类型。
- a.静态类型语言
- 静态类型语言在编译时期时,就能可靠地发现类型错误,因此通常能增进最终程序的可靠性。
- 静态类型语言通常能编译出速度较快的代码。当编译器清楚知道所要使用的数据类型,就可以产生最优化过后的代码。更进一步,静态类型语言中的编译器,可以更轻易地发现较佳快捷方式。
- 静态类型语言缺少类型推断。
- b.动态类型语言
- 动态类型语言也允许编译器和解释器更快速的运作。因为源代码在动态类型语言中,变更为减少检查,并减少解析代码。这也可减少 编辑-编译-测试-调试 的周期。
- c.为什么说不能通过是否定义变量类型【例如:(C语言使用时需要指定数据类型如: int a;),而(Python使用时不需要指定数据类型直接使用 a = 2)】来判定是静态还是动态数据类型???
- 上面提到,静态类型语言缺少类型判断,因此需要编写者宣告所要使用的方法或是函数的类型。编译器不允许编写者忽略,这可为程序起附加性帮助文档的作用。但是静态类型语言也可以无须类型宣告,例如静态语言Ocaml。
- 根据上面所说,如果类型是语言语法的一部分,则是显式(静态)类型;如果类型通过编译时推导,则是隐式(静态)类型。
- 4.我的理解(如有错误,希望评论区指出)
# 伪代码 var x := 5; (1) var y := "hi"; (2) var z := x + y; (3)
- 假设语言a是“强类型”静态语言,语言b是“强类型”动态语言。(强类型弱类型见下面介绍)
- 步骤(1)中将 数值 5 约束给x;
- 步骤(2)将 字符串“hi”约束给y;
- 步骤(3)将 x 和 y 的值 相加 后给到z;
- 对于静态类型语言来说,在编译时期(或者说运行和编译中间的时期),检查到步骤(3)两个类型的 +运算 尚未定义,返回一个错误。
- 对于动态类型语言来说,在编译时期,代码能够通过检查,但是在运行时期,检查到步骤(3)两个类型的 +运算 尚未定义,返回错误。
三、强类型和弱类型语言
- 1.强类型语言
- 强类型的基本定义为:禁止错误类型的参数继续运算。
- 示例代码:Python 是强类型语言
[root@xxxxxx ~]# python3 Python 3.6.5 (default, Dec 13 2019, 17:58:31) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = 2 >>> type(a) <class 'int'> >>> b = "3" >>> type(b) <class 'str'> >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' >>>
- 上述代码中,变量 a 是 int 类型,变量 b 是 字符串 类型。两者相加时,返回“不支持的数据操作类型:int + str”
- 2.弱类型语言
- 弱类型意指:一个语言可以隐式的转换类型(或直接转型)。
- 示例代码:Javascript
> let a = 2 undefined > typeof(a) 'number' > let b = '3' undefined > typeof(b) 'string' > a + b '23' > a + b - 1 22 > b = 3 3 > a + b 5
- 上述代码中,存在隐式类型转换
- 第一次隐式类型转换:(a = 2) + (b = '3') = '23' 。数字 2 加上 字符串 '3' 得到结果是 字符串 '23'。
- 第二次隐式类型转换:(a = 2) + (b = '3') - 1 = 22。数字 2 加上 字符串 '3' 得到结果是字符串 '23' 之后,再 减去数字 1 ,得到 数字 22。