类型的动态绑定和静态绑定

JavaScript 是动态绑定的语言,而 TypeScript 包装其成为静态绑定的语言。而什么是动态绑定,什么是静态绑定,它们的优劣又是什么呢?TypeScript 又为什么要“多此一举”?

绑定

绑定是一种关联(associate),也可以是一种分配(assign)。类型绑定是将声明的变量关联到特定类型的过程。

动态绑定就是,在程序运行的时候,将变量绑定到类型。
静态绑定,在编译时,编译器将变量绑定到类型。

编译与解释

像 JavaScript、PHP、Python、Ruby 这类解释型语言他们没有编译器。在运行之前发现变量类型是不可能的。可以参考下图解释器的工作方式。
compiler&interpreter.png

而 C、C++、Go、Rust 这类编译型语言,是在编译的时候就将变量绑定到类型。静态绑定又有两种方式:下面两句 go 语言代码,都是创建了一个初始值为 10 的int类型的变量。前者是显式声明,程序直接写出了变量的类型为int;后者是隐式声明,根据值 10 推导变量的类型为int

1
2
3
var x int = 10
// 或
x := 10

Java 与 TypeScript

Java 首先编译为.class字节码文件,而后字节码文件通过虚拟机解释执行。Java 是有编译器的,所以能够实现动态绑定,事实也是如此。

而 TypeScript 呢,看上去它的设计还真像 Java 呢,先通过 TSC 将 ts 代码编译为 js 代码,js 代码再通过 node、浏览器等运行环境解释执行。与前面的 go 语言代码类似。

1
2
let today:string = "Sun"
let tomorrow = "Mon"

参考文献