(计算机应用技术专业论文)程序理解中文档生成技术的研究.pdf_第1页
(计算机应用技术专业论文)程序理解中文档生成技术的研究.pdf_第2页
(计算机应用技术专业论文)程序理解中文档生成技术的研究.pdf_第3页
(计算机应用技术专业论文)程序理解中文档生成技术的研究.pdf_第4页
(计算机应用技术专业论文)程序理解中文档生成技术的研究.pdf_第5页
已阅读5页,还剩56页未读 继续免费阅读

(计算机应用技术专业论文)程序理解中文档生成技术的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浙江工业大学硕士学位论文 程序理解中文档生成技术的研究 摘要 随着软件产业的迅速发展,软件维护成为软件产业面l l 缶的重要课题,理解并修改软件 是软件维护的核心。程序代码的规模和复杂性使得程序理解成为软件维护中代价最高的部 分,软件文档可以有效地辅助软件理解。但在实际中,文档缺失、过时、不完整以及存在 错误等情况广泛存在【1 - 6 1 ,因此研究使用逆向工程技术实现文档自动生成具有研究价值和研 究意义。 论文首先论述了程序理解、逆向工程的概念以及与文档生成相关的研究工作、理论、 技术等。在已有研究的基础上,提出了一种文档生成系统的设计思想,并对信息存储以及 图形文档的存储格式等进行了研究。论文主要内容包括:( 1 ) 文档生成系统的设计。支持 不同抽象层次的文档的生成。生成的文档主要包括文本文档以及u 札类图、函数流程图、 源代码视图和软件度量图等图形文档。( 2 ) 信息存储。语法分析器抽取的信息以g x l 格式 存储,支持不同的逆向工程工具的信息交互。( 3 ) 图形的表示。以s v g 格式表示图形,能 够支持复杂图形的浏览,并能有效减少存储空间。 关键词:程序理解,逆向工程,信息存储,文档生成 浙江工业大学硕士学位论文 r e s e a r c ho nd o c u m e n t a t i o n g e n e r a l t i o nt e c h n o l o g y 矾p r o g r _ u 讧u n d e r s t a n d i n g w i t ht h er a p i dd e v e l o p m e n to fs o f t w a r ei n d u s t r y ,m a i n t e n a n c eb e c o m e sa ni m p o r t a n tt o p i c u n d e r s t a n d i n ga n dm o d i f y i n gi s t h ec o r eo fs o f t w a r em a i n t e n a n c e p r o g r a mu n d e r s t a n d i n g b e c o m e st h em o s tc o s t l yp a r to fs o f t w a r em a i n t e n a n c eb yf a c t o r ss u c ha ss i z ea n dc o m p l e x i t yo f t h ep r o g r a m d o c u m e n t a t i o nc a ne f f e c t i v e l ya s s i s tt h es o f t w a r ee n g i n e e r st ou n d e r s t a n dt h e p r o g r a m h o w e v e r ,d o c u m e n t a t i o ni so f t e na b s e n t , o u t d a t e d , i n c o m p l e t eo rc o n t a i nm i s t a k e si n p l - a l :t i c e t h es t u d yo ni m p l e m e n t i n gd o c u m e n t a t i o na u t o m a t i cg e n e r a t i o nh a sr e s e a r c hv a l u e s a n ds i g n i f i c a n c e t h i sp a p e rs t a r t sw i t ht h ec o n c e p t so f p r o g r a mu n d e r s t a n d i n ga n dr e v e r s ee n g i n e e r i n g t h e r e l a t e dr e s e a r c hw o r k , t h e o r i e sa n dt e c h n o l o g i e sc o r r e s p o n d i n gt od o c u m e n t a t i o na u t o m a t i c g e n e r a t i o ni s r e v i e w e d b a s e do i lt h er e s e a r c h e r s w o r k , a na p p r o a c ho nt h ed e s i g no f d o c u m e n t a t i o ng e n e r a t i o ns y s t e mi sp r e s e n t e d i n f o r m a t i o ns t o r a g ea n dt h ef o r m a to fg r a p h i c a l d o c u m e n t sa r ea n a l y z e dt h ec o n t e n to ft h i sp a p e ri n c l u d e s :( 1 ) t h ed e s i g no fd o c u m e n t a t i o n g e n e r a t i o ns y s t e m g e n e r a t i n gd o c u m e n t sa tv a r i o u sa b s t r a c tl e v e l si se n a b l e d ( 2 ) i n f o r m a t i o n s t o r a g e t h ei n f o r m a t i o ne x t r a c t e db yt h ep a r s e ri ss t o r e di ng x l f o r m a t ,w h i c hs u p p o r t st h e i n f o r m a t i o ne x c h a n g i n gb e t x v e , e nd i f f e r e n tr e v e r s ee n g i n e e r i n gt o o l s ( 3 ) r e p r e s e n t a t i o no f g r a p h s g r a p h sa r er e p r e s e n t e di ns v g ,w h i c hc a na i dt h ee x p l o r i n go fc o m p l e xg r a p h sa n d r e d u c es t o r a g es p a c e k e yw o r d s :p r o g r a mu n d e r s t a n d i n g , r e v e r s ee n g i n e e r i n g , i n f o r m a t i o ns t o r a g e , 浙江工业大学硕士学位论文 浙江工业大学 学位论文原创性声明 本人郑重声明:所提交的学位论文是本人在导师的指导下,独立进行研究工作 所取得的研究成果。除文中已经加以标注引用的内容外,本论文不包含其他个人或 集体己经发表或撰写过的研究成果,也不含为获得浙江工业大学或其它教育机构的 学位证书而使用过的材料。对本文的研究作出重要贡献的个人和集体,均己在文中 以明确方式标明。本人承担本声明的法律责任。 作者签名:王粕嗜日期:z 口严2 月彳日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留 并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本 人授权浙江工业大学可以将本学位论文的全部或部分内容编入有关数据库进行检 索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 本学位论文属于 l 、保密口,在年解密后适用本授权书。 2 、不保密口。 ( 请在以上相应方框内打叫,) 作者签名: 导师签名: 日期:7 年1 2 月“日 日期:2 夕年7 z 月功日 踣1 士f 一 王七 浙江工业大学硕士学位论文 第1 章绪论 1 1 研究的目的和意义 在软件产业迅速发展的情况下,越来越多大型复杂的软件投入开发和使用,随之而来, 软件维护问题逐渐成为当前软件产业面临的重要课题,不仅历史上的遗产软件需要维护, 而且当前应用或开发中的软件也将成为今后维护的主要对象,而正确地理解软件是软件维 护的前提。此外,在软件开发的过程中经常用到第三方软件,也需要理解现有的软件。 通常,软件开发更多地需要对随时间演化的遗产软件系统进行理解和二次开发,而不 是从零开始开发新的软件,这就需要开发人员能够充分理解遗产软件系统。这一理解工作 对于遗产软件原先的开发者和新接触的开发者而言,任务都是艰巨的,需要花费大量的时 间和精力理解程序代码,结果使得维护任务变得困难、代价高且易于发生错误【7 】。研究显 示,在软件维护上投入的成本的比例从1 9 7 7 年的4 9 迅速上升,到1 9 9 5 年超过9 0 【4 】, 软件工程师至少有5 0 的时间是用于理解现有系统的【鄹,提高理解效率的最良好和可行的 方法是软件逆向工程【9 】。 在理解一个程序的过程中,高质量的文档有助于程序员快速准确地理解程序,提高开 发和维护工作的效率,在程序理解中起到关键作用。在没有软件文档的情况下,唯一可靠 的信息是源代码【1 1o 1 。对于软件系统,尤其是大型遗产软件系统而言,代码行数往往达 到数百万,由于规模庞大,仅仅借助源代码理解复杂的系统不仅费时,而且容易出现错误 f 1 ,因此是不可行的。但与此同时,在实际中由于多种原因,文档缺失、过时、不完整或 者存在错误等情况广泛存在。而人工编写文档是不仅费时,而且容易出现文档内容和源代 码不一致的情况。通过逆向工程技术实现软件文档的自动生成是解决上述问题的一个有效 途径。 因此,研究如何应用逆向工程技术实现文档自动生成,以支持程序理解,辅助程序员 快速准确地理解程序,对于有效降低软件的开发和维护成本具有研究价值和研究意义。 1 2 国外研究现状 1 2 1 文档生成研究进展 为了有效地辅助程序理解,降低软件维护成本,国外对文档生成技术进行了大量研究, 1 - 浙江工业大学硕士学位论文 这些研究可以分为三个主要的方面:系统的构建、文档的设计和不同文档之间的集成。 m i c h a e lh a n u s 提出了一种用c u r r y 语言实现的c u r r y 文档生成系统c u n y d o c 1 2 ,c u r r y 是一种声明的多范性( d e c l a r a t i v em u l t i - p a r a d i g m ) 语言,通过合并注释和从源代码中抽取的 信息生成h t m l 格式的文档。与类似的文档生成工具相比,c u r r y d o c 进行了扩展,可以将 通过分析程序的结构所获得的信息和程序近似运行时行为信息加入文档。 c h r i s t i a n od eo l i v e i r ab r a g a 等人提出了一种基于逆向工程策略的文档生成系统 d o c u m o n t u 的体系结构 1 3 o d o c l m n e n t u 可以分析添加注释的以及未添加注释的c c + + 代码, 信息提取采用d r a c o - p u c 的转换功能,信息格式化由基于库的c a s e 工具t a l i s m a n 实现, 可以生成h t m l 格式的文档。 m m 加等人提出了一种基于x m l 的文档集成方法【“,使用了由m s r 定义的一种 d t d ,以集成原有的文档和新创建的工件( a r t i f a c t s ) 。该系统由数据收集、知识处理和发布 三个过程组成。收集的数据内容包括源代码中提取的信息、存在的文档和用户输入。通过 对数据库进行半自动化操作,寻找包含在收集的数据中的重要信息,最后以图形和文本的 方式发布基于x m l 的信息。d o n a l dm l e s l i e 提出了类似的利用x m l 和j a v a d o c 2 3 】生成 a p i 文档的方法【1 4 】,通过x m l 集成文档。进行文档集成的原因是:( 1 ) 软件文档具有不同 的用户,例如开发人员、测试人员和工程管理人员等,这些不同的用户可能会要求不同抽 象级别的文档。( 2 ) 软件文档可以有不同的作者,分别按照自己的方式和方法描述自己的思, 想。( 3 ) 软件工程师经常在不同的抽象级上工作,根据系统说明实现要求的功能,对系统进 行验证和测试,所以对于不同的工程任务,软件工程师对相同的工件有不同的理解。所以, 为了理解整个系统,应当集成所有可获得的文档集,获取分散在不同文档中的信息资源。 a n k ew e b e r 等人提出了l i v ed o c u m e n t s 的概念,可以实现文档的动态交互1 1 5 】,l i v e d o c u m e n t s 需要满足的8 个条件是:含有一个状态( s t a t e ) ;状态自动管理;支持重用: 对表示智能地适应;对读者智能地适应;支持高级可视化:支持上下文搜索和导 航;支持脚本( s c r i p t i n g ) 。具有上下文的、数据驱动信息组件的l i v ed o c u m e n t s 具有的特 点有:数据驱动、交互和以采纳为中一f i , ( a d o p t i o n - c e n t r i c ) 等。 为了解决现有的程序理解方法不支持早期不提供类型定义的弱类型语言( 如c o b o l 等) 的问题,a r i ev a nd e u r s e n 和l e o nm o o n e n 实现了一种基于类型的工具t y p e e x p l o r e r , 能够从c o b o l 源代码中推断出类型信息,从而实现c o b o l 遗产系统浏览i 刀。 a r i ev a l ld e n r s e n 和t o b i a sk u l p c r s 提出了一种岛屿文法( i s l a n dg r a m m c r ) 以简化文档生 成器的构建,只需要定义文档所需要的语法结构 i q 。 浙江工业大学硕士学位论文 v i c t o r l 乙b a s i l i 和h a r l a n d m i l l s 提出了一种理解软件的同时对理解进行文档编制的思 想【r 丌。 诅, a db e s z 2 d e s 、r u d o l f f e r e n c 七和t i b o ro y i m 6 t h y 在文献【婀中提出了种逆向工程工 具c o l u m b u s 的体系结构,c o l u m b u s 提取信息的过程分为5 个步骤:获取工程,配置信息、 分析源代码一创建模式实例、链接模式实例、过滤模式实例以及处理模式实例,这些步骤 可以增量式地执行。c o l u m b u s 逆向工程环境支持的数据转换包括:p p m l 、c p p m l 、g x l 、 u m lx m i 、f a m i x ) 0 讧i 、r s f 以及h t m l 文档,能够很好地支持与逆向工程工具和再工 程工具之间的互操作性。 此外,u t c h t 大学的r b v e r m a a s 1 明设计了一种可扩展的文档生成系统,以解决面向 一种语言的文档生成系统不能分析其他语言的不足的问题,并且能够增加新的信息可视化 方法和文档注释语法。 1 2 2 现有的典型文档生成系统 除了研究工作之夕 ,在实际中还存在一些具有不同特点的文档生成系统,以下是具有 一定代表性的软件系统。 1 m g i t z 0 1 是可扩展、可裁减的著名的逆向工程环境,有1 0 年的历史,主要由3 部分 组成:r i g i r e v 渊( 程序静态信息解析器,支持c 怒h 和c o b o l 等语言k 硒g i s e r v e r ( 程序 静态信息库,用于存储从源代码提取的信息) :鼬g i e d i “交互式的窗口图形编辑器,以图形 交互方式展示和操纵程序静态信息) 口1 1 。r i g i 能够生成l i v ed o o m l e n t s 图形文档。 2 t m a g i x4 d z 2 是c ,c + + 程序的静态理解工具,可以提供多层次的视图,以表示从高 层设计到实现的细节、类和函数的依赖关系等。t m a g i x4 d 以三维图形的形式展示关键信 息,使得用户的注意力集中在回答特定问题的视图上。i m a g i x 4 d 提供了产生大量视图的能 力以及从源代码生成文档的能力,它提供的交互式询问功能对迅速理解程序很有帮助f 2 l 】。 3 j a v a d o c 2 3 】是s u n 公司在其n e t b e a ni d e 中内嵌的文档自动生成工具,是j a v a 开发 平台的一部分。j a v a d o c 使用j a v a 编译器扫描j a v a 源文件集,从源代码中的d o c 注释生成 类似于j a v aa p id o c u m e n t 的h t m l 格式的a p i 文档。生成的文档的信息包括j a v a 包、接 口、类、类成员以及类之间的继承关系。j a v a d o c 将软件包名或源文件列表当成一个变量, 根据以 开头的标记创建h t m l 文件,这些标注用于在h t m l 文件中创建链接。 j a v a 有三种添加注释的方法:( 1 ) ,对一行迸行注释。( 2 犷,对若干行进行注释。 ( 3 矿,对若干行进行注释,并将该注释内容写入j a v a d o c 文档。第三种注释方法为 浙江工业大学硕士学位论文 j a v a d o c 约定的注释方法,j a v a d o e 根据注释以及标记生成文档,此外应用h t m l 标志如 q 、q ;r 和 等可以更好地进行文档格式捧版。j a v a d o c 生成的文档示意图如图 1 1 所示: 图1 - 1j a v a d o c 文档示意图 4 d o x y g e n 洲是一种开源的,跨平台的文档生成系统。由荷兰人d i m “r iv a i lh e e s e k 开发,在g n u 公共许可i 正( g p l ) 下发布,目前已经成为各主要的l i n u x 发行版的附带组件。 d o x y g e n 支持的语言有c 阡、c 、j a v a 、o b j e e t i v e - c 、p y t h o n 、和i d l ,并在一定程度上支 持p h p 、c # 和d 。d o x y g e n 生成的文档格式有:h t m l ,l a t e x ,r t f ( m s - w o r d ) ,p o s t s c r i p t , p d f ,压缩h t m l 和u n i xm a l l 。并且支持类层次图、类继承图、依赖图、调用图和合作 图的生成,此外生成的文档可用三十多种语言显示。d o x y g e n 的文档注释方法分为详细和 简约两种,d o x y g e n 可以根据注释生成文档,如果文档中没有注释,d o x y g e n 生成其他类 型的文档。 5 c c d o c 【捌通过分析c + + 头文件程序,生成h i 飞4 l 格式的a p i 文档,以协助软件包的 用户与软件包的开发者之间的合作,设计思想与j a v a d o c 类似。用户可以在命令行指定输 出文档的风格,例如背景、字体和颜色等。 6 c p p d t 捌根据源代码和嵌入的特殊注释生成关于c 十+ 类的h t m l 文档,生成的文 档和j a v a d o e 类似。c p p d o e 支持j a v a d o cm g s ,例如 嘞,国e t u r n 等。文档注释可选,如 果省略,c p p d e c 将生成基于类关系和层次的文档。c p p d o c 生成的文档如图1 2 所示: 浙江工业大学硕士学位论文 鲤g 虹h o j - tc m - i _ 班e ! e ! 缝酶 - l 日- h i e r a r c h yf o r 1 1p r o j e c t s f x e j h t i r t m - : 鲍 c l a s sh i e r a r c h y 鱼堑! _ 地型 d 盟! e ! g c l u 竖粤匹! ;z 翌 o n z t i e v p z e j tc 1 - - l 吐i i i ! 曩g 型氇垒瞳鱼缸 日皿l 图i - 2c p p d o c 文档示意图 c p p d o c 能够以树形图的形式显示工程层次图和类层次图,文档包含的信息有:类、工 程、树和索引等,可以按照字母顺序显示所有的变量、函数、类及其说明。 7 d o c + 一2 7 】支持c 、c + + 、i d l 和j a v a 语言,可以从c c - h i d l 的头文件,源文件或者 j a v a 类文件中直接提取注释信息,生成l a t e x 和h 恤l 格式的文档输出。 8 c c r i d c r 【捌是w e s t e r n w a r e s 公司开发的c c + + 代码可视化和文档生成工具,以帮助 程序员更好地理解程序的结构。除了支持文档生成外,c c r i d e r 支持程序的可视化浏览, 例如程序的类、函数、变量、字符串、注释和模板等信息。c c r i d e r 生成的文档的格式包 括r t f ,g r a p h i cw a l ls i z ec h a r t s ,h t m l ,w m h e l p 和文本文档。 9 u n c l - r s t a n df o rc + 一3 l 】是s c i e n f i f i c t o o l w o r k s 开发的能够生成文档的逆向工程工具。 u n d e r s t a n df o rc - 卜十具有代码导航功能,应用了交叉索引,编辑器可以进行语法着色。支持 i 溘rc ,a n s ic 或者c + + 源代码,并支持混合的c 和c + + 代码。u n d e r s t a n df o rc + + 生成 的文档的内容包括提取的注释信息、代码行数和空行数等。对于大型的工程,需要很长的 一段时间生成文档,用暂停功能可以暂停文档的生成。 其他类似的工具还有h a p p y d o c | 2 明和p h p d o c 【2 9 1 等,h a p p y d o c 是一个用来从p y t h o n 源 代码中提取文档的工具。和其他应用程序的不同之处在于。h a p p y d o c 不直接导入模块,而 是使用分析树作为模块得到文档输出所需的信息,所以支持用户根据需要导入特定上下文 的模块生成文档。p h p d o c 是将j a v a d o c 设计思想应用到p h p 语言的工具,用p h i 语言实 现,为面向对象和过程的代码生成a p i 文档。 这些不同的文档生成工具可以从生成文档的抽象层次上分为不同的两类:i n - t h e 1 a r g e 和i n - t h e s m a l l t l 9 1 。i n - t h e s m a l l 类的文档生成工具的核心是实现文档自动生成,典型的工具 有:j a v a d o c 和d o x y g e n 等,这一类工具生成的文档更适合于描述小型软件的底层信息, 浙江工业大学硕士学位论文 而对于大型的遗产系统,则需要使用能够生成高层抽象信息的i n - t h e l a r g e 类的文档工具, 典型的i n - t h e - l a r g e 类型的工具有r i g i 和i m a g i x4 d 等,这类工具通过表示系统的模块、子 系统以及这些模块和子系统的组织方式,从体系结构层描述软件系统的信息。 1 3 国内研究现状 国内在逆向工程和文档生成这一领域进行了很多研究工作。 。 南京大学于2 0 0 1 年设计了o o p s e 3 2 1 ,o o p s e 是一个( 十忉啪程序分析系统。它首 先利用程序切片技术、度量和统计技术以及波动分析技术分别对c 州j a v a 源程序进行粗粒 度切片和分层切片、度量分析、统计分析以及波动效果分析等。能够生成类层次图、程序 调用图以及过程问控制流图。 北京大学于2 0 0 0 年设计了青鸟型系统,其中j b p a s a 4 3 3 】是青鸟型系统的逆向 工程组成部分,j b p a s - c + + 支持c c + + 语言和w m d o w s 平台,能够生成o o i ) ( o b j e c t - o r i e n t e d d e s i g n ) 文档和r o s e 文档。 北京工业大学蒋强荣针对将l a n 系统升级为w a n 系统过程中遇到的文档不完整和不 一致的问题,设计实现了一个由信息抽取、信息转换和信息抽象三个部分组成的文档生成 系统【蚓,该文档生成系统能够分析c + + 代码,生成的文档以文字和图形两种方式表示源程 序中类的继承关系和文件包含关系,类继承关系图用u m l 表示。 哈尔滨工业大学李东对在软件维护中应用逆向工程技术作了研究,提出了由s p r t 、 o o p r t 和辅助工具组成的逆向工程r e t ,其中s p r t 用p a d 图描述源程序,o o p r t 生成 对象关系图( o r d ,o b j e c tr e l a t i o nd i a g r a m ) ,以实现程序理解、软件认证、辅助测试以及 保持程序与文档的一致性等垌。 东南大学李必信等人提出了一种基于类层次图的分析面向对象程序的框架 o o a f ( o b j e c t - o r i e n t e da n a l y m gf r a m e w o r k ) t 阚。该框架具有的功能有:利用路径等价技术 识别子对象;利用子对象进行可见方法和主导方法的确定;结合确定的可见方法和类 层次图建立可见方法类层次图:在v m c h g 的基础上计算继承集和改写集,确定某个 方法的改写边界;构造虚函数调用图解决虚函数调用模型化问题。 此外,浙江大掣9 1 、西安电子科技大学【2 “、西北工业大学【3 刀等研究机构和人员也在 程序理解和逆向工程这一领域进行了研究工作。 逆向工程和文档生成密切相关,逆向工程技术的研究成果对于文档生成研究也有一定 的借鉴意义。 浙江工业大学硕士学位论文 1 4 研究的内容和目标 由于实际中多种因素的影响,使得程序理解是一个复杂而困难的任务,通过逆向工程 技术可以有效地辅助软件工程师理解程序,减少所需的时间和精力。 通常可以从两个方面应用逆向工程技术以辅助程序理解:( 1 ) 源代码浏览和信息导航: 典型的系统如s o u r c ei n s i g h t _ 【3 明和k s c o p e 3 9 】等,这类工具能够通过分析存储在信息库中的 源代码,提供源代码语法高亮显示、交叉索引、变量列表等功能,方便软件工程师浏览源 代码,通过信息导航的方式支持软件工程师理解程序。( 2 ) 信息可视化:典型的系统有r i g i 等,可以通过对信息库中的信息进行抽象,应用软件可视化技术提供关于系统信息的文档, 例如函数调用图、u m l 图、体系结构图以及文本文档等,通过可视化源代码信息的方式支 持程序理解。 本文的研究内容是通过可视化软件系统信息的方法,生成文档支持程序理解,具体如 下: 1 文档生成系统框架:设计一种文档生成系统体系结构,能够支持不同格式和抽象层 次的文档的生成。 2 信息的存储:信息的存储结构可以支持多种不同的数据类型,便于对数据进行操作。 3 文档的生成:可以生成不同形式和不同抽象层次的文档,图形的格式支持复杂图形 的浏览。 1 5 论文的组织结构 论文组织如下: 第一章绪论。论述了软件文档生成研究的背景和意义、国内外研究现状以及论文的研 究内容和目标。 第二章程序理解的文档生成技术基础研究。论述了程序理解、逆向工程、软件文档以 及相关概念和技术。 第三章文档生成系统研究。研究了文档生成系统的整体设计,以及信息抽取、存储和 可视化等。 第四章文档生成的实现研究。研究了如何根据信息库中存储的信息格式生成不同类型 的文档,包括函数流程图、源代码视图、u m l 类图以及软件度量图。 第五章总结和展望。总结论文所做的工作,对课题进行展望。 7 浙江工业大学硕士学位论文 第2 章程序理解的文档生成技术基础研究 2 1 程序理解 程序理解( p r o g r a mc o m p r e h e n s i o n 或p r o g r a mu n d e r s t a n d i n g ) 对于软件维护具有重要 意义,这一研究领域逐渐受到广泛重视。以下是几种关于程序理解的定义【柏1 : 程序理解是应用已有的知识获取新的知识,最终实现代码认知的过程。 程序理解是通过分析、抽象和综合( g e n e r a l i z a t i o n ) 获得软件工件( a r t i f a c t ) 的知识 的推理的过程。 程序理解是全部或者部分地从源代码中捕获系统抽象设计信息。 程序理解是获得关于计算机程序的知识的过程。 2 1 1 影响程序理解的因素 实际中的多种因素决定了程序理解是一个困难的任务,文献 4 2 1 论述了影响程序理解的 一些因素: 1 待解决的问题:如果问题域本身较为复杂,则会加大程序理解的难度。 2 程序的规模:对于大型程序,程序的规模必然会影响程序的可理解性 3 控制结构的使用方式:如标识符数量、语句数量、分支的数量以及标识符是否有意 义都会影响程序理解。 4 代码缩进:恰当的缩进可以增加程序的可理解性,但是过度的缩进和缺少缩进一样 会降低程序的可理解性。通常缩进两个到四个空格对理解有积极的影响。此外,良好的注 释也对程序理解具有重要价值。 5 编程风格:大型程序一般是由多个程序员合作开发完成的,编程风格是否一致会影 响程序理解。 6 软件维护的方式:软件维护的方式和方法会影响软件的可理解性。通常由于软件维 护者工作量大而且时间有限,使得软件维护的任务成为危机驱动的( c r i s i s - d r i v e n ) ,这样维 护者倾向于修改最直观的代码,而不是寻找简单有效的解决方案。此外,维护者往往对程 序缺乏充分了解,在维护的过程中只增加新的代码,而较少删除旧的代码,使得代码的规 模和复杂性逐渐增加,进一步降低了程序的可理解性。 s 浙江工业大学硕士学位论文 7 人的理解能力:当理解一个程序时,一个非常重要的约束因素是当事物超过一定的 等级和规模时,会超出人的理解能力。 此外程序是逻辑化的层次结构,编译器能够生成程序的语法层次结构,生成程序的逻 辑层次即弱表示( p o o rr e p r e s e n t a t i o n ) 贝l j 存在一定的难度。以上多种原因都会影响程序的可理 解性。 文献【删论述了构成程序认知复杂的三个因素:要理解的信息量、信息的可访问性和信 息的结构。首先,随着程序规模的增加,程序中的模块或者函数可能大量增加,使得要理 解的信息量显著增加。其次,在使用多种分治法将程序划分为若干程序块之后,程序中特 定代码的上下文信息会分散到多个源文件中,因此会阻碍信息的可访问性。此外信息结构 的复杂化也影响程序理解,例如在面向对象编程中,程序若干类之间复杂的语法和语义交 互使得程序难于理解。 文献【3 刀将程序理解的困难原因概括为必须寻求实现以下两类事物相互转换的方法: 1 从某个应用领域内抽取出的问题和在程序设计领域内用某种编程语言编写的实现问 题解决方案的程序。 2 抽象世界的高层描述和具体世界的计算机编程以及计算机的物理特性。 3 实际系统的非集成的、零碎的结构和希望得到的对系统连贯一致的、高度结构化的 描述。 4 人类所认知的关系复杂的世界和对于程序来说的层状世界。 5 白底向上的源代码分析方法和自顶向下的应用描述合成方法。 2 1 2 程序理解认知模型 对理解程序的认知过程的研究有助于寻找程序理解的方法,基于这些研究,提出了 许多相应的模型。程序理解模型侧重点各不相同,但基本结构都由四个部分组成【4 l 】: 知识库,程序员在理解程序之前已有的知识,例如对该域的理解、与该域相关的信息以及 编码标准等。智力模型( m e n t a lm o d e l ) 。外部表示,程序员在理解程序代码的过程中 可以获得的辅助程序理解的外部视图,例如系统文档、源代码、问题域专家的建议等。 消化吸收过程( a s s i m i l a t i o np r o c e s s ) ,程序理解模型如图2 1 所示。 浙江工业大学硕士学位论文 图2 1 程序理解模型组成部分1 4 1 】 理解是建立智力模型( m e n t a lm o d e l ) 的过程,智力模型说明了文本中的对象以及它们 之间的相互关系,代表了软件系统在不同层次的抽象,范围包括代码模型( 如系统的主要 组件和它们之间的相互关系) 和潜在的应用域( 如系统执行的任务) 。软件工程师在系统维 护、演化和再工程的过程中需要应用这些模型幻 文献l 钟】论述了如下几种认知模型: 1 s h u c i d e r m a n 模型,其智力模型称为内部语义结构,根据s c l m e i d e r m a n 模型,程序 理解是根据语法知识和语义知识从源代码建立内部语义结构的自底向上的过程。理解由三 层组成:底层的逐行理解;中间层的数据结构和算法理解;高层的全局系统理解。语法知 识主要应用于中间层和底层的理解,语义知识主要应用于高层理解。理解过程是从底层逐 渐到高层的过程。s h n e i d e r m a n 程序理解模型如图2 - 2 所示。 浙江工业大学硕士学位论文 - - - - 一- - - - - - - _ - - - - - - - _ - - 图2 - 2s h n e i d e r m a a 理解模型【4 2 】 2 b r o o k s 模型,根据b r o o k s 模型基本思想,编程是一个通过建立映射以连接应用程 序域( a p p l i c a t i o nd o m a i n ) 和编程域( p r o g r a m n l i n gd o m a i n ) 的过程,二者之间可能存在中间域, 所以映射实质上是一个多层结构。基于该假设,当成功地恢复了不同域的模型问的映射时, 就获得了对该程序的理解。恢复是迭代的过程,主要的认知活动是提出假设并对该假设进 行验证。首先对程序目标提出假设,对于大型程序,可以提出一些子假设,这些假设组织 为一棵树的形式,程序理解者对该假设树进行深度优先遍历,直到发现一个可证实的假设, 此假设以后可以用来验证更高层的假设。如果假设被证实为假,则回溯,产生新的假设并 重新验证,重复该过程直到能够证实或否定主要的假设。b r o o k s 理解模型如图2 3 所示。 内部语义i 程序i i 引 有效记忆 t 高层 概念 l :一l 期记l卜+ | _ 问题l i 程序i l 语句l 底层 细节 长期记t乙 设计活动 高层概念 知 ! 由 l 识 库 理解活动 lp l l c i i 其他 雇层细节 语义知识语法知识 浙江工业大学硕士学位论文 在b r o o k s 模型中,标识( b e a c o n ) 是一个重要的概念,它是验证过程中的主要载体,描 述了能够说明某个结构或者操作存在的细节信息。标识通常是源代码的细节。 3 s o l o w a y 模型,s o l o w a y 模型是典型的自顶向下的模型,根据理解目标寻找实现该 目标的计划( p l y n ) 。计划是指实现目标的方法。例如,如果目标是对一个数组排序,那么计 划可以是冒泡排序或者快速排序。计划通常独立于语言,使用灿表示知识的方法表示。 所以s o l o w a y 模型的智力模型是目标和计划的匹配,主要的认知行为是计划识别( p l a n t o g n i t i o n ) 。辅助识别的知识有两类:关于计划的知识和编程论述( p r o g r a m m i n gd i s c o u r s e ) 的规则。该模型使用的计划有分为三类:战略( s t r a t e g i c ) 、策略( t m i c a t ) 以及实现 ( i m p l e m e n t a t i o n ) 。战略计划通常与程序体系结构相关,是最抽象的全局计划。策略计划与 语言无关,目标是解决类似于捧序和搜索的具体问题。实现计划与语言相关,用于实现策 略计划。 此外,其他的程序理解模型还有l e t o v s k 7 模型、p 印n i n g 啪模型以及综合模型等,文 献1 4 2 】作了相应的介绍。 2 1 3 程序理解的方法 理解是增量式的过程,软件工程师通过研究系统的不同方面( a s p e c t s ) 逐渐积累所需知 1 2 浙江工业大学硕士学位论文 识,应用理解策略以辅助信息管理并完成特殊的理解任务。 文献i g 概述了以下三种主要的程序理解方法,这些方法体现了程序理解中的认知模型 的思想。 1 自顶向下:重建从问题域到编程域的映射。重建是一种期望驱动的过程,理解从一 些预先存在的关于系统功能的假设开始。软件工程师分析这些功能是否存在,是否应当被 摒弃还是层次化地提取。 2 自底向上:从源代码开始理解,使用定量分块( c h u n k i n g ) 和概念分配( c o n c e p t a s s i g n m e n t ) 构建更高层的抽象。定量分块从底层结构创建高层抽象。当识别出了高层的结 构后,这些结构替换更详细的底层抽象,因此有助于克服当人的记忆面对太多信息片段时 的局限性。 3 自顶向下和自的向上的组合:根据该理论,程序员在自顶向下和自底向上两种方法 之间切换,同时应用这两种方法以创建软件系统的智力表示。 文献【4 5 】论述了如下7 种程序理解方法: 1 工程法:利用工程的方法来进行程序理解。工程法包括正向工程、递向工程、再结 构、再用工程以及软件再工程的方法等。 2 程序切片法:程序切片( p r o g r a ms f i c i n g ) 是根据控制流和数据流分析而引进的一种程 序分析技术。包括语句切片、无定型切片、过程问和过程内切片以及面向对象切片方法等。 3 格局识别法:维护人员必须在改正、加强和再工程程序之前找到相关代码,通常是 适合某种模式的代码。模式是一种结构或行为,依赖于寻找有特定语法结构的代码,还是 与程序执行有关的特定数据流、控制流或动态相关的代码。为定位这种模式需要一种更接 近软件工程师智力模型的搜寻机制( 而不是一般的程序分析工具) ,这种机制称为格局识别 ( p 6 nr e c o g n i t i o n ) 。 4 概念赋值和概念分析法:概念赋值( c o n c e p ta s s i g n m e n t ) 是发现面向人类的概念中的 问题,并把它们赋值给它们在软件系统内部的实现实例。概念赋值是在用户终端应用语义 层的模式匹配,是一个在源代码内重新识别概念,并通过联系可识别概念及对应程序来建 立程序的一种理解的过程。概念分析( c o n c e p ta n a l y s i s ) 把任何对象和属性之问的关系转换成 一个完全的概念格,可通过代数含义来研究这些概念格,并且利用概念格能够很成功地研 究初始关系的特性和结构的本质。 5 模式匹配法:模式匹配是在不同的抽象层次上对程序的各种模式进行匹配的过程。 软件理解技术按如下递增抽象形式考虑源代码:粗糙文本、预处理文本、词汇标志、语法 浙江工业大学硕士学位论文 树、带符号表的注解抽象语法树、控制流傲据流图、程序格局、构筑风范描述和概念模型 等。对不同的用户和不同的软件理解目的来说必须进行不同层次的分析。用基于语法、语 义和概念模式匹配的逆向工程理解方法能够加强对程序的理解。 6 程序分析法:程序分析包括静态程序分析和动态程序分析两种:静态程序分析无 需执行主题程序而只是根据一些模型推断程序本质结果的过程。静态程序分析包括语法分 析、类型检查和推理、控制和数据流分析、结构化分析、交叉引用、复杂度度量等过程: 动态程序分析是在一个主题系统中发现运行时依赖的过程。它包括对象实例依赖、动态联 编和多态性、方法调用图、路径覆盖测试、内存管理、功能瓶颈、分支和并发等。 7 智能理解( i n t e l l i g e n tu n d e r s t a n d i n g ) 法:利用人工智能和专家系统技术帮助进行软件 理解。 2 1 4 程序理解的分析技术 软件分析技术可以从两个方面辅助程序理解:建立程序模型和支持在模型上的认知活 动。由于程序模型允许程序员直接处理重要信息,而不必在无关的细节上浪费时间,所以 可以显著减少需要处理的信息量。 软件分析技术可以实现自动建立并维护程序模型,在不同的抽象级别具有建立程序模 型的不同的分析技术。在最底层是源代码;中闯层是语法模型,例如抽象了语法细节的抽 象语法树;更高层是抽象控制流、数据流和依赖模型;最高层是程序的体系结构模型。程 序静态分析技术主要有三种:语法分析、基于抽象解释( a b s l r a c ti n l e q 玳t a l i ) 的分析和符 号执- t ( s y m b o l i ce x e c u t i o n ) 4 0 。 程序分析的第一步是词法分析,它将源代码的文本流分解为词法类型,如标识符、操 作符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论