编译原理(三)类型检查
- 静态检查中最典型的部分——类型检查:
类型系统、类型检查、多态函数、重载
- 忽略其它的静态检查:控制流检查、唯一性检查、关联名字检查
上面不能在不该出现continue的地方出现continue。
C语言:
- 称&为地址运算符,&a为变量a的地址
- 数组名代表数组第一个元素的地址
问题:
如果a是一个数组名,那么表达式a和&a的值都是数组a第一个元素的地址,它们的使用是否有区别?
用四个C文件的编译报错或运行结果来提示
上面报错,返回的a不能作为二位数组的指针
返回a的指针时,是正确的
二维数组的第一个元素,可以看作是一个一维数组,所以返回a时,表示二位数组的第一个元素,与B类型相同,没有报错
a+1加了80,因为A的第二元有20个int类型的数组,&a+1加了800,因为A占用了800字节内存。
类型在编程语言中的作用
执行错误和安全语言
1、程序运行时的执行错误分成两类
- 会被捕获的错误(trapped error)
例:非法指令错误、非法内存访问、除数为0
引起计算立即停止
- 不会被捕获的错误(untrapped error)
例如:跳到一个错误的地址,该地址开始的内存正好代表一个指令序列
错误可能会有一段时间未引起注意
安全语言
- 任何合法程序都是良行为的
- 通常是设计一个类型系统,通过静态的类型检查来拒绝不会被捕获的错误
- 但是,设计一个类型系统,正好拒绝不会被捕获错误是非常困难的
禁止错误
- 不会被捕获错误集合+会被捕获错误的一个子集
- 为语言设计类型系统的目标是在排除禁止错误
良行为程序和安全语言也可基于禁止错误来编译
类型化的语言
- 变量都被给定类型的语言
- 表达式、语句等程序构造的类型都可以静态确定
- 例如,类型boolean的变量x在程序每次运行时的值只能时布尔值,not(x)总有意义
类型系统
- 语言的组成部分,它由一组定型规则(typeing rule)构成,这组规则用来给各种程序构造指派类型
- 设计类型系统的根本目的是用静态检查的方式来保证合法程序运行时的良行为
- 类型系统的形式化
- ----类型表达式(描述类型的表达式)、定型断言(根据语言跟早实例判断类型)、定型规则
- 类型检查算法
- ----通常是静态地完成类型检查
良类型的程序
- 没有类型错误的程序
类型可靠的语言
- 所有良类型程序(合法程序)都是良行为的
- 类型可靠的语言一定是安全的语言
类型检查:类型化语言
- 类型检查也可以放在运行时完成,但影响效率
- 一般都是静态检查,类型系统被用来支持静态检查
- 静态检查语言通常也需要一些运行时的检查
- ----数组访问越界检查
实际使用的一些语言并不安全
C语言
- 还有很多不安全的并且被广泛使用的特性,如:指针算数运算、类型强制、参数个数可变
- 在语言的设计历史上,安全性考虑不足时因为当时强调代码的执行效率。
在现代语言设计上,安全性越来越重要
- C语言的一些问题已经在C++中得到缓和
- 更多一些问题在Java中已得到解决
类型化语言的优点
从工程的观点看,类型化语言有下面一些优点
- 开发的实惠
- ----较早发现错误
- ----类型信息还具有文档左右
- 编译的实惠
- ----程序模块可以相互独立地编译
- 运行的实惠
- ----可得到更有效的空间安排和访问方式