[PLT] 柯里化的前生今世(十):类型和类型系统

1. 形式化方法

在计算机科学中,尤其在软件工程和硬件工程领域,
形式化方法(Formal method),是一种数学方法,用于软件和硬件系统的描述(specification)、开发(development)和验证(verification)。旨在能像其它工程学科一样,通过用数学进行分析,来提高设计的可靠性(reliability)和健壮性(robustness)。

为了让系统表现的和规范(specification)一致,现代软件工程采用了一系列的形式化方法。其中包括一些强有力的框架,例如,霍尔逻辑(Hoare logic),Algebraic specification language(Specification language),模态逻辑(Modal logic),指称语义(Denotational semantics)。它们虽然功能强大,但是对程序员来说门槛较高。

另一方面,还有一些轻量级的技术,可以被植入编译器,连接器或程序分析器中,进行自动校验。从而,那些不熟悉底层理论的程序员也可以使用它们。模型检测(Model checking),运行时验证(Runtime verification)和类型系统(Type system)是常见的轻量级形式化方法。其中类型系统最流行,发展最完善。

2. 历史

在计算机科学中,最早的类型系统用来区别数字的整数和浮点数。
在20世纪五六十年代,这种分类扩展到了结构化的数据和高阶函数中。
70年代,研究者们引入了几个更为丰富的概念,例如,参数化类型,抽象数据类型,模块系统,子类型等等,类型系统作为一个独立的领域形成了。

计算机科学家们也开始意识到,程序语言中的类型与直觉主义逻辑中的命题,之间的联系,称为Curry–Howard correspondence,开始了两方面的交叉研究。后经范畴论(category theory)的探索,得到了三方面的同构关系,Curry-Howard-Lambek correspondence。

3. 类型系统

类型系统使用了证明论(Proof theory)方法,通过给程序中的值指定不同的种类,来证明程序的某些行为不会发生。

使用类型系统的初衷,是想保证程序不会出现运行时错误(Execution error),然而,
一方面,对于什么是一个『错误』,还需要详细说明,
另一方面,程序是否会出现运行时错误,是不可判定的。
(可判定性:Decidability

因此,这里的『错误』应该是所有运行时错误的一个子集,
那些类型系统被证明为具有可靠性(Soundness)的程序设计语言,
类型合法的程序才能保证不会出现给定的『错误』。

(1)运行时错误

当程序被要求做一些未定义的事情时,就会产生Execution error,导致程序崩溃(crash)。Execution error会在运行时表现出来,因此也称为运行时错误(run-time error)。

运行时错误,通常包括以下两种。

有一种运行时错误不会立即表现出来,比如数组越界,或者程序跳转到错误的地址。它们不会被立即注意到,但是过了一会就会产生一个出乎意料的结果,我们将这种错误称为『未捕获的错误』(untrapped errors)。

而另外一种运行时错误,比如除零,或者访问非法的内存地址。程序会马上出错并停止执行,这种错误称为『被捕获的错误』(trapped errors)。

(2)安全性

如果一块代码不会产生『未捕获的错误』,就称它为安全的(safe)。
如果语言中的所有程序都是安全的,就称该语言是安全的。
因此,语言如果具有安全性,就不会发生潜在的运行时错误。

无类型语言和类型化的语言都可以保障安全性。
无类型语言可以使用运行时检测来实现,而类型化的语言通过类型来拒绝那些可能会出现不安全性质的程序,类型化的语言也可能会混用运行时检测和类型校验。

(3)类型化

程序中的变量在程序执行期间,可能会有不同的取值范围,
我们把变量可取值的最大范围称为这个变量的类型(type)。
例如,具有类型Boolean的变量x,在程序执行期间,只能取布尔值。
指定类型之后的程序设计语言,称为类型化的语言(typed language)。

如果一个语言,不限制变量的取值,就称为无类型语言(untyped language),我们既可以说它不具有类型,也可以说它具有一个通用类型,这个类型的取值范围是程序中所有可能的值。

(4)类型标记

类型系统是类型化语言的一个组成部分,它用来计算和跟踪程序中所有表达式的类型,从而判断某段程序是否表现良好(well behaved)。

类型化语言是得益于类型系统,而与代码中是否具有类型标记无关。
如果程序语言的语法中含有类型标记,就称该语言是显式类型化的(explicitly typed),否则就称为隐式类型化的(implicitly typed)。

主流类型化的语言,都是显式类型化的。
但是,ML和Haskell可以省略类型声明,它们的类型系统会自动推断出程序的类型。

(5)什么是『错误』

判断一块代码是否具有运行时错误,这个问题是不可判定的,
即,在不运行这块代码的情况下,不存在一个通用算法回答是或否。

因此,实际操作上,我们需要缩小待排除的运行时错误的范围。
我们指定一个运行时错误的子集,它包含所有的『未捕获的错误』,还包含一部分『被捕获的错误』,我们称这些错误为『被禁止的错误』(forbidden error)。

如图所示:


如果程序不会产生『被禁止的错误』,就说该程序『行为良好』(well behaved),因此『行为良好』的程序一定是安全的。

程序的安全性比『行为良好』更重要,类型系统的主要目标就是保证程序的安全性——在运行时不会出现『未捕获的错误』。
然而,实际操作中,大部分类型系统被设计成保证程序的『行为良好』,从而也能保证程序的安全性。

(6)静态检测和动态检测

为了避免歧义,下文不再使用静态类型和强类型这样的术语,来表示语言的全局特征,而是使用了静态检测(statically check)和强类型检测(strongly check),来表示某个阶段或者这个阶段的性质。

如果某个类型化的语言可以不通过运行,只通过编译时的静态检测(statically check),来保证程序的『行为良好』,这样的语言称为『被静态检测』的语言。

如果某个无类型语言,可以在运行时排除『被禁止的错误』,就称为『被动态检测』的语言。(这里指的是动态检测,而不一定是动态类型检测

语言被动态检测,也并不意味着运行时可以不加检测的执行。
被静态检测的语言,通常也需要一些运行时检测,来保证安全性。
例如,数组越界,通常使用动态检测来确定。

(7)类型系统的强弱

一个类型化的语言,如果所有合法的程序都是『行为良好』的,就称该语言是被『强类型检测』的(strongly checked)。

因此,强类型检测的语言具有以下特征:
a) 不会发生『未捕获的错误』——安全性。
b) 那些指定为『被禁止的错误』的『被捕获的错误』不会发生。
c) 一些『被捕获的错误』可能发生,需要程序员来避免。

相反,如果某些『未捕获的错误』不能被静态检测,就有可能出现不安全的代码,我们就称该语言是被『弱类型检测』的(weakly checked)。

3. 下文

有了这些铺垫以后,我们就可以用Haskell来学习类型系统了,
这是一个不错的体验。

4. 参考

Types and Programming Languages
Type systems: Luca Cardelli

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容