已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 从a d a 8 3 到a d a 9 5 的源语言转换对于a d a 8 3 应用系统的维护和升级具有重 要意义。本文在分析研究a d a 兼容性指南的基础上,提出了一个a d a 8 3 到a d a 9 5 兼容性转换的解决方案,采用基于源语言级转换的兼容性检查和程序自动转换的 方法。设计和实现了a d a 8 3 9 5 转换系统的前端兼容性检查,在分析a d a 8 3 语言 特性的基础上,重点解决了针对a d a 8 3 强类型特性和可见性规则特性的符号表构 造组织方法;还给出了兼容性检查的方法,提供了和后端程序自动转换部分的接 口中间表示。 关键字:a d a 8 3a d a 9 5 源语言转换兼容性符号表 中间表示 a b s t r a c t a b s t r a c t f o rm a i n t e n a n c ea n du p g r a d eo fa d a 8 3a p p l i c m i o ns y s t e m ,i ti s i m p o r t a n tt o t r a n s l a t ea d a 8 3s o u r c et oc o m p a t i b l ea d a 9 5s o u r c e b a s e do nt h ea n a l y s i sa n ds t u d yo f t h e a d ac o m p a t i b i l i t yg u i d ev e r s i o n6 0 ”( a c g ) as o l u t i o no fat r a n s l a t o rf r o m a d a 8 3t oa d a 9 5i sp r o v i d e d s o u r c ec o d et r a n s l a t i n g o r i e n t e dc o m p a t i b i l i t yc h e c k i n g m a dp r o g r a ma u t o m a t i ct r a n s l a t i o ni su s e d t h ef r o n t e n do ft h et r a n s l a t o ri sd e s i g n e d a n di m p l e m e n t e d b a s e do nt h ea n a l y s i so fl a n g u a g ec h a r a c t e r i s t i c so fa d a 8 3 ,i ti s c o n c e r n e dw i t hb o wt h es y m b o lt a b l ei sc o n s t r u c t e da n do r g a n i z e d ,w h i c hc a nd e a lw i t h t h ec h a r a c t e r i s t i c so fs t r o n gt y p i n ga n dv i s i b i l i t yr u l e so fa d a 8 3 t h e ni ti sp r e s e n t e d h o wt os o l v ec o m p a t i b i l i t yc h e c k i n ga n di n t e r m e d i a t er e p r e s e n t a t i o nc r e a t i n g k e y w o r d s :a d a 8 3 a d a 9 5s o u r c ec o d et r a n s l a t i o n c o m p a t i b i l i t y s y m b o l t a b l ei n t e r m e d i a t er e p r e s e n t a t i o n 第一章绪论 第一章绪论 1 1a d a 语言的发展与应用 a d a 语言是美国国防部( d o d ) 为克服软件危机而发起研制的一个大型通用 程序设计语言,最初用于嵌入式计算机系统。从产生起,a d a 共制定了两个标准, 一个是1 9 8 3 年制定的a d a 8 3 标准,目前遵循的是1 9 9 5 年更新修订的a d a 9 5 标准。 a d a 的产生与标准化有着其它程序设计语言所不可比拟的独特背景:它是世界上 唯一的由政府组织、按规定的需求和严格的工程要求研制的语言:它也是唯一经 过全世界计算机科学家共同参与讨论而制定的、并且得到工业界支持的程序设计 语言i 。 a d a 语言在1 9 7 6 年开始设计时,就充分吸收了当时通用程序设计语言以及类 型理论的研究成果,充分考虑了软件工程中的一些重要原则,如模块化结构、数 据抽象、信息隐藏、可重用性、可靠性、可维护性等方面的要求口】,以抽象数据 类型( a b s t r a c td a t at y p e ,a d t ) 为理论基础,提供了诸如并发与并行处理、实 时处理、异常处理、低级处理与控制以及支持大型程序设计等方面的设施,使得 a d a 语言在高可靠性、安全性、实时性等诸多方面,成为其他任何语言都无法与 之相比的软件开发与维护环境。 1 9 9 5 年2 月,i s o a n s i i e c 三家公布了新的a d a 语言国际标准,简称a d a 9 5 。 a d a 9 5 在a d a 8 3 的基础上,提供了更大的灵活性与可扩充性,增加了标签( t a g g e d ) 类型、类型扩展、类域类型、动态分派、抽象类型等机制,使原先a d a 8 3 这种基 于对象的程序设计语言,成为真正的面向对象的程序设计语言。a d a 9 5 不仅全丽 支持面向对象程序设计方法,同时强化对实时性的支持,并以附件的形式对a d a 语言进行了扩充,如a d a 9 5 附件中定义了与c 、c o b o l 、f o r t r a n 的标准接1 2 , 以及一些支持系统编程、实时系统、分布式系统、信息系统、数学计算、安全保 密等方面的附件,以适应不同应用领域的特殊需求【3 l 。另外,a d a 9 5 还将支持并 发程序设计作为语言固有的特性之一。 原先,a d a 主要是为实时嵌入式系统应用设计的,但其应用范围早已拓宽到 其它许多领域,如大型信息系统、分布式系统、科学计算、系统程序设计等,而 且其用户早已不再限于d o d 范围,包括西方各大军事与国防机构、整个航空航 天界,还被广泛地用于民用领域中,如银行系统、医学分析系统、无线通讯、人 造卫星系统、空中交通控制、铁路信号系统等,几乎一切对安全性及精确性要求 2 a d a 8 3 9 5 转换系统前端的研究与实现 高的控制系统和管理系统都有它的重大贡献1 4 1 。这些领域里的成功使a d a 越来越 受到人们的关注,a d a 也逐渐向更广泛的商业领域渗透,展现出广阔的前景。 1 2a d a 8 3 与a d a 9 5 的兼容性 a d a 9 5 的目标是改进a d a 8 3 中存在的问题,简化a d a 8 3 不合理的限制,并对 许多不同应用领域增加所需要的性能。a d a 9 5 在制定过程中,十分注意对a d a 8 3 的继承性,尽量减少对已存在a d a 共同体的负面影响,保持原来的可靠性和可维 护性。语言修订中,设计者们遵循“最大的正面效益”、“最小的负面影响”的原 则,使原有的a d a 8 3 程序可以相当容易地移植到a d a 9 5 平台上。这就要求a d a 9 5 不仅要对现有的a d a 8 3 存在向上兼容,而且也要使依赖于实现的行为得到继承, 因而a d a 9 5 对a d a 8 3 存在的问题只能是在原有性能的基础上进行改进、扩展,不 是将原有性能置之不管而又建立很多新的特性。 虽然从a d a 8 3 到a d a 9 5 保持了尽可能的一致性,但是,由于对原有的改进和 新功能的增加,使得现有的a d a 8 3 程序,在a d a 9 5 的编译平台上并不能完全j 下确 的被编译和运行,即所谓的兼容性问题。当然,要保证l o o 的向上兼容性是不 可能的,许多其它语言的修订经验也证明了这一点,例如,从c o b o l 7 4 到 c o b o l 8 3 、从c 到a n s ic 及到c + + 的修订与扩充都存在一些不兼容性。 国外对a d a 8 3 和a d a 9 5 的兼容性问题进行了许多研究【5 - 8 1 ,这不但需要研究 者们深入了解a d a 8 3 和a d a 9 5 的基本机制和内部实现特性,而且需要有长期的、 丰富的a d a 实际编程经验,以对二者进行彻底的比较。许多学者都提出了兼容性 研究结果,其中最具有代表性的是1 9 9 5 年美国学者b i l lt a y l o r 提出的a d a 兼容 性指南“a d ac o m p a t i b i l i t yg u i d ev e m i o n6 0 ”1 5 1 ( 简称a c g ) ,指南将a d a 8 3 和 a d a 9 5 的所有不兼容性问题归纳为4 3 条,并给出了每条不兼容性的基本原理和语 言改变特性。 1 3a d a 8 3 到a d a 9 5 的转换 a d a 8 3 主要是为大型嵌入式系统设计的,支持大型可重用性软件设计是a d a 语言的设计目标和主要特色之一。事实上,早期软件重用的许多思想,都是基于 a d a 8 3 提出的1 9 - ”】。虽然a d a 8 3 是基于对象的程序设计语言,但是a d a 8 3 的程序 包、类属和分别编译等机制使得a d a 8 3 程序模块具有很好的可重用性和可维护性。 如果已存在的软件是可重用的,且经过多方测试,那就不必对这种软件做进一步 的开发和测试,这样可降低开发和维护费用。a d a 8 3 的可靠性在过去十多年的使 第一章绪论 3 用中业已得到证明,而且a d a 8 3 本身的一些语言机制支持可重用性,这样原有的 a d a 8 3 软件在功能和性能上都具有重用性。但是,a d a 9 5 新特性的出现,新的软 件定会选择a d a 9 5 作为开发平台,这就需要将可重用的a d a 8 3 软件移植到a d a 9 5 平台上,这样不但可以提高软件的使用效率,还保证了软件的可靠性。m o o d y 在 t r i a d a 9 6 上介绍了用于指挥控制系统的可复用轻型执行程序,而且波音公司 已用它成功地升级了一批老软件系统i j ”。实际上,不只波音公司需要进行a d a 8 3 到a d a 9 5 的转换,像d o d 的许多武器系统同样需要,而且许多企业公司也在尝 试做商用软件产品完成a d a 8 3 到a d a 9 5 转换i l “”l 。 事实上,我们国家的一些军用系统同样是在a d a 8 3 平台上丌发的,a d a 9 5 标 准的出台,对我们来说,同样也需要研制一个从a d a 8 3 到a d a 9 5 的自动转换系统, 提供一个a d a 8 3 到a d a 9 5 软件重用工具,以帮助实现a d a 8 3 平台向a d a 9 5 平台 的升级。在分析研究a c g 的基础上,我们设计和实现了一个a d a 8 3 9 5 转换系统, 完成从a d a 8 3 到a d a 9 5 的转换,并用a d a 语言的测试集“a d a c o m p i l e r v a l i d a t i o n c a p a b i l i t y 1 1 l ”( 简称a c v c ) 中的部分实例,对转换系统进行了测试。该系统 为a d a 9 5 软件开发人员重用或二次开发a d a 8 3 软件提供了方便、快捷的辅助工具, 从而减少重复开发费用,提高a d a 软件开发效率。 第二章a d a 8 3 9 5 转换系统 第二章a d a 8 3 9 5 转换系统 a d a 8 3 9 5 转换系统的任务是分析语法和语义正确的a d a 8 3 源程序,对所有 不兼容的部分,给出不兼容提示或警告信息,对于存在的不兼容有两种处理方法: 将具有确定映射关系的不兼容进行自动转换,且保证转换后的程序在a d a 9 5 环境 下能够正确编译运行,并且得到与a d a 8 3 程序相同的结果;不能自动转换的不兼 容,用户可以根据提示或警告信息,确定是否进行手工调整。在这一章里,将给 出转换系统的基本思想及在此思想上得出的功能模型,并引出本论文的具体研究 内容。 2 1 转换系统的基本思想 为了对设计基础有一个清晰的认识,下面简要讨论转换系统应遵循的一些基 本原则。 2 1 1 可行性分析 2 1 1 1 采用源语言级翻译 软件重用通常是改善软件质量、提高软件工程效率的关键。软件重用可以在 不同的抽象级别实现,如重用需求规范、设计、体系结构和代码。 同种语言环境之间的软件重用一般采用代码级重用,而且大体上有两种实现 途径:翻译和绑定。一般情况下,这两种途径的实现对于用户来讲是没有区别的, 只是对实现者截然不同。如果对a d a 8 3 现有软件采取绑定的重用方法,只需要基 于对二进制形式的实体进行调用,不需要实现实体的源代码,这样对于实现者来 说简便一些。但是a d a 8 3 9 5 转换系统的需求不是单纯的功能性重用,而是要在 重用的基础上,有可能需要对原有软件进行进一步的改进和扩充,所以绑定实现 的二进制代码不能满足要求。然而翻译方法则不区分声明和实现细节,翻译的结 果使二者都有对应的源代码,这样便于软件的二次开发和改进。而且a c g 中已 经很好的总结了二者之间的不兼容性,为翻译方案提供了必要的准备和依据,因 此进行源代码级翻译是较为合适的实现方法,源代码级翻译也称为源语言级翻 译、源语言转换。 6a d a 8 3 9 5 转换系统前端的研究与实现 2 1 i 2 检查和转换依次完成 a d a 8 3 9 5 转换系统完成a d a 8 3 到a d a 9 5 的源语言级翻译时,首先需要检查 不兼容,然后才能进行不兼容修改。对于一条不兼容来说,检查和修改的关系一 定是检查在前,修改在后,但是对于个源文件或者一个工程的多个源文件来说, 存在多条不兼容,检查和修改的顺序关系就有两种可能,一种是在源文件中检查 出一条不兼容就立即将其修改,然后继续进行检查,另一种是所有源文件都检查 完毕再依次修改所有的不兼容。由于大部分不兼容的出现是前后相关的,修改也 是前后相关的,这种不兼容的上下文相关性决定了边检查边修改的转换方式是不 可行的,因此a d a 8 3 9 5 转换系统应采用检查和修改分离的方式。 检查和修改分离的方式不但能解决不兼容的上下文相关性问题,同时给系统 实现也可以带来了许多好处,如使得系统模块清晰、耦合度低、功能单一,而且 分工明确、便于测试。这样,转换工具可以在逻辑上分成两部分:检查模块和自 动修改模块。其中,检查模块是整个转换工具的核心,是实现自动修改的基础。 它接受源程序( 语法分析) ,按转换的要求生成数据文件( 静态分析) 和改造源 代码( 程序插装) ,并为后续的一系列自动修改工作提供支持。在整个转换工具 中,可以做到只有检查模块直接与源程序相关。检查模块实际上起到了中介作用, 它使转换工具的自动修改模块只与数据文件和插装后的源程序表示相关,而不与 源程序相关。我们的设计思想是力图将检查模块和自动修改模块分丌,同时保证 它们之间的接口即使在修改规则改变的情况下也能同样表达且不发生变化。 2 1 2 兼容性分类 a d a 8 3 9 5 转换系统将a c g 的4 3 条不兼容分为三大类:向上一致( u p w a r d c o n s i s t e n t ) 、准向上一致( u p w a r d c o n s i s t e n ti f n o e x c e p t i o n s ) 和向上不一致( u p w a r d i n c o n s i s t e m ) 的不兼容1 ”】。 向上致不兼容:通常情况是指个合法的a d a 8 3 编译单元在a d a 9 5 环境下 语法不合法,但是仍保留相同的语义。 准向上一致不兼容:在不引发与a d a 8 3 和a d a 9 5 转换特性相关异常的情况下 的向上一致不兼容。 向上不一致不兼容:一个合法的a d a 8 3 编译单元在a d a 9 5 环境下合法,但是 有不同的语义,而a d a 9 5 编译系统却无法将之检查出来。 显然,前两种不兼容主要表现为语法问题,而a d a 8 3 与a d a 9 5 两种语法之间 具有一对一的映射关系,通常可以自动转换;向上不一致不兼容主要是语义问题, 具体修改策略与程序逻辑有关,一般只能检查不兼容,而不易做到自动修改。 第二章a d a 8 3 9 5 转换系统 7 2 1 3 转换原则 a d a 8 3 9 5 转换系统的基本功能是,根据a c g 的4 3 条,检查a d a 8 3 源程序 中所有不兼容点,并将具有映射关系的a d a 8 3 源程序自动修改为等价的a d a 9 5 源 程序。根据转换系统的基本功能和上述三种兼容性类型,转换系统可以分为以下 三种情况处理a d a 8 3 源程序: 1 自动修改:经过自动修改,可以将a d a 8 3 程序转换为语法和语义完全等 价的a d a 9 5 程序,这类修改是安全的。处理方法是输出转换后的结果, 并且给出相应的不兼容信息报告: 2 建议修改:经过自动修改,在大多数输入的情况下,a d a 8 3 源程序的语 法和语义与a d a 9 5 程序是等价的,但是并不能保证所有的输入情况均等 价,这类修改被认为是不安全的。处理方法有两种,一种是将其自动修 改,处理同上,但是需要在不兼容信息报告中强调被转换的不安全性, 另一种是不自动修改,只在不兼容信息报告中建议修改策略; 3 用户修改:向上不一致的不兼容问题一般是不能自动修改的,这种情况 仅给出不兼容信息报告,提示存在不兼容,但不输出转换结果。 系统将这三种情况分别放置在不同目录下,以便用户根据具体情况合理使用 转换后的程序和相应的不兼容信息报告。关于目录和目录个数的选择,可由用户 确定i ”i 。 2 2 转换系统的体系结构 根据系统的功能需求,系统需要进行的主要工作是,首先对a d a 8 3 源程序进 行语法分析,然后根据语法分析所收集到的相关信息确定属于某条不兼容,以便 进行上述三种转换情况之一的处理。系统体系结构如图2 1 所示,图的中间部分 为处理流程,左右两边为处理时所涉及到的一系列数据字典和相关临时信息。 a d a 8 3 9 5 转换系统前端的研究与实现 处理不兼容转 埋篁堕塞壁 处理输入目录指 塞壁 = = = 二) 不兼容信息字l 字典l _ - 禳歹1 类型标识l 。 芏蝗 j 中间临时文件表 不兼容 l 自动转换规则i 、字典j 不兼容 详细报告模扳 输入 d a b 3 源程序 ! 一 预处理 j l 一 前端检查 皇一 中问表示 ! 一 后端转换 j l 一 后处理 l 一 输i t j a d a 9 5 源程序和 1 ;兼容信息撒卉 图2 1 系统体系结构 预处理输出目录和 t 出塞堡兰塞塞奎 赢磊赢 1 兰燮! f 压;赢 一1 兰瑟兰f f 二磊习 l 竺! 至羹型 叶1 问临时 :兼容表 用户定义对照表 _ 一没有定义上下界或值不确定 n u l l ; w h e ni n tl i t e r a l = 整型 i n t - - n r s t :i n t e g e r := m i n i n t ; i n t _ t a s t :i n t e g e r := m m t w h e nr e a ll i t e r a l = 一实型:浮点型、定点型 r e a l f i r s t :f l o a t := m i n f l o a t ; r e a l l a s t :f l o a t :2m i n f l o a t ; w h e no t h e rl i t e r a l = 一e n u m ,c h a r a c t e r , 常量,变量 n a m e f i r s t :n a m e _ s t r i n g := n u l l _ s t r i n g ; n a m e l a s t :n a m e _ s t r i n g := n u l l _ s t r i n g ; e n dc a s e ; e n dr e c o r d ; 其中枚举值u n d e f i n e 用柬表示没有定义上下界的情况:u n c e r t a i n 表示已 经定义了上下界,但具体值不能静态确定:i n tl i t e r a l 和r e a ll i t e r a l 分 别表示上下界值的类型为整型和实型;o t h e rl i t e r a l 表示除整型和实型以外 的其它类型,包括枚举类型、字符类型、常量,由于子类型的上下界可以动念确 定,所以对于子类型来说,还可以是变量,记录的内容分别是枚举字面量的名字、 字符字面量的名字、常量名和变量名。 3 2 2 1 2 上下界值的记录算法 记录上下界值的类型已经可以表示,但是选用哪种情况进行记录、如何得到 具体的值仍不清楚,本节讨论具体值的记录问题。 子类型和派生类型上下界值的记录存在三种情况的问题:它们的范围 ( r a n g e ) 是直接继承基类型的范围,即基类型值的全集,还是重新定义。对基类 型的范围进行约束;有这种可能,不能只从当前的声明语句中确定,记录上下 界值的变量应采用上述结构中的哪一种情况;当子类型或派生类型的声明嵌套 层次较多时,具体值可能不能直接得到。如下面的声明语句, t y p ee n u m e r a t l 0 ni s ( a ,b ,c ,d ,e ,f , g ,h ,k ,l ,m ,n ) ; s u b t y p es t a t e li se n u m e r a t i o nr a n g ea l : s u b t y p es t a t e 2i ss t a t e lr a n g ec l : s u b t y p es t a t e 3i s s t a t e 2 ; 对于子类型s t a t e 3 来说,如果只从自身的声明语句分析子类型,不可能直接得 到它的范围,只能知道它的范围等于基类型s t a t e 2 的范围;对于子类型s t a t e 2 来说,即使有r a n g e 表达式表示的范围,也不能只从自身的声明语句中看出标识 符“c ”和“l ”到底是什么,因为它们可以表示枚举字面量,也可以表示常量名, 2 4 a d a 8 3 9 5 转换系统前端的研究与实现 对于子类型还可以表示常量名。 对于上述三种情况,不同的情况处理方法不同,但是实现时必须同时考虑这 三种情况。这样,上下界值的记录问题的解决方法如算法3 1 ,算法3 1 以子类型 进行说明,派生类型的解决方法类似。 算法3 1 予类型上下界值的记录算法 输入:语法分析的记号属性和符号表的历史记录 输出:子类型表项的上下界值 方法: 1 按照予类型产生式中的基类型名在符号表的历史记录中查找,查找到基 类型对应的符号表表项,并在子类型表项中记录基类型的名字和入口地 址值; 2 判断子类型声明中是否存在r a n g e 表达式,若存在,则继续:若不存在, 则转到6 : 3 分析r a n g e 表达式中伪变量的属性信息,如果属性信息可以确定上下界 值的类型,则按照伪变量的属性信息生成对应t i d 的r a n g el i t e r a lt y p e 变 量,然后转到5 :如果不能确定,则继续: 4 根据基类型的类型确定子类型上下界值的类型,生成对应t i d 的 r a n g el i t e r a lt y p e 变量,然后继续: 5 已生成确定的r a n g e _ l i t e r a l t y p e 变量,需要根据r a n g e 表达式的两个值记 录上下界的值,r a n g e 表达式的值有两种情况,确定和不确定: 1 ) 值确定:除值是由变量决定外,其它都是确定的。如果确定,则直 接记录表达式中的值。“直接记录”表示整型、实型、字符型记录字 面量的值,枚举类型记录字面量的名字,常量则需要查找常量对应 的符号表表项,取到具体值再记录。 2 ) 值不确定:只有值是由变量表达这一种情况,则记录变量名。 记录结束,退出算法。 6 按照基类型的上下界变量类型确定子类型的上下界变量类型。基类型的 类型只有两种情况,标量类型和子类型: 1 ) 如果基类型是标量类型,则先按照具体的标量类型生成对应t j d 的 r a n g e _ i i t e r a l _ t y p e 变量。再将标量类型的上下界值记录在该变量中: 2 ) 如果基类型也是子类型,则将基类型的r a n g e _ _ l i t e r a l _ _ t y p e 变量值直 接赋给子类型的上下界变量。 撑撑 第三章转换系统前端的关键技术 2 5 3 2 2 2 含有表达式的类型声明的符号表组织 a d a 8 3 的类型声明中可以出现没有名字的表达式,如索引类型是一个表达式, 数据对象声明中的类型是一个表达式,等等。类型声明中的表达式一般包括两部 分内容,简单类型名和约束条件,简单类型名指用一个简单的名字可以表示对应 的类型信息。如果类型声明中出现表达式,则应该将整个表达式全部记录下来, 如果只记录表达式中的简单类型名,则会丢失约束条件,无法为兼容性检查做准 备。如下面的声明语句: t y p ea 1i sa r r a y ( n a t u r a l r a n g e ) o fi n t e g e r ; t y p ea 2i sa r ra y ( n a t u r a lr a n g e ) o fi n t e g e rr a n g e 1 5 ; 这两个声明语句从语法角度看没有太大差别,类型a l 和类型a 2 都是非限制型 数组类型,并且索引类型都是自然数,数组元素的类型都是整型,只是a 2 的元 素值域加了范围限制。第一个声明语句,记录数组名为字符串“a 1 ”,非限制型 数组,索引类型为n a t u r a l 类型,数组元素类型名为字符串“i n t e g e r ”就 足够了。而第二个声明,除数组元素类型以外,其它记录信息都和第一个相同, 只是它的数组元素类型不是一个简单类型名,如果只用变量b a s et y p e 记录字符 串“i n t e g e r ”,则缺少了约束条件,所以不能只记录i n t e g e r 类型名,还必 须记录约束条件,如上述声明中的“r a n g ei 一5 ”。所要解决的问题是如何在类 型符号表中存放含有表达式的类型声明的完整信息。 当声明语句中出现没有名字的表达式时,采用类似于p a s c a l 的处理方法进行 处理。p a s c a l 的许多实现都是用隐含的类型名和声明中的表达式联系:如果变量 声明中出现没有名字的表达式,那么建立一个隐含的类型名,而且是每当变量声 明中出现表达式,就建立一个新的类型名。 前端只能借鉴p a s c a l 的处理方法,具体生成隐含类型名的方法不能相同,原 因是:由于a d a 语言声明中的表达式不但可以出现在变量声明中,而且可以出 现在类型声明中;p a s c a l 的处理方法实际上采用的是名字等价,而a d a 应该采 用结构等价,因为p a s c a l 的处理方法是只要声明中出现表达式。就建立一个隐含 类型名,不论该类型是否己经存在结构相同的类型,而在a d a 语言中,表达式相 同的变量是可以互操作的,所以处理时应遵循结构等价原则。要遵循结构等价, 就必须在符号表的历史记录中判断是否已存在结构等价的类型,如果存在,则返 回该类型的类型名:如果不存在,则建立一个新类型,即生成一个符号表表项记 录该类型,并给它起一个名字。该名字仅在内部使用。因此称为内部类型名。 这样,判断结构等价、生成内部类型是处理问题的关键。判断结构等价不但 需要在符号表中不断向下查找相关内容,还需要判断每一步的进入深度。设有两 个表达式,若判断时,表达式1 经过一步即可得到类型结构,而表达式2 可能经 2 6a r i a 8 3 9 5 转换系统前端的研究与实现 过许多步才能得到需要的类型结构,则表达式1 中的一步结果可能相当于表达式 2 中的几步结果,而且这个对应是动态确定的,所以需要判断每一步进入的深度, 即结构等价一步的终止条件。又因为a d a 语言中能够存在结构等价,只有在类型 和类型之间、类型和子类型之间、子类型和子类型之间,所以具体实现时只需考 虑这三种情况,具体算法如算法3 2 。算法3 2 中的名词“最终基类型”定义:由 于子类型的基类型有可能还是子类型,即子类型嵌套的情况,所以一直向深查找, 最终一定存在一个类型,将这个类型成为子类型的最终基类型。 算法3 2 表达式判断结构等价 输入:类型声明中的表达式l 和表达式2 输出:是否等价 方法:按照表达式l 中的简单类型名l 和表达式2 中的简单类型名2 的组合情 况进行分类判断,如果符合下述三种情况之中的一种,则可能结构等价, 否则不等价,退出算法。 1 如果简单类型名1 和简单类型名2 都为除子类型外的同种类型,则 直接按照该类型的要求进行判断,例如都为访问类型,则先判断两 个访问的对象类型的名字是否相同,若相同,则表达式l 和表达式2 结构等价:若不同,再继续用该算法判断它们两个访问的对象类型 是否结构等价: 2 如果两个表达式中的简单类型名其中一个表示子类型,另一个表示 类型,不妨设简单类型名l 表示子类型,简单类型名2 表示类型, 则查找到子类型的最终基类型,用最终基类型和简单类型名2 表示 的类型进行判断: 1 ) 判断是否为同种类型,若不是,则不等价,并退出算法:否则继 续判断: 2 ) 用表达式1 中的约束条件和简单类型名2 表示的类型中的约束条 件进行比较,若约束条件等价,则表达式1 和表达式2 等价,否 则不等价,退出算法: 3 如果两个简单类型名都表示予类型,则都查找最终基类型: 1 ) 判断两个最终基类型名是否同名,若不同名,则不等价,并退出 算法;否则继续; 2 ) 用两个表达式中的约束条件进行比较,若约束条件等价,则表达 式1 和表达式2 等价,否则不等价,算法结束。 # 茸 第三章转换系统前端的关键技术 2 7 如果用算法3 2 判断不存在结构等价的类型,则需要生成一个新的内部类型, 具体实现时有三种不同情况: 1 类标量类型的表达式 类标量类型的表达式是在简单类型的基础上增加一个约束条件,如下面的声 明语句: t y p eai sa r r a y ( i n t e g e r r a n g e4 。6 1o f c h a r a c t e r ; t y p ea r ri sa r r a y ( a 一f ) o ff l o a td i g i t slr a n g e0 0 3 0 ; t y p ea c ci sa c c e s sc h a r a c t e rr a n g e c 。g : 它们和其它同种简单类型可以互操作,所以不能用新增一个类型来解决,只能用 新增子类型解决。这样,处理时就像在a d a 8 3 源程序中增加一条子类型声明语句, 以第1 条声明语句为例,处理可看成是变为: s u b t y p e a d a c v t _ n a m e 一0 1 1 si n t e g e rr a n g e 4 6 ; t y p eai s a r r a y ( a d a c v t _ n a m e 一0 1 ) o f c h a r a c t e r ; 其中,子类型名a d a c v tn a m e0 l 就是一个内部类型名,只在前端内部可见, 对外始终不可见,也不能将其作为不兼容信息的一部分传递给后端。内部类型名 是内部链接名的一种,所有内部命名和使用的名字统称为内部链接名,还包括给 无名字的程序块( b l o c k 语句) 起的名字。内部链接名是由两部分组成,固定的 名字和序号,其中固定名字是由用户指定,没有指定时,前端缺省为 a d a c v tn a m e 。 2 非限制型数组确定化的表达式 非限制型数组确定化的表达式是对非限制型数组进行约束,得到一个限制型 数组,例如, t y p ea r ri sa r r a y ( i n t e g e rr 4 ,v g f 1o fc h a r a c t e r ; a 1 :a r r ( 1 。1 0 ) ; t y p e a a i s a c c e s s a r r ( 1 。3 ) ; s u b t y p e c a i s a r r ( 7 。8 ) ; t y p e c a n i s n e w a r r ( 7 。8 ) ; 对这些限制型数组有两种解决方法:可以通过增加一个数组类型来记录新增的内 部类型,也可以通过增加一个子类型来记录。如果用子类型表示非限制型数组确 定化的表达式,则生成一个子类型( “s ts u b t y p e ”) 表项,表项的名字信息为 自定义的内部类型名,基类型名记录非限制型数组名,范围的上下界值记录索引 值的限定条件。因此,子类型表项的上下界变量不再只表示具体的值信息,而是 根据基类型的不同有不同的意义。如果用数组类型表示非限制型数组确定化的表 达式,则生成一个数组类型( “s ta r r a y ”) 表项,表项名为自定义的内部类型 名。数组类型标识为限制型,索引值为表达式中的范围值,数组元素的类型与非 2 8a d a 8 3 9 5 转换系统前端的研究与实现 限制型数组的相同。由于非限制型数组加限制条件的表达式也可出现在予类型和 派生类型的基类型语法位置( 例如第4 、 种应用( 派生类型可以采用类似方法) , 组确定化的表达式。 5 句) ,这本身就是新增子类型方法的一 所以采用新增子类型来处理非限制型数 3 带有判别项的记录类型确定化的表达式 这种情况和第2 种情况有相似之处,它们都是对非限制型数据类型进行限制, 例如, t y p e r e c ( d ? i n t e g e r ) i s r e c o r d n u l l ; e n dr e c o r d ; t y p ea r r li sa r r a y ( i n t e g e rr a n g e ) o f r e c ( 0 ) ; t y p ea c1i sa c c e s sr e c ( 3 ) ; 只是第2 种情况是对非限制型数组进行限制,而现在是对带有判别项的记录类型 进行限制,所以解决方法相应的也有两种:新增一个子类型和新增一个记录类型。 如果采用新增子类型方法,只需记录判别项的具体值,处理方便,但会出现记录 简单,后继操作复杂的问题,因为如果在访问记录的具体分量信息时,先要查找 到原先的带有判别项的记录类型表项,然后在此表项中按照子类型记录的判别项 值进行分量查找,因此新增子类型方法只是推迟处理,并没有降低处理复杂度。 如果采用新增记录类型方法处理,比较合适,由于a d a 9 3 中带有判别项的记录类 型对判别项进行赋值后,它的结构随之确定,不能再改变,所以采用新增记录类 型处理。先生成一个记录类型( “s tr e c o r d ”) 表项,表项名是自定义的内部 类型名,然后查找到原先的带有判别项的记录类型表项后,新生成的表项结构按 照判别项的值将原先记录类型下属于该值的分量信息全部拷贝,即重新生成一 遍,这样就得到了一个新的记录类型。 3 3 支持a d a 可见性规则的符号表 3 3 1a d a 语言的可见性规则 如何确定名字的哪个声明应用到程序中该名字引用的作用域规则,在本文中 被称为名字的可见性规则。程序中给定位置出现的名字的意义由可见性规则确 定,就是由一个名字的引用反向去找寻确定它的声明的规则,其一般原则是: 在程序的任何位置,只有在当前的作用域中及在包含当前域的打开的作用域中 第三章转换系统前端的关键技术 2 9 声明的名字才是可见的。 可见性规则符合静态作用域最近嵌套原则,即如果一个名字在一个以上的打开 的作用域中被声明,那么,离引用最近的内层声明,是该引用的声明。 根据以上规则可推出,当一个作用域关闭时,在该作用域中的声明都变成不可见 的【2 2 】。 a d a 语言的名字包括变量名、常量名、类型名,程序块名、子程序名、包名、 类属名、任务名,其中变量、常量、类型的可见性问题比较简单,而程序块、子 程序和包的比较复杂,这是出于a d a 允许名字的作用域嵌套和名字的作用域扩展 这两种机制。名字的作用域嵌套已在支持可记录作用域信息的符号表( 3 1 2 ) 一 节讨论过。名字的作用域扩展包括两种情况,一种是包说明中的名字作用域扩展 到包体中,另一种是一个编译单元用w i t h 子句将w i t h 使用的包说明中的名字作 用域扩展到该单元。本节主要讨论a d a 特有的封装机制包的可见性问题,对 于使用w i t h 子句的情况在下一节中专门讨论。 程序包由规格况明和体两部分组成,以下包的规格说明都简称包说明。包说 明提供对外可见接口,包体隐藏的实现细节,将包分为这样两部分可以达到实现 发生变化时不会影响程序的其它部分,包括自身包说明。包说明和包体的可见性 问题表现为以下几点: 1 包说明中声明的对象分为私有和非私有两种,非私有对象对外是可见的。 然而,不论是私有对象还是非私有对象,对内都是可见的,“内”包括包 说明本身和包体,因此,包说明中声明的对象在整个包中相当于一个全 局量,一个“局部”的全局量。 2 在任何时候包体都是不可见的。包体中声明的对象只能是在包体内使用, 在包体外不可见,包括对自身包说明也是不可见的。 3 包说明使用w i t h u s e 子旬,得到的可见性保持到包体,或者说传递给包 体。凡是包说明w i t h 的库单元,u s e 的程序包,对包体来说同样适用, 即保持包说明的可见性,处理方法归结为3 3 2 2 节中隐式使用w i t h u s e 子句的一种。 4 由于a d a 支持对包说明和包体的分别编译,所以包体不但保持包说明的 可见性,还可以自己使用w i t h u s e 子句增加库单元的可见性,但这不会 影响包说明的可见性。 3 3 2 引入w i t h u s e 子句的可见性规则 a d a 语言的可见性分为直接可见( d i r e c tv i s i b i l i t y ) 和指定可见( v i s i b i l i t yb y s e l e c t i o n ) 两种。如果对象名字如x 是直接可见的,可直接使用x 。如果不是直 3 0a d a 8 3 9 5 转换系统前端的研究与实现 接可见的,它可以通过引用p x 使x 成为可见的。a d a 中的w i t h 子句用来扩展库 单元的指定可见性,而u s e 子旬是为了获得该库单元的直接可见性。w i t h u s e 子 句的语法如下: w i t hc l a u s e := w i t hu n i t _ s i m p l en a m e ,u n i ts i m p l e _ n a m e ; u s e c l a u s e :2u s ep a c k a g e _ n a m e ,p a c k a g e _ n a m e ) ; u s e 子句的p a c k a g e _ n a m e 只能使用w i t h 子句提及过的程序包,不能出现没有被w i t h 过的包名。 3 3 2 1w i t h u s e 子句可见性的多样性 一般情况下,w i t h u s e 子句的使用都是放在一个编译单元前,如 w i t ha l ;u s e a l ; p a c k a g e a 2i s e n d a 2 ; 但是,不是只有这一种方式,还有许多其它的方式,而且不同的方式达到的效果 和影响不同。这些不同的使用方式都是需求推动的,需求要求完成不同程度的可 见性和可访问性,来维护应用系统的安全性,同时给使用者带来方便。下面分别 说明w i t h 子句、u s e 子句的多样性。 3 3 2 1 1w i t h 予旬 w i t h 子句只能出现在一个编译单元前,所以需要该编译单元将所依赖的库单 元一次性全部扩展,这样就会给程序员带来不便,因此a d a 提供了一种新的编译 单元形式子单元( s u b u n i t ) ,使w i t h 子句表面上还是只能在一个编译单元前 出现,但实际上已经将w i t h 子句加入到程序单元的中间部分。包体、子程序体、 任务和保护对象可以从一个直接封装的库单元中取出,移出的单元称为子单元, 它们可以单独编译,相应的库单元称为该子单元的父单元。子单元的语法如下: b o d y _ s t u b := s u b p r o g r a ms p e c i f i c a t i o ni ss e p a r a t e ; ip a c k a g eb o d yp a c k a g e _ s i m p l e _ n a m e i ss e p a r a t e ; i t a s kb o d y t a s k _ s i m p l e _ n a m e i ss e p a r a t e ; s u b u n i t := s e p a r a t e ( p a r e n tu n i tn a m e ) p r o p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服务礼仪培训演讲课件
- 服务接待课件
- 服务公主培训课件
- 法务部门年终课件
- 分图形教学课件
- 肺通气指标课件
- 事业单位护理岗面试2026经典考题试卷及答案
- 事业单位财会岗面试专业面试历年真题题库及解析
- 事业单位工程岗2026面试必练考题全真模拟试卷
- 飞天二教学课件
- 2026中国邮政联合校园招聘笔试参考题库(含答案解析)
- (一模)嘉兴市2026-2027学年第一学期高三教学质量检测语文试卷(含答案)
- 2027年湖北交通投资集团有限公司秋季校园招聘131人笔试备考题库及答案解析
- 2026山东青岛水务集团有限公司招聘笔试历年参考题库附带答案详解
- 2026年党支部基层总结报告
- T∕CCEAS008-2026 建设工程造价咨询成果文件质量标准
- 2018 机械通风冷却塔 第1部分:中小型开式冷却塔
- 中国膀胱癌诊疗指南2025版
- 梅尼埃病前庭功能检测
- 凉山2025年四川凉山州雷波重点国有林保护局招聘27人笔试历年参考题库附带答案详解
- 药品追溯系统培训课件
评论
0/150
提交评论