网站大量收购独家精品文档,联系QQ:2885784924

类型检查-Read.DOC

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
类型检查-Read

第五章 类 型 检 查 编译器必须检查源程序是否满足源语言在语法和语义两个方面的约定。这种检查叫做静态检查(以区别在目标程序运行时的动态检查),它诊断和报告程序错误。静态检查的例子有: (1)类型检查 如果算符作用于不相容的运算对象,编译器报告错误。例如数组变量和函数变量相加。 (2)控制流检查 对于任何引起控制流离开一个结构的语句,程序中必须有该控制转移可以转到的地方。例如,C的break语句引起控制离开最小包围的while, for或switch语句,如果这样的包围语句不存在,则是一个错误。 (3)唯一性检查 有些场合,对象必须正好被定义一次。例如,在Pascal语言中,标识符必须唯一地声明,case语句的分情形常量必须有区别,枚举类型的元素不能重复。 (4)关联名字检查 有时,同样的名字必须出现两次或更多次。例如,在Ada语言中,循环或程序块可以有名字出现在它的开头和结尾。编译器必须检查两个地方是否使用同样的名字。 本章集中于类型检查。上面的列举表明,大多数其它静态检查是一些简单的工作,可以用上章所讲的技术实现。其中有些工作可以并入编译器的其它部分,例如,在把名字的信息填入符号表时,可以检查该名字声明的唯一性。许多Pascal编译器把静态检查和中间代码生成组织在分析的同时完成。对于更复杂的结构,如Ada中的一些结构,在分析和中间代码生成之间加一遍类型检查可能要方便一些。 5.1 类型在程序设计语言中的作用 5.1.1 引言 一个程序变量在程序执行期间的值可以设想为有一个范围,这个范围的一个界叫做该变量的类型。例如,类型Boolean的变量x在程序每次运行时的值只能是布尔值。如果x有类型Boolean,那么布尔表达式not (x)在程序每次运行时都有意义。变量都被给定(非平凡)类型的语言叫做类型化语言(typed language)。 语言若不限制变量值的范围,则被称作未类型化的语言(untyped language),它们没有类型,或者说仅有一个包含所有值的泛类型。在这些语言中,一个运算可以作用到任意的运算对象,其结果可能是一个有意义的值、一个错误、一个异常或一个未做说明的结果。 类型化语言的类型系统(type system)是该语言的一个组成部分,它始终监视着程序中变量的类型,通常还包括所有表达式的类型。一个类型系统主要由一组定型规则(typing rule)构成,这组规则用来给各种语言构造(程序、语句、表达式等)指派类型。 为语言设计类型系统的目的是什么?简单讲,类型系统的根本目的是防止程序运行时出现执行错误(execution error)。整个类型系统用来判断程序是否为良行为的(well behaved)。只有那些顺从类型系统的程序才被认为是类型化语言的真正程序,其它的程序在它们运行前都应该被抛弃。 类型系统的这个非形式化的陈述激发了对类型系统的研究,但是需要进一步准确描述。首先,一个难以捉摸的问题是,什么情况叫做执行错误?我们将在后面讨论它。当用一种程序设计语言所能表示的所有程序运行时都没有执行错误出现,我们说该语言是类型可靠的(type sound)。显然,我们希望通过适当的分析来对程序设计语言的类型可靠性做出准确的回答。这种分析将基于语言的类型系统,这样,类型系统的研究也需要形式化的方法。 类型系统的形式化需要研究精确的表示法和定义,需要一些形式性质的详细证明。形式化的类型系统提供了概念上的工具,用它们可以评判语言定义的一些重要方面的适当性。非形式语言的描述通常不能把语言的类型结构详细规范到不会出现歧义实现的程度,因此经常会出现,同一个语言的不同编译器实现了略有区别的类型系统,5.5节会给出一个例子。而且,许多语言定义被发现不是类型可靠的,甚至经过类型检查(type check)后接受的程序也会崩溃。理想的状况是,形式化的类型系统应该是类型化程序设计语言的定义的一部分。这样,依靠精确的规范,证明语言是类型可靠的才有可能。 一种语言由一个实质存在的类型系统来类型化,而不在乎类型是否实际出现在程序的语法中。一种语言,如果类型是语法的一部分,那么该语言是显式类型化的;否则是隐式类型化的。主流语言中不存在纯隐式类型化的语言,但是ML和Haskell这样的语言支持编写忽略类型信息的程序片段,这些语言的类型系统会自动地给这些程序片段指派类型。 我们在本节非形式地给出定型、执行错误和其它有关概念的术语,讨论所期望的类型系统的性质和好处,并且概述怎样将类型系统形式化。本节所用的术语并非绝对标准,因为不同来源的这些术语原来就不一致。一般来说,当引用运行时的概念时,我们避免用类型和定型,例如我们用动态检查代替动态定型。 5.1.2 执行错误和安全语言 程序执行错误最明显的征兆是出现

文档评论(0)

zhuwo + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档