类型系统 type system

PL Typing

wiki

wiki 类型系统

  • 类型系统主要功能: 安全性、优化、可读性、抽象化/模块化
  • 类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)。静态类型检查是在编译器所进行语义分析中进行的。如果一个语言强制实行类型规则(即通常只允许以不丢失信息为前提的自动类型转换)就称此处理为强类型,反之称为弱类型。
  • 如果一个编程语言的类型检查,可在不测试运行时期表达式的等价性的情况下进行,该语言即为静态类型的。如果一个编程语言支持运行时期(动态)调度已标记的资料,该语言即为动态类型的。
  • 强类型的基本定义即为,禁止错误类型的参数继续运算。弱类型意指一个语言可以隐式的转换类型(或直接转型)。

静态类型 vs 动态类型

Static typing when possible, dynamic typing when needed.

按类型检查来分,可以分为静态类型和动态类型。

简单区分方法:

1) 静态类型:在编译时就知道变量类型(编译期间做类型检查),在定于数据类型的时候需要声明数据类型。

2) 动态类型:运行时才知道变量类型,大部分直接采用变量=值的语法。

  • 静态代表: Java, C/C++, Golang等; 动态代表: Python, Ruby等。

PL

  • 程序都需要进行错误检查,比如除0错误,那么在什么时候检查呢?静态类型多是在编译时,动态类型多是在程序运行时。语言里有类型检查的机制,来报类型错误。
  • 从写代码的角度对比
static dynamic
Convenience 可以不用检查变量x是不是number 可以根据需要返回不同类型,静态类型就需要去构造一个新的数据类型才能实现
Catching bugs earlier 编译时就能发现类型上的错误 运行时才能发现
Performance
Code reuse 通过泛型、子类型等 重用率更高,因为没有严格的类型系统
Prototyping 效率比不上动态类型,但能更好的记录整个系统prototyping的过程 更适合原型开发,类型上更自由
Evolution & Maintaince 类型检查会列出需要更改的地方,避免一些bug 改代码时可以把代码能接受的变得更宽泛
  • 由于强类型语言一般需要在运行时运行一套类型检查系统,因此强类型语言的速度一般比弱类型要慢,动态类型也比静态类型慢,因此执行的速度应该是C > Java > JavaScript > Python。但是强类型,静态类型的语言写起来往往是最安全的。

强类型 vs 弱类型

强类型语言是指编程语言在处理数据类型的运算时的校验非常严格(类型安全),相反的弱类型语言的校验就会较为宽松(类型不安全)。

简单区分方法:

1) 强类型:不允许隐式转换。一旦变量被指定某个数据类型,如果不经强制转换,即永远是此数据类型。

2) 弱类型:允许隐式转换。数据类型可以被忽略,一个变量可以赋不同数据类型的值。