如何选择编程语言(3)强类型 VS 弱类型

如何选择编程语言(3)强类型 VS 弱类型
0

本系列的其他文章:
如何选择编程语言(1)执行方式
如何选择编程语言(2)内存管理
如何选择编程语言(4)并行/并发模型
如何选择编程语言(5)面向对象
如何选择编程语言(6)函数式编程
如何选择编程语言(7)对 null 的处理
如何选择编程语言(8)官方 API
如何选择编程语言(9)第三方库生态

3.1. 强类型

通常在需要编译的语言(如 C / C++ / Java / C# / Kotlin 等语言)中,一个变量 / 对象的属性必须在声明之后才能使用(一个变量必须被声明后才能被读,必须被声明后或者在声明时才能写;一个对象的属性没被定义的话不能被写入),而且一个变量 / 对象的属性 / 函数的入参与返回值的数据类型在声明时就确定下来、不能再改变了。如果违反了这两个约束,那么在编译源代码的时候就会报错。

3.2. 弱类型

通常在脚本语言(如 Python、JavaScript、PHP)中,一个对象的属性是可以动态变化的,甚至变量不需要声明就可以使用(读或者写);一个变量 / 对象的属性 / 函数的入参与返回值的数据类型是不固定的。

3.3. 强弱结合

在 TypeScript 和在版本 7 以后的 PHP 等语言之中,既可以使用动态类型,也可以规定某些变量 / 对象的属性 / 函数的返回值的数据类型。如果违反了规定的数据类型,会引起编译转换器 / 解释器报错。

3.4. 不适用

在汇编语言中通常没有变量(不考虑预处理器),因此不存在静态类型或者动态类型的问题。

3.5. 弱类型的优劣

3.5.1. 优点

初学者不需理解数据类型就可入门,进行简单的编程。

程序员不受数据类型的限制,可以采取更灵活的实现方式,例如在某个类的对象中增加一个属性来存储一些额外的数据,而不需要改变类的定义。

程序变更前后的兼容性比较好。例如一个类增减了成员属性,旧类的实例对象序列化后,反序列化为新类的实例对象时,强类型语言可能会因字段不一致而出错,而弱类型语言则通常不会出错。又例如 JavaScript 中某个函数增加一个默认为空的入参,调用方不需修改即可兼容。

3.5.2. 缺点

弱类型语言不能在编译期确定变量的数据类型,从而不能在编译期对一些变量的内存使用进行优化(例如内存页对齐、缓存对齐等)。

弱类型语言在运行时可能出现由于类型混乱导致的错误。例如错把数字变量比较的规则应用于字符串变量的比较,从而得到 “10” < “2”。

弱类型语言中,如果一些变量、对象属性、函数的入参或返回值使用的数据类型过多,会降低代码的可读性和可维护性,甚至导致程序代码混乱而出错。