强类型和弱类型
-
强类型语言也称为强类型定义语言,是一种总是强制类型定义的语言。
JAVA
、.NET
、Python
等都是强制类型定义的。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。
例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。 -
弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
JavaScript
,PHP
、C/C++
等就属于弱类型语言· -
tips:
Python
是强类型语言,但一般脚本语言都是弱类型。
C/C++
是弱类型语言,是因为C++
中int i = 0.0;
是可以编译运行的;
动态语言和静态语言
-
动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。如
Python
和Ruby
就是一种典型的动态类型语言,其他的各种脚本语言如VBScript
也多少属于动态类型语言。 -
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的数据类型,
C/C++
是静态类型语言的典型代表,其他的静态类型语言还有C#
、JAVA
等。
编译型和解释型
-
编译型
C/C++
、Golang
就是典型的编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。
运行程序时,直接读取目标代码(object code)。由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高,这是编译型语言的优点。
但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。
例如,在C++
里,就很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。 -
解释型
解释型语言也被称作“脚本语言”,比如Python
、JavaScript
、PHP
。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降。 -
编译和解释结合
但既然编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势。
例如Java
语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。
它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。
总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。