




已阅读5页,还剩47页未读, 继续免费阅读
(计算机软件与理论专业论文)基于开放编译的c程序静态分析机制.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 随着软件系统的日益复杂,软件开发、维护以及进化的大部分工作和主要成 本集中在对现有系统的理解上。逆向工程是一种辅助程序理解的重要手段,是软 件工程的一个重要分支,它通过抽取程序的静态信息和动态信息来抽象其高层表 示,辅助程序理解。 本文介绍了软件逆向工程的基本原理及研究现状,深入分析了基于反射技术 的开放编译器o p e n c + + 。通过修改源代码、扩充m o p 接口,成功地把o p e n c + + 改造成为程序分析工具。通过该工具对目标系统进行深入的静态分析获得的信息 不仅可以用来恢复系统的静态模型,也可以用来直接恢复出符合u m l 2 0 标准的 序列图和辅助对目标系统的植入。 论文中提出的所有方法、算法均已在x d r e ( x i d i a nr e v e r s ee n g i n e e r i n g ,西 电逆向工程) 工具中实现。 关键词:面向对象逆向工程开放编译反射植入序列图 a b s t r a c t a b s t r a c t f o rt h ec o m p l e x i t yo fs o f t w a r es y s t e m ,t h em a i nw o r k so fs o f t w a r ed e v e l o p m e n t , m a i n t e n a n c ea n de v o l u t i o nh a v eb e e nf o c u s e do nt h ec o m p r e h e n s i o no fe x i s t i n gs y s t e m s r e v e r s ee n g i n e e r i n gi sa l le f f e c t i v em e t h o dt op r o 踟c o m p r e h e n s i o n ,a n di th a sb e e n as i g n i f i c a n tr e s e a r c hb r a n c ho fs o f t w a r ee n g i n e e r i n g i tc r e a t e sr e p r e s e n t a t i o n so ft h e s y s t e ma tah i g h e rl e v e lo fa b s t r a c t i o nt oa s s i s tp r o g r a mc o m p r e h e n s i o nb ye x t r a c t i n g t h es t a t i ci n f o r m a t i o na n dd y n a m i ci n f o r m a t i o nf r o mt h ep r o g r a m t h i sp a p e rb e g i n sw i t ha l li n t r o d u c t i o no ft h ep r i n c i p l e sa n da p p l i c a t i o n so f s o l w a r er e v e r s ee n g i n e e r i n g ,a n dd i s c u s s e st h eo p e nc o m p i l e ro fo p e 芏1 c + + i nd e t a i l , w h i c hi sb a s e do nt h er e f l e c t i o nt e c h n i q u e b ym e a n so fs o u r c ec o d em o d i f i c a t i o n ,m o p e x t e n s i o n ,t h i sp a p e rt u r n so p e n c + + i n t oap r o g r a ma n a l y s i st o o l ,t h o u g hw h i c hw ec a n e x t r a c tt h es t a t i ci n f o r m a t i o nt or e c o v e rn o to n l yt h es t a t i cm o d e lo ft h et a r g e ts y s t e m b u tu m l 2 0s e q u e n c ed i a g r a m so ft h et a r g e ts y s t e m t h et o o lc a na s s i s tp r o g r a m i n s t r u m e n t a t i o nt o o a l lo ft h ea l g o r i t h m sa n dm e t h o d sp r o v i d e di nt h i sp a p e rh a v eb e e ni m p l e m e n t e d i nat o o ln a m e dx d r e ( x i d i a nr e v e r s ee n g i n e e r i n g ) k e yw o r d :o b j e c t o r i e n t e d ,r e v e r s ee n g i n e e r i n g ,o p e nc o m p i l e r , r e f l e c t i v e i n s t r u m e n t a t i o n ,s e q u e n c ed i a g r a m 西安电子科技大学 学位论文独创性( 或创新性) 声明 秉承学校严谨的学分和优良的科学道德,本人声明所呈交的论文是我个人在 导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标 注和致谢中所罗列的内容以外,论文中不包含其他人已经发表或撰写过的研究成 果;也不包含为获得西安电子科技大学或其它教育机构的学位或证书而使用过的 材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中做了明确的说 明并表示了谢意。 申请学位论 本人签名: 不实之处,本人承担一切的法律责任。 日期逖。互,歹 西安电子科技大学 关于论文使用授权的说明 本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究 生在校攻读学位期间论文工作的知识产权单位属西安电子科技大学。学校有权保 留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部或部分内 容,可以允许采用影印、缩印或其它复制手段保存论文。同时本人保证,毕业后 结合学位论文研究课题再攥写的文章一律署名单位为西安电子科技大学。( 保密 的论文在解密后遵守此规定) 本学位论 本人签名: 导师签名: 一一年解密后适用本授权书。 日期2 竺墨! 丕:易 日期五吲0 啤 第一章绪论 第一章绪论 1 1 逆向工程 逆向工程( r e v e r s ee n g i n e e r i n g ) 总是相对于正向工程( f o r w a r de n g i n e e r i n g ) 而 言,正向工程是从系统的高层抽象和逻辑上的、独立于实现的设计,到系统的物 理设计与部署的传统过程;而逆向工程被定义为分析软件构件和它们的相互关系, 从而在较高抽象层次上描述该软件,力求尽可能准确地有效地恢复其高层设计和 需求的过程p 。图1 1 形象的描述了与逆向工程相关的几个概念。本节将从逆向工 程的重要性、研究方法和研究目标几个方面来简要的介绍逆向工程。 驰 h 星 魁 1 1 1 逆向工程的重要性 图1 1 逆向工程关系图 在计算机软件发展的几十年历程中, 软件系统日益庞大和复杂,在这过程中, 醛 h 匿 目 计算机编程语言的演化和发展日新月异, 而许多软件系统的设计文档的不完整、 不规范和与实际系统的不一致,导致大量的遗产系统存在。如何充分利用和维护 这些遗产系统,不可避免地成为软件开发人员的难题之一卜1 。 在现阶段软件开发中,由于软件系统的复杂性不断增长,软件从业人员的频 繁流动,尤其是一些大型系统广泛采用的面向对象技术,致使软件的维护和更新 成为一项令人繁琐的工作。虽然有许多软件工程方法和软件开发标准对软件开发 过程实施控制,但是从软件维护和更新角度出发,情况并没有明显的改观,据 s o m m e r v i l l ep 。和d a v i s r 统计,用于软件维护的资源和时间占到软件开发总投入 的5 0 一7 5 。 2 基于开放编译的c + + 程序静态分析机制 由此可见,软件维护和更新在软件开发中占据重要地位,而软件维护和更新 的首要问题是对原有软件系统的理解。因此,软件逆向工程作为一种重要的程序 理解的方法,在软件开发过程中占据重要地位。 1 1 2 逆向工程研究方法和目标 典型的软件逆向工程应具有两个过程p 1 :信息提取( i n f o r m a t i o ne x t r a e o 和信息 抽象( i n f o r m a t i o na b s t r a c t ) 。信息提取分析目标系统,获得其组成和内在联系。信 息抽象产生对该系统另外一种形式的表示或者是更高层的抽象。近年来随着软件 可视化技术的发展和c a s e 工具的出现,信息呈现( i n f o r m a t i o np r e s e n t a t i o n ) 也成为 逆向工程中重要的过程之一。总的来讲,软件逆向工程就是使用适当的获取机制 收集来自目标系统的原始数据,利用这些原始数据抽象出便于程序理解的高层信 息,最终构建出目标系统概念模型和设计模型,并将这些模型清晰、准确地呈现 出来,以达到理解程序的目的。c h i k o f s k y 和c r o s s 一1 给出了软件逆向工程中几个 相关的术语定义: 令正向工程( f o r w a r de n g i n e e r i n g ) :正向工程是由高层次的抽象和设计到底 层次的实现的过程。逆向工程可以看成是它的逆过程。 再文档( r e d o c u m e n t a t i o n ) :主要是在同一抽象层次做语义等价描述。实际 上是逆向工程的一种简单形式。 令设计再现( d e s i g nr e c o v e r y ) :利用领域知识和外部信息在较高抽象层次产 生系统的等价描述。这样要使用除了源代码外的很多信息。 令重构( r e s t r u c t u r i n g ) :在同一抽象层次把系统从一种表示转换到另一种表 示,一个重要方面是新系统和原始系统的语义行为应该样,而且功能也 不能变。 再工程( r e e n g i n e e r i n g ) :目的是研究系统,产生较高抽象层次描述,增加 新功能到这个描述,使用正向工程技术在原始系统的基础上开发一个新系 统。 对于程序维护而言,如果能够不借助阅读源代码而理解程序的行为,至少清 楚程序的高层架构信息是很重要的步骤。逆向工程工具不可能具备使用户抛开源 代码就可以完全准确的理解程序的功能,逆向工具是辅助性工具,它支持产生程 序的一系列高层抽象视图,并清晰的将之呈现,帮助用户更容易理解程序,这也 是逆向工程最重要的研究目标。 1 1 3 国内外逆向工具现状 从已经搜集到的文献来看,与本项目的研究有一定关系的国外软件工具很多, 第一章绪论 3 具有代表性的工具有s c e d ,r i g i ,m i c r o s o f tv i s i o2 0 0 0 ,r e f i n e c ,i m a g i x 4 d , s n i f f + ,g d p r o ,b a l b o a i s v i s ,o p e nc + + o p e nj a v a ,r a t i o n a lr o s e r o s er e a l t i m e r o s e a r c h i t e c t 等。国内的逆向工程工具比较少,如青鸟程序理解系统j b p a s 。其 中,与本项目技术相关的工具有m g i ,s c e d ,i s v i s ,o p e nc + + ,r a t i o n a lr o s e 等。 砒酉 融西是一个著名的可扩展、可裁剪的逆向工程环境,已经有近1 0 年的历史, 主要由三部分构成:r i g i r e v e r s e r ( 程序静态信息解析器,可以支持c c + + 、c o b o l 等语言) ;r i g i s e r v e r ( 程序静态信息库,用于存储从源代码提取的信息) :r i g i e d i t ( 交互式的窗口图形编辑器,以图形交互方式展示和操纵程序静态信息) 。 西与下述s c e d 可以协同使用,分别得出目标系统源程序的静态信息和动 态信息。 冷s c e d s c e d 是一种支持面向对象动态建模的环境,可以产生剧情图( 类似于u m l 中的s e q u e n c ed i a g r a m ) 和状态图( 类似于u m l 中的s t a t e c h a r td i a g r a m ) 。s c e d 基于o m t 方法,也可用于其它方法,尤其是以剧情驱动的方法。 s c e d 获取动态信息的手段是利用符号调试工具( d e b u g g e r s ) 的能力,在源 程序的特定位置插入提供动态信息的代码,再加以搜集、整理和模型化。s c e d 提 供了从剧情图到状态图的转换工具。s c e d 允许在激励过程中人工增加新的行为到 目标系统,称为激励式设计( d e s i g n b y - a n i m a t i o n ) 技术。通过交替地使用状态图 合成和激励式设计,使得程序的动态模型进行半自动化的求精( r e f i n e m e n t ) ,每 一次求精都给出进化了的剧情集和状态机。 冷i s v i s i s v i s 的主要目的是浏览分析从源程序中推导出的可跟踪事件。这种工具的功 能包括:读入源程序文件,解析后产生静态信息文件;利用源代码、静态信息文 件以及用户提供的相关的信息,产生获取动态信息所需的代码;执行插入上述代 码后的目标系统,产生动态事件跟踪信息,并自动转变成剧情;用户通过所产生 的剧情视图进行交互式分析。 冷i m a g i x 4 d i m g a g i x 4 d 是一个c c + + 程序的静态理解工具,它可以提供多层次的视图,以 表示从高层设计到实现的细节、类和函数的依赖关系等。i m a g i x 4 d 以三维图形的 形式展示关键信息,使得用户的注意力集中在回答特定问题的视图上。i m a g i x 4 d 提供了产生大量视图的能力以及从源代码生成文档的能力。它提供的交互式询问 功能对迅速理解程序很有帮助。 青鸟程序理解系统j b p a s 4 基于开放编译的c + + 程序静态分析机制 青鸟程序理解系统j b p a s ( j a d eb i r dp r o g r a ma n a l y s i ss y s t e m ) 是一个针对c + + 语言的程序理解系统,由一个c + + 分析器前端和一组分析工具组成。该系统是北 大青鸟基于异构平台、具有多信息源接口的应用系统集成( 组装) 环境一青鸟i i i 型( j b 3 ) 系统一的组成部分。该系统针对c + + 语言,采用增量分析技术对程序源 代码进行静态分析;用e e r ( e n h a n c e de n t i t y r e l a t i o n s h i p ) 为c + + 程序建立概念 模型并抽取程序信息,将信息保存在数据库中;按照不同的用户需求组织程序信 息,辅助用户理解c + + 程序;逆向生成源程序的o o d ( o b j e c t o r i e n t e dd e s i g n ) 文档和r o s e 文档( 但实际所需的时间很长,对于1 0 万行源代码的程序,大约需 要6 小时) 。 1 。2 项目背景 本文论述的工作来源于系统应用软件逆向工程开发工具研究( x d r e ) 项目的一 部分。该项目的主要工作是研制一套逆向工程工具集,并将其无缝集成到r a t i o n a l r o s e 中。 为了解决开发过程中因需求变化和设计变更而引起的问题,r a t i o n a l 公司推出 了一种以受控的迭代式增量开发为特征的软件开发过程产品r u p ( r a t i o n a lu n i f i e d p r o c e s s ) 和一种面向对象软件开发环境r a t i o n a lr o s e 。然而,r a t i o n a l 环境与工具 的支持理念以正向工程为主,即按照分析建模、设计建模、用静态设计模型自动 产生或修改代码框架、方法函数体的编码、模块系统测试的顺序进行开发,对于 逆向工程,r a t i o n a l 环境与工具仅支持程序到部分静态设计模型( 主要是类图,c l a s s d i a g r a m s ) 的自动转换。另一方面,由于理论与技术上的困难,即使像r a t i o n a l 产品这样在世界上具有高技术水平的面向对象开发环境与工具,也不能用动态设 计模型自动产生或修改代码。 现有的开发环境对解决软件开发周期和软件寿命缩短支持不足,不能用动态 设计模型自动产生或修改代码,以及在开发过程中关键技术人员的流动,造成四 个方面的问题: 1 开发过程中后期需求变化或现场维护后无法保证模型与程序的一致性。 开发过程的中后期一旦发生了需求变化,或者现场维护时发生了程序的修改, 虽然可以要求开发人员对系统静态模型进行相应的修改,重新生成源程序代码框 架和一部分文档,但由于时间的限制和系统动态模型不能对源程序产生实质性作 用等因素,则经常是不修改动态模型而直接修改源程序,使得相关于动态模型的 文档很可能与源程序不一致。 2 正向建立的动态模型与程序不能保证必然的一致性。 由于r a t i o n a l 开发环境不支持用动态模型自动产生或修改代码,因此即使是开 第一章绪论 5 发时间允许,人工正向建立的动态模型与对应的源程序之间也不能保证必然的一 致性,故自动生成的文档可能没有正确反映目标系统的动态行为和结构特征。这 在相当大的程度上影响了技术人员建立系统动态模型的积极性,许多出于应付差 事的心态而建立的动态模型与实际系统不符。 3 已有文档中的框架描述和静态模型可能与程序不一致。 由于过去没有采用软件开发环境,文档与源程序并不一致,或者要利用的是 从i n t e r n e t 下载的一些自由软件,根本没有统一的设计,所提供的文档大多是对程 序本身的辅助说明,因此,系统框架信息隐蔽在源程序中,但却没有工具能将其 抽取出来。 4 正向建立的静态模型可能没有正确体现抽象层次较高的程序框架。 即使采用软件开发环境,由于目前的r a t i o n a l 开发环境只支持用包结构 ( p a c k a g e s ) 进行模型层次的抽象,而包结构对源程序并不起实质的组织作用,因此 当包结构未能有效地体现系统框架时,其他开发人员仍然无法获得系统框架信息。 最根本的解决办法是用工具从源程序中抽象出不同层次的静态模型,其中包 括系统框架层。但是,目前r a t i o n a l 工具对源程序到类图的自动转换是机械的,有 较大的局限性: 1 ) 如果该源程序过去就是用r a t i o n a l 工具产生的,则由于在其注释中加入了 模型信息,使得逆向产生的类图与正向建立的相同( 包括包结构) 。但是 在实际应用中,完全可以通过软件过程管理等手段要求开发人员先对类图 进行修改,再重新生成源程序代码框架( 这时r a t i o n a l 工具可以自动保证 以前人工编制的程序保持不变) ,因此实际上这种情况下可以不用逆向工 程工具。 2 ) 如果该源程序不是用r a t i o n a l 工具产生的,则使用逆向工程工具就是有意 义的。但是,这时逆向产生的类图包含了许多并不是类的结构实体,对于 类之间的关联也不加区分地展示,使得所产生的类图错综复杂、没有层次, 如同蜘蛛网一般,需要有经验的设计人员进行较长时间的人工加工后才能 使用,因此这种功能实际上很少在工程中应用。 由问题1 和问题2 引出的需求是:提供一组工具,以支持从源程序逆向地产 生相应的动态模型,如符合u m l 标准的序列图( s e q u e n c ed i a g r a m s ) 、状态图( s t a t e c h a r td i a g r a m s ) 、协同图( c o l l a b o r a t i o nd i a g r a m s ) 等,并使得逆向产生的上述动 态模型在r a t i o n a l 开发环境中与正向建立的动态模型具有相同的表示,以便自动生 成文档。由问题3 和问题4 引出的需求是:提供一种工具,它具有一定的层次分 析与过滤能力,能够根据不同的抽象层次要求,从同样的源程序中逆向产生不同 抽象层次的静态模型,对系统框架的理解起计算机辅助作用,并使得这样的静态 模型在r a t i o n a l 开发环境中与正向建立的静态模型具有相同的表示,以便对其进行 6 基于开放编译的c + + 程序静态分析机制 人工修改和自动生成文档。 1 3 1 项目工作简介 1 3 项目工作介绍 按照逆向工具内容和要求,将项目的工作内容划分为五个子系统,即交互子 系统、植入子系统、信息处理子系统、产生序列图子系统和转换子系统。各个子 系统的工作都是相互关联的,这几个子系统合在一起得到的工具构成了以一个循 环迭代的过程 各子系统的功能如下所述: 1 交互子系统 交互子系统的主要功能是给用户提供一个友好界面,将本项目所开发的工具 集成到r o s e 环境中,并提供给各个子系统接口,协调各个子系统的工作。支持用 户从程序不同侧面选择植入位置,并将植入位置信息和植入内容信息交给植入子 系统进行植入;辅助用户完成动态信息的收集。 2 植入子系统 根据交互子系统提供的植入位置和植入内容信息,采用规范的动态信息表示 并使用o p e n c + + 的m o p 对目标系统的源文件进行代码植入。植入代码后的目标系 统源文件经编译、运行后产生动态信息。这些动态信息交给信息处理子系统进行 收集、过滤和转换。 3 信息处理子系统 该子系统的功能是接收经代码植入后,编译、运行目标系统所产生的动态信 息,并对这些信息进行处理,分别得到各个系统需要的数据和格式。主要有序列 图数据,进程结构图的数据,静态类图的数据和进程动态信息的数据。 4 产生序列图子系统 该子系统的功能是开发符合u m l 规范的序列图,同时提供剧情的抽象能力, 包括水平抽象和垂直抽象。达到帮助用户理解程序的目的。而且序列图的产生是 状态图子系统的基础。 5 状态图子系统 该子系统完成从序列图转换成状态图的转化,根据序列图交互的基本信息, 转化成符合u m l 规范的状态图,并且可以对状态图进行抽象,得到分层状态图和 合并状态图。 第一章绪论 7 1 3 2 项目工作进展 本项目采用了r u p 开发方法,用循环迭代开发的方式逐步实现各个研究目的。 目前已经能够逆向生成类图、进程结构图、u s ec a s e 图、序列图、状态图和活动 图,并能够对这些模型图进行进一步的抽象。 1 4 本文工作及论文结构 本文论述了x d r e 植入子系统程序分析模块第九轮迭代的设计与实现工作。 在前八轮迭代中,植入子系统实现了针对w i n d o w s 平台和l i n u x 平台的c + + 程序 部分静态信息和动态信息抽取的部分工作。实践表明,基于反射和开放编译技术 的程序分析机制是可行的。但在部分技术和实用性方面还有一些欠缺,例如获得 的信息以动态信息为主,尤其是程序依赖信息,单纯依靠反射植入技术通过在目 标系统中植入触发器代码,然后动态运行植入相应触发器代码的目标系统动态收 集动态信息,在某些大型的应用中可能会出现信息不全面和效率瓶颈问题。 在本人所在的迭代工作中,提出了以深入的静态分析方式,得到目标系统完 整全面的程序依赖信息,既可以直接逆向生成静态模型和动态模型,又可以辅助 动态方式进行部分植入,很大的提高了系统的效率和所获取信息的完备性。 本文的第二章探讨了逆向工程和反射等相关理论并介绍了现有的一些相关工 具。第三章和第四章分别讨论了获取c + + 程序深入全面的静态信息的设计与实现, 这些工作在第五章用两个例子进行了验证。最后给出了结论,并提出进一步工作 的设想。 第二章相关理论与技术 9 第二章相关理论与技术 2 1 反射技术 最近几年来,由于在j a v a 和n e t 中的成功应用f 7 】,反射技术以其明确分离描 述系统自身结构、行为的信息与系统所处理的信息,建立可动态操纵的因果关联 以动态调整系统行为的良好特征,已经从理论和技术研究走向实用化,使得动态 获取和调整系统行为具备了坚实的基础。因此,基于反射技术的开放实现,开放 编译器正在迅速发展。 2 1 1 反射概念 反射概念来自人工智能。反射结构分为结构反射和计算反射两类。结构反射 概念澄清了元类( m e t a c l a s s ,详见2 2 4 节) 与类之间的关系,但仍存在使得类的 内涵发生混淆的缺点。计算反射则在计算层次上对与应用领域有关的目标计算和 与系统自身有关的反射计算进行了划分,分别由对象和元对象( m e t a o b j e e t s ) 的行 为来体现。 下面讨论元计算及其主要实现途径一反射机制。 2 1 1 1 元知识 知识可以分层次。元知识( m e t a - k n o w l e d g e ) 是指关于知识的知识。同样, 关于计算的计算则称为元计算。 在推理系统中,规则是知识,通常是针对特定域的。要想找出某个域的推理 规则,还需要一种知识,这种知识和规则所包含的知识不同,一个表示系统持有 某种知识,但对他们进行修改则需要另外的知识,例如知识的结构如何? 规则怎 样表示? 解题采用什么方法? 上面这两个关于推理系统和表示系统的例子告诉我 们,把规则所含的知识与找寻规则所需的知识加以区分,以及把表示系统所持有 的知识与修改表示所需的知识加以区分,都是很必要的。 在计算系统中,为了有效地利用资源、适应变化,要求对计算过程加以控制。 这种动态控制,应当是在系统结构和环境同应用程序之间双向的交互作用基础上 实现的,这就需要关于计算的计算。 一个知识系统如果对同类的问题使用相同的推理步骤,是不可能在使用过程 中改善系统性能的。实际上,用户常常可以通过成功或失败的经验,发现带有普 遍意义的事实,并且可以把它们作为以后对这类问题进行推理的引用,而不必事 1 0 基于开放编译的c + + 程序静态分析机制 事从头开始。一般说来,检验一个事实是一个引理的实例,要比证明这个事实简 单、方便。 对于元知识的兴趣,几乎已经波及到人工智能的所有领域,包括知识表示、 问题求解、自学习系统、专家系统和演绎数据库等方面,而推理控制则是提倡使 用元知识最强烈的领域。在计算系统方面,关于计算的计算也日益受到重视并在 迅速发展。 一个系统引入和使用元知识有许多好处【8 1 ,主要有: 夺在完成一个新的任务时,可以借助于已有的经验。这是一种有效的自我修 正的形式; 在执行一个任务之前,可以利用元知识预计它的计算行为。这是一种自我 估价的形式; 令在计算系统中,可以用来实现对程序的动态修改。 2 1 1 2 反射定义 对于反射的定义,不同作者有不同的提法,比如: 定义一:反射是一个进程表示、操纵以及处理它自身的完整能力,这种能力 与该进程表示、操纵和处理它所要解决的实际问题的能力别无二致”。 定义二:反射是一个程序在其自身执行过程中操纵那些表示程序状态的数据 的能力。这种操纵表现为两个方面:内省( i n t r o s p e c t i o n ) 和调解( i n t e r c e s s i o n ) 。 内省是一个程序观察进而解释自身状态的能力。调解是一个程序修改其执行状态 或修改程序自身含义的能力。由此可见,内省相当于一个g e t 函数,调解则相当 于一个s e t 函数。操纵的这两个方面都要求有一种可以把执行状态编码成数据的机 制。实现这种编码的过程叫做具化( r e i f i c a t i o n ) t t j 。 本文采用的定义,是从计算系统的角度给出的: “在计算系统中,反射是关于并作用于计算系统本身的推理过程,这一活动 涉及访问并部分地改变整个系统,从而影响自身的计算。反射作用的目的在于动 态地修改计算系统的内部结构,使计算更为有效。反射系统是因果关联的。 1 2 1 2 反射原理 从反射定义可以推知一个反射计算系统应当具有自我表示的能力( 称为自身 表示,s e l f - r e p r e s e n t a t i o n ) 。自身表示使该系统能够回答关于其自身的问题,并支 持作用于自身的动作。系统的因果关联( c a u s a lc o n n e c t i o n ) ,是指目标计算的状 态可以激发一些作用于系统自身的动作,而系统自身的改变也可以影响目标计算 的当前状态与以后的行为。当一个程序设计语言把反射作为程序设计的一个基本 第二章相关理论与技术 概念,并提供设施以显示地处理反射计算,则称这个语言具有反射结构。反射语 言或系统的主要目的是提供访问实现的手段。 建立一个反射结构,是把某个计算域d n 中隐含的实体,与另一个计算域d n + l 加以有效的联系,使得关于这样的实体有了两个层次的计算域,我们把d n 称为基 级计算域( 或目标计算域) ,把d n + l 称为d n 的元级计算域( 或反射计算域) 。这种 层次关系是递归的,即d 。也可以是另一计算域d n 1 的元级,d n + l 也可以是另一计 算域d n + 2 的基级,依次类推。d n + l 域上关于d 。的计算,称为对d n 的反射_ 。 反射技术的基本理念是将一个系统看成是相互依赖的层次化计算系统,改变 下层的计算逻辑,可以动态地影响上层的计算逻辑。因此,从反射的观点看,一 个计算系统可以看作是由两个分系统构成。基级系统( b a s es y s t e m ) 负责解决从 应用角度描述计算的外部问题,而元系统( m e t a - s y s t e m ) 负责维护有关基级实体 的信息,以及描述基级计算域上的计算如何借助于元实体实现等问题。 反射的关键思想就是访问并修改元系统,以改变其执行动作的方式。由于 对元系统的直接操纵不被允许,所以就有必要建立元系统的一种带有限制的表示 ( 即具化) 元模型( m e t a - m o d e l ) 。元模型可以被访问( 即内省) ,也可以被 修改( 即调解) 。在元模型上所作的任何修改都将在元系统的行为上得到体现( 即 反射) 。整个过程如图2 1 所示。 图2 1 通过对象的元模型描述元系统 反射机制可以用来观察语言或系统的内部行为。由于实现对外部可见,可以 直接插入附加的代码监控实现。这可以用来提供更方便的调试工具,也可用于实 现以下功能,例如性能监控,服务质量监控或计费系统。 反射机制可以用来改变程序或语言的内部行为,这可以通过改变已有特征的 1 2 基于开放编译的c + + 程序静态分析机制 解释或增加新的特征来实现。 采用反射技术后,开发团队只需要一个或几个元层编程人员,用于实现新的 语义或修改语言原有语义以满足其他开发者的要求,而不需要每一个开发者都去 改变语言的语义或引入一套只有他自己明白的结构实体。 当然,反射机制也有一些缺点: 反射不可避免的引起附加的性能开销。附加的代码要求能够给出系统中的行 为的精确解释,有人认为反射本身与此相矛盾。 如果程序员可以开放访问实现,必须确保系统的完整性。一方面需要提供访 问系统的完整表述的途径,另一方面,不受约束的访问会影响语言或系统的完整 性。 2 1 3 反射模型 复杂的软件系统是由许多结构实体组成的。一些物件可以自动从其他物件中 派生出来,比如对象码( o b j e c tc o d e ) 是通过编译源程序得到的;然而,大部分 的物件是相互独立的,即使它们在逻辑上是相关联的,比如设计文档和源代码。 当一些物件被独立管理时,随着时间的流逝,它们之间的联系会逐渐变弱甚至被 中断,也即常说的“漂移( d r i t t ) ”。这种现象的发生既不是因为软件工程师缺乏 对该问题的认识,而是因为维护这些文档间隐含着的逻辑联系既是一个费时、困 难的过程,也是一个人们常认为不太重要的过程。 当软件工程师进行一个新的工作,比如给系统添加一些新特性时,如果发现 该系统的设计文档已经发生了漂移,他可以采取以下几种措施:第一个选择是不 管那些过时的设计文档,而仅仅根据从源文件中获得信息开始工作。此时他对系 统的理解要么基于与工作相关的代码,要么基于系统的某些视图,比如调用图( c a l l g r a p h ) 。这种策略对小系统或许可行,但对由一个团队开发的大系统而言,他所 面对的更普遍的问题要么是遗漏了一些相关代码,要么是根据系统提取出来的视 图太过庞杂而根本无法理解。第二个选择是使用那些非正式的高层模型,最常见 的是笔记本上记录的一些用于理解系统的框图、箭头等。但这些模型基本上与源 代码不符,所以根据它们来理解系统是很冒险的。最后一个选择则是利用一个逆 向工程系统从源代码中获取高层模型。这些模型是对源代码真实的表示,因此是 正确的、有用的。 反射模型( r e f l e c t i o nm o d e l s ) 技术不是通过去除,而是通过探索设计与实现 间发生的漂移现象来帮助软件人员进行软件工程任务。采用这种技术的目标是帮 助软件工程师产生一个足够好的高层结构模型以用于更好的理解他们手头的工 作,而且整个过程不需很长时间。使用该技术的过程如下:首先软件工程师定义 第二章相关理论与技术 1 3 一个他认为合适的高层模型,接着从源代码中抽取( 使用第三方工具) 出一个源 模型( s o u r c em o d e l ) 并且定义两个模型间的映射关系,然后通过计算软件反射模 型判断高层模型哪些地方符合源模型,哪些地方不符合源模型。软件工程师解释 反射模型并在必要的时候修改高层模型、源模型或两者之间的映射关系,以准备 下一次的对反射模型的计算。 虽然反射系统的基本计算原理是相似的,但出于所关心的侧面不同而存在多 种不同的结构,形成了多种反射计算模型。现有的反射模型分成两大类【8 】: 结构反射( s t r u c t u r a lr e f l e c t i o n ) 模型所关心的主要是在实现计算时对类和元 类( m e t a c l a s s ) 的使用。在这种模型中,目标计算域上每个实体都是单个类的实 例,而类则是元类的实例。动态访问和修改元类的实例值,等同于动态访问和修 改目标计算域上相应实体集合中实体的自身表示。元类又可以是元元类的实例, 其自身表示可以用同样的方法来访问和修改。这种模型侧重于对象的结构方面, 以结构的动态变化来间接地反映语义的变化。 计算反射( c o m p u t a t i o n a lr e f l e c t i o n ) 也称为行为反射( b e h a v i o r a lr e f l e c t i o n ) 。 这种模型所依据的事实是使得每个对象有它自己的元对象。元对象的值是对象的 自身表示,显示地表示出对象的结构、处理消息的方法等一些原来是隐含的信息。 元对象还可含有特殊的解释器以及相应环境、延续的值变元,用它们代替母语言 解释器后,可使对象施用的操作产生不同的语义。元对象也可以有元对象,其间 的关系类似于对象与元对象,依次类推。这种模型侧重于对象的行为方面,直接 通过对象与其元对象之间的因果关联来反映语义的变化。 结构反射模型的主要缺陷是混淆了类的内涵。对于实例而言,类是一个有生 成能力的模板,对于元类而言类则又是一个实例,因而容易造成使用者在认识上 的迷惑,以至于不敢使用反射。计算反射模型在这一点上要清晰得多,对象和元 对象只是作用不同,在构造涵义上没有差别。 当需要拦截一个操作,比如方法调用,并修改这个操作的行为时,常使用计 算反射模型。如果一个操作被截获,运行系统的扩展部分( 用于实现计算反射) 会调用元对象上的相应方法,以通知该元对象发生了一个与某个事件对应的操作。 程序员可以定义他们自己版本的元对象,使之按照定制的语义执行被拦截的操作。 行为反射只提供修改程序中操作行为的能力,而没有提供修改程序中数据结构( 这 在编译时就静态决定了) 的能力。因此如果需要修改程序中的数据结构,比如类、 方法和记录的定义时,则常使用结构反射模型。 可见,绝大多数的计算反射都是在运行时完成的,这使得它可以具化一些动 态的计算事件,比如方法调用或实体创建。o p e n c + + 1 0 的m o p 就可以看作是一 个纯粹的行为反射。但在实际中,行为反射总是夹杂着一些运行时的结构反射, 或者为了效率的原因被尽量提前到编译阶段进行。但编译时的行为反射不得不考 1 4 基于开放编译的c + + 程序静态分析机制 虑一些非常专业的编译概念,比如分析树等,而且由于无法利用诸如变量值这样 的运行时信息,编译时的行为反射的能力远不如运行时的强。同样,结构反射虽 然多在编译时进行( 比如本项目使用的o p e n c + + 2 5 ) ,但也可以在运行时进行, 就像c l o s ,s m a l l t a l k 那样。 2 2 开放编译器0 p e n c + + 2 2 10 p e n c + + 简介 o p e n c + + 2 5 2 7 ( 以下简称o p e n c + + ) 是一个典型的开放编译器,它将元对 象协议( m e t a o b j e c tp r o t o c o l ,m o p ) ”引入到c + + 语言的编译过程中,是一种面 向c + + 的源代码转换工具。o p e i l c + + 可被用来实现对c + + 语言的各种扩充,如添 加新的文法、新的符号、新的对象行为等“。所谓开放编译,就是指通过元对象 协议将编译过程向用户开放,用户可以通过元对象协议提供的接口,干预编译过 程。 o p e n c + + 的扩展特征由元程序( m e t a - l e v e lp r o g r a m ) 在编译时指定。元程序 由编程人员按照o p e n c + + m o p 编写。这个接1 3 把编译器的内部结构( 经过面向对 象的抽象) 呈现给编程人员。与普通的c + + 程序一样,元程序其实也是一个c + + 程序。为了有所区别,我们把普通c + + 程序称为基级程序( b a s e l e v e lp r o g r a m ) 。 若没有特别注明,后面提到的源程序、程序等均指基级程序。元程序经。口e n c + + 编译器编译后被( 动态或静态地) 链接到卸e n c + + 编译器上。链接后得到的 o p e n c + + 编译器按照元程序指明的方式对基级程序进行转换或分析。如果没有给 出元程序,o p e n c + + 与普通的c + + - - 样。基级程序被o p e n c + + 根据元程序转换后, 再与运行时支持代码链接( 用于提供基级程序使用的类和函数) ,最终得到可执行程 序。参见图2 2 。 图2 2o p e n c + + 概览 o p e n c + + 是一个用于对c + + 程序进行分析与转换的工具包。如果使用 o p e n c + + 来开发c + + 程序的转换器( t r a n s l a t o r ) 和分析器( a n a l y z e r ) ,用户无需 第二章相关理论与技术 1 5 考虑解析器和类型系统这样的细节。o p e n c + + 还可以为许多其他工具的开发提供 支持。例如用户可以利用o p c n c + + 实现c + + 程序类层次关系的源代码分析器。 2 2 2o p e n c + + 的工作原理 o p c n c + + 编译器的工作过程由三个阶段组成:预处理,从o p c n c + + 到c + + 的 源到源( s o u r c e - t o s o u r c e ) 转换,以及标准c + + 编译器的编译和链接“。e n c + + m o p 是在第二阶段控制转换的接口,指明o p e n c + + 的扩展特征如何转换成普通的 c + + 代码,参见图2 3 。 c + + 预处理器处理后的基级程序,在o p e n c + + 中被分割成许多代码片断。这 些代码片断由元对象转换后,再重新组合成一个完整的c + + 程序。最后郇e i l c + + 将转换后的c + + 程序传递给标准c + + 编译器,比如g n uc + + 。 在e 1 1 c + + 中,代码片断由p t r e e 元对象以分析树的形式表示。虽然元对象与 c + + 中的对象类似,但它们只存在于编译器中,并且代表着基级程序的元状态,因 此称它们为元对象,而不能简单的称为对象。 从在系统中所起的作用看,对象用于满足系统功能性方面的需求,而元对象 则用于满足系统非功能性方面的需求。通过绑定到合适的元对象上,对象可以具 备非功能性方面的能力。 - 。- - - - i i 代码片断( 二二) 元对象 i 代码片断 ( 一 、) 元对象 l ,一一j 图2 3o p e n c + + 的t 作原理 2 2 3o p e n c + + 对静态解析的支持 0 p e l l c + + 没有提供可直接获取c + + 程序静态信息的接口。分析o p e i l c + + 对源 程序进行解析( p a r s i n g ) 和转换( t r a n s l a t i o n ) 的过程后发现:通过在其转换路径 上的一些关键点上添加代码,我们可以实现获取静态信息这一功能。 o p e i l c + + 读入一个源文件后,逐段逐段的对其扫描。这里的段( f r a g m e n t ) 是 按声明( d e c l a r a t i o n ) 区分的。o p e i l c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育机器人助力学生综合素质培养的实践
- 福建省莆田市第四中学2024-2025学年高二下学期期中考试物理试题(含解析)
- 2024-2025学年度第二学期八年级物理期末模拟试题(一)
- 孩子成功的关键教育心理学的情绪智能教学应用
- 探索教育数据的隐私保护问题
- 新型理血药行业深度调研及发展项目商业计划书
- 童话世界摄影基地企业制定与实施新质生产力项目商业计划书
- 传动装置智能制造评估创新创业项目商业计划书
- 国际媒体考察团行业深度调研及发展项目商业计划书
- 乡村自行车道行业跨境出海项目商业计划书
- 2024年西昌市教育和体育局考核聘用公立幼儿园教师真题
- 2025设备租赁合同版本范文
- 2025年浙江杭州钱塘区和达能源有限公司招聘笔试冲刺题(带答案解析)
- 2025年衣物清洁多元化发展趋势白皮书-天猫家清第一财经商业数据中心
- 冷链物流园建设项目投融资与财务方案
- 保险业务员分级考试试题及答案
- 2024统编版七年级道德与法治下册期末测试卷(含答案)
- 酒店经销商合同协议书
- 转让钓场合同协议书
- 医院感染教学课件
- 某市人民医院装修工程项目可行性研究报告
评论
0/150
提交评论