编程语言概览(90%)

https://github.com/songtianyi/songtianyi.github.io/blob/master/mds/programming-languages-review.md

类型系统

什么是类型?在软件执行的过程中,变量可以为很多值,定义变量的边界的描述即类型。变量可以被赋予类型(即变量有边界)的语言称为类型语言(typed language),无类型语言(untyped language)没有类型,或者说只有一个全局类型,能够存储所有的值。 类型语言我们见得多了,无类型的呢?lambda演算(pure λ-calculus)是无类型的,汇编和LISP也是无类型的.

变量类型的指定可以是显式的

// golang
var foo int

也可以是隐式的

-- haskell
fac :: Int -> Int -- 这一行可以省略
fac 0 = 1
fac n = n * fac (n - 1)

fac 0 = 1
fac n = n * fac (n - 1)

类型系统会自动赋予变量类型,这种行为称为类型推断(type inference)。

类型检查

类型系统是类型语言的首要组成部分。类型系统的一个职责是跟踪变量的类型,判断代码是否满足类型约束,这种行为称为类型检查typechecking, 类型检查是保证程序稳定运行的手段,同时又分为运行时检查(runtime checks)和静态检查(static checks), 运行时检查也叫动态检查(dynamic checking).

类型系统做了静态检查,还有必要做动态检查嘛?有,比如数组的边界检查,就必须在runtime做。运行时的类型检查会导致程序运行终止(fail-stop),为什么还要检查呢?让它运行到无法继续执行为止不就好了?类型检查虽然会出错,但是阻止了更恶劣的错误(untrapped errors)的发生,比如保证gc等机制能够正常运转,让程序能够更平滑地退出. 动态检查的缺点是会导致fail-stop,也会消耗资源,影响性能,所以通常我们认为拥有静态检查的类型系统的语言会更稳定高效。但是静态检查就足够安全了吗?不一定,因为某些语言在静态检查时没有检查一些危险操作,比如C指针的运算和转换,这类语言称为weekly checked, 反之, 程序在编译期间能够尽可能发现所有的错误, 称为strongly checked.

那么延伸一下,怎么区分一门语言是weekly checked, 还是strongly checked? 以下几点可以作为判断的依据。

Implicit type conversions

可以进行隐式类型转换的语言属于weekly checked, 如c++

int a = 3;
double b = 4.5;
a + b; // a将会被自动转换为double类型,转换的结果和b进行加法操作

Pointers

允许指针运算的语言属于weekly checked, 比如c

..... 内容太长,见链接,完成度90%。

0 个评论

要回复文章请先登录注册