类型检查 Type Checking 一些编程语言并不安全 类型化语言的优点 定型环境 (符号表) 断言的种类
Compiler http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/
http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/readings/typing.pdf
类型检查是什么?对编译有什么作用? - 知乎 https://www.zhihu.com/question/348502876/answer/848425608
类型检查主要是为了判断变量或者参数的实际类型和声明的类型是否匹配的问题。通常我们遇到这个问题的时候,是语义分析阶段的静态类型检查。这个类型检查可以让我们及早的发现类型不匹配的问题,不用等到执行的时候才发现这个问题。提前发现问题,降低问题成本。
大侠素材铺 http://staff.ustc.edu.cn/~chengli7/courses/compiler18/notes/Lecture11_type_check.pdf
记号流
语法分析器
分析树
类型检查器
注释分析树
中间代码生成
中间表示
符号表
程序运行时的执行错误
会被捕获的错误(trapped error)
例:非法指令错误、非法内存访问、除数为零 引起计算立即停止
不会被捕获的错误(untrapped error)
例:下标变量的访问越过了数组的末端;跳到一 个错误的地址,该地址开始的内存正好代表一个 指令序列 错误可能会有一段时间未引起注意 希望可执行的程序不存在不会被捕获的错误
安全语言
良行为的(well-behaved)程序 没有统一的定义 如: 没有任何不会被捕获的错误的程序
安全语言(safe language) 定义: 安全语言的任何合法程序都是良行为的
设计类型系统, 通过静态类型检查拒绝不会被捕获错误 设计正好只拒绝不会被捕获错误的类型系统是困难的
禁止错误(forbidden error) 不会被捕获错误集合+ 会被捕获错误的一个子集
类型化的语言
变量的类型
限定了变量在程序执行期间的取值范围
类型化的语言(typed language)
变量都被给定类型的语言
表达式、语句等程序构造的类型都可以静态确定
例如,类型boolean的变量x在程序每次运行时的值
只 能是布尔值,not (x)总有意义
未类型化的语言(untyped language)
不限制变量值范围的语言,如JavaScript、Perl
显式类型化语言
类型是语法的一部分
隐式类型化的语言
不存在隐式类型化的主流语言,但可能存在忽略
类型信息的程序片段,如不需要程序员声明函数的
参数类型
类型系统
语言的组成部分,其构成成分是一组定型规则
(typing rule),用来给各种程序构造指派类型
设计目的
用静态检查的方式来保证合法程序在运行时的良
行为
类型系统的形式化
类型表达式、定型断言、定型规则
类型检查算法
通常是静态地完成类型检查
类型可靠的语言
良类型的程序(well-typed program)
没有类型错误的程序,也称合法程序
类型可靠(type sound)的语言
所有良类型程序(合法程序)都是良行为的
类型可靠的语言一定是安全的语言
语法的和静态的概念 动态的概念
类型化语言 安全语言
良类型程序 良行为的程序
类型检查与推断
类型检查
Type Checking is the process of verifying fully
typed programs
类型推断
Type Inference is the process of filling in missing
type information
类型检查
未类型化语言
可以通过运行时的类型推断和检查来排除禁止错误
类型化语言
类型检查也可以放在运行时完成,但影响效率
一般都是静态检查,类型系统被用来支持静态检查
通常也需要运行时的检查,如数组访问越界检查
一些编程语言并不安全
禁止错误集合没有囊括所有不会被捕获的错误
用C语言的共用体(union)来举例
union U { int u1; int u2;} u;
int *p;
u.u1 = 10;
p = u.u2;
*p = 0;
C语言
有很多不安全但被广泛使用的特征,如:指针算
术运算、类型强制、参数个数可变
在语言设计的历史上,安全性考虑不足是因为当
时强调代码的执行效率
在现代语言设计上,安全性的位置越来越重要
C的一些问题已经在C++中得以缓和
更多一些问题在Java中已得到解决
类型化语言的优点
从工程的观点看
开发的实惠:较早发现错误、类型信息具有文档作用
编译的实惠:程序模块可以相互独立地编译
运行的实惠:可得到更有效的空间安排和访问方式
取类型信息进行检查
定型环境 (符号表)
断言的形式
|– S S的所有自由变量都声明在中
其中
是一个静态定型环境(编译器实现中的符号表),
如 x1
:T1
, …, xn
:Tn
S的形式随断言形式的不同而不同
断言有三种具体形式
断言的种类
环境断言
|– 该断言表示是良形的环境
将用推理规则来定义环境的语法(而不是用文法)
语法断言
|– nat 在环境下,nat是类型表达式
将用推理规则来定义类型表达式的语法
定型断言
|– M : T 在环境下, M具有类型T
例: |– true : boolean x : nat |– x+1 : nat
将用推理规则来确定程序构造实例的类型
类型检查与推断
类型检查(type checking)
用语法制导的方式,根据上下文有关的定型规则来
判定程序构造是否为良类型的程序构造的过程
可以边解析边检查,也可以在访问AST时进行检查
类型推断(type inference)
类型信息不完全情况下的定型判定问题
例如:f (x : t) = E 和f (x) = E的区别
类型检查
设计语法制导的类型检查器
设计依据是上节的类型系统
类型环境的信息进入符号表
对类型表达式采用抽象语法
具体:array [N] of T 抽象:array (N, T)
T pointer (T)
考虑到报错的需要,增加了类型type_error