




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、苏州大学本科生毕业设计(论文)目 录前 言1第一章 绪 论21.1 课题研究背景及意义21.2 课题主要内容21.3 本文的组织结构3第二章 程序可视化42.1 程序可视化概述42.2 程序可视化方法52.2.1 NS图52.2.2 分层布局图62.2.3 树布局图62.3 程序可视化系统92.3.1 Graphviz绘图工具92.3.2 Tree-Map系统102.4 本章总结10第三章 系统分析与设计123.1 系统需求123.2 系统的结构设计123.2.1 系统的架构设计123.2.2 系统的详细设计13第四章 系统的实现17第五章 总结与展望235.1 课题总结235.2 后续工作展
2、望23参考文献24致 谢25摘 要现如今,软件工程行业迅猛发展并时刻影响着人类的生活。在软件开发的过程中,软件的维护正起着越来越重要的作用。而随着软件规模的不断扩大,包含数百万行代码的软件越来越常见,这无疑对软件维护人员提出了新的挑战。对于开发人员而言,传统的通过阅读程序文本理解程序的方式将耗费大量的时间和精力,从而直接增加软件维护的成本。所以,寻求一种全新的程序理解方案成为了软件工程行业亟需解决的问题。在这种情况下,程序可视化理念的提出,为程序理解提供了新的思路。程序可视化技术寻求通过可视化技术以静态或动态的图像显示程序的代码逻辑或数据结构,从而帮助开发人员理解程序内容,进而帮助企业降低软件
3、维护成本。本文首先对程序可视化技术进行了简要的概述,接着分别介绍了经典的可视化方法,并对现有的可视化系统进行了分析。之后,阐述了本课题所制作的C源程序可视化系统的结构,并对系统主要功能的实现进行了阐述。最后总结了可视化技术发展的前景和系统开发过程中的不足。关键词:C源程序;Pycparser库;程序可视化AbstractNowadays, the software engineering industry has gained rapid development and kept affecting human life. Software maintenance has played a s
4、ignificant role in the process of software development. With the scale of software becoming larger and larger, its common to meet the software which contains millions of lines of code, and it undoubtedly poses new challenges for software engineer. For developers, the traditional way to understand th
5、e program is reading the code, which takes a lot of time and energy and makes the cost of software maintenance increases a lot. Therefore, seeking for a new program-understanding method has become a problem that has to be solved in the software engineering industry.In this case, the concept of progr
6、am visualization has provided new method for program understanding. The program visualization technology visualizes the code logic or data structure of the program with a static or dynamic image. This helps the developers understand the program content easily, and helps the company reduce the cost o
7、f software maintenance.Firstly, the article gives a brief overview of program visualization technology. Then it introduces the classic visualization technologies and analyzes the existing visualization systems. Afterwards, it describes the structure of the C source program visualization system and t
8、he realization of the main functions of the system. Finally, it images the prospects of the development of visualization technology and summaries the deficiencies in the development process.Keywords: C source program; Pycparser; Program visualization25前 言程序可视化是当今软件工程产业研究的热门领域。程序可视化技术旨在利用创建图像、图表或动画等方
9、式将数据或文本转化为图形内容以传递信息,帮助人们加深对程序内容的理解。因为通过实例化的资料帮助人类理解抽象化的思想是十分简单有效的,所以,程序可视化的理念自1987年被提出后,便取得了较为广泛的关注和较快的发展。伴随着软件行业的发展,计算机程序可视化已逐步成为帮助开发和维护人员理解程序逻辑、帮助企业降低软件维护成本的主流辅助技术。与传统的通过程序语言解释程序内部逻辑的方法不同,程序可视化可以以更为直观生动的图像信息展现程序片段的内部逻辑。直到今天,程序可视化的公认定义仍然没有在该领域内达成共识。现有的每类程序可视化技术都可以对特定的程序信息进行可视化操作,但不同的程序可视化技术在其定义中强调的
10、重点又不尽相同。所以,各种形式的程序可视化技术相互依赖又各有特色。本课题主要以C源程序为可视化对象,通过分析较为成熟的程序可视化技术和研究现有的程序可视化系统,借助Python编程语言在数据分析方面的优势以及Pycparser库对C源程序的解析能力,初步实现针对C源程序的可视化效果。第一章 绪 论本章主要介绍了软件可视化的研究背景和意义,概述了本课题研究的主要内容,并在本章的最后对论文的组织结构进行了介绍。1.1 课题研究背景及意义在软件工程行业高速发展的当下,由于软件功能的增加、应用程序需求的演变等诸多因素,程序正变得越来越复杂。可想而知,通过源代码本身去理解程序是一项非常艰巨且耗时的任务,
11、所以复杂的软件通常很难被开发人员所理解,甚至很少被运营维护人员所理解,这也直接导致维护软件的成本越来越高。因此,从降低软件维护成本的角度出发,软件工程领域的学者已经开始寻求通过多种方案解决这个问题,这其中最关键的方案即为程序可视化技术。众所周知,和书面信息相比,视觉图像信息给予人脑的刺激则更为深刻。通过分析程序源代码的逻辑结构并利用图形的组合在图像上将其显示出来,可以帮助开发人员更加迅速准确地理解程序,进而降低软件维护的成本。1.2 课题主要内容本课题主要以C源程序为研究对象,分析程序可视化领域较为成熟的可视化方法,对比这些技术的优缺点,研究现有的可视化系统,并在利用Pycparser库实现对
12、C源程序的解析功能的基础上,完成C源程序的可视化系统。本课题所涉及的主要工作如下:(1)对程序可视化技术的分析。通过对NS图、树布局图、分层布局图和正交布局图的分析,找出程序可视化技术的特点以及每种技术的优缺点,从而寻求高效的可视化C源程序的方案。(2)对现有的程序可视化系统的研究。通过对Graphviz绘图工具和Tree-Map系统的研究,总结主流程序可视化系统的特点和所用技术,方便C源程序可视化系统的分析与设计。(3)研究Pycparser库以及AST抽象语法树与C源程序的关系。学习如何通过使用Pycparser库,获得与C源程序相对应的AST抽象语法树,以及分析在获得了AST抽象语法树之
13、后所要进行的工作。(4)研究能够实现绘制CFG控制流图的算法。CFG控制流图在表示不同的程序语句的执行时有着不同的规则。通过分析C源程序的执行逻辑,寻求制定相关算法以准确地控制CFG控制流图的输出。1.3 本文的组织结构本文共分为五章,各个章节内容安排如下:第一章:绪论。本章主要介绍了本课题的研究背景及意义、论述了程序可视化与软件业发展的关系和其重要性、阐述了本文的主要工作内容,最后介绍了本文的组织结构。 第二章:程序可视化。本章详细阐述了程序可视化的相关概述,介绍了较为经典的程序可视化技术,分析了它们的优缺点,以及研究了现有的较为成熟的可视化系统。第三章:系统的分析与实现。本章主要介绍了本课
14、题所制作的C源程序可视化系统架构以及详细设计的相关内容。第四章:系统的实现。本章介绍了本课题所制作的C源程序可视化系统内部的核心代码,通过例举相关例子,介绍了系统在处理不同逻辑的C源程序时所进行的处理。第五章:总结与展望。通过总结全文,提出对程序可视化领域发展前景的设想与展望。第二章 程序可视化本章对程序可视化进行了详细的概述,并分析了现有的可视化方法以及研究了现有的可视化系统。2.1 程序可视化概述程序可视化领域起步于计算机科学领域发展之后,它在20世纪80年代中期被提出,之后迅速发展并成为一个独立的研究领域1。早期的程序可视化主要针对算法逻辑实现可视化,之后,该领域的研究范围持续扩大,发展
15、到针对定量的程序信息进行研究。因为在软件工程产业,运用程序可视化技术可以帮助开发和维护人员高效地理解软件,同时降低软件后期运营维护成本,因此,自20世纪90年代中期以来,程序可视化逐步被认为是涉及商业利益的一门学科9。计算机程序通常以文本形式表示早期的计算机内部机器代码是完全由0和1的序列组成的2,之后,现代计算机系统沿用了这样的传统。因为这样的程序片段难以被人所理解,所以开发人员很快就想出了利用英文符号代替大量的0和1,也正是这些英文符号组成了“程序集”。之后,Basic、C、Java等语言发展壮大,它们利用了颜色、字体、间距和缩进,更好地帮助开发人员实现了所需的程序功能。在计算机程序编写的
16、过程中,理解程序逻辑比学习并运用程序语言实现目标功能通常扮演着更为重要的角色。尽管程序的表达经历了上述所有的改进,文本表达形式仍然是解释程序的非常有限的一类方式。试想,如果一个程序由上百万行代码组成,那么通过阅读代码理解这样一个程序所带来的工作量无疑是巨大的。因此,寻求更好的程序理解技术成为了从业者和研究人员的新的目标。除去通过阅读程序片段以理解程序逻辑的方法,图形则更可以用于生动地说明程序某些方面的执行逻辑这种利用图形解释程序片段的手段即“程序的可视化”。对于程序可视化,马德里理工大学计算机科学系副教授Gmez Henrquez提出了一个简单的定义12:“程序可视化是赋予程序除源代码形式之外
17、的其他形式的艺术。”之后,加拿大国防研究署的专家丰富了程序可视化的内涵:“以静态或动态形式显示传统程序代码或数据结构。”如今,随着程序可视化研究范围的持续扩大,程序可视化的内涵正不断被丰富和完善。2.2 程序可视化方法2.2.1 NS图20世纪80年代,开发人员已经开始尝试许多种将程序文本转换为图形的方法。由当时纽约州立大学的两名研究生Nassi和Shneiderman提出的标准流程结构图初步实现了这样的功能。如图2.1所示,NS图的基本结构是一个大的矩形,它被细分为代表指令的小矩形。在NS图中,条件语句由两个分隔的三角形进行表示如果条件为真,则在“是”分支下继续操作;反之,如果条件为假,则在
18、“否”分支下继续操作。当程序片段涉及循环语句时,可以进行矩形间的嵌套。整体而言,程序的执行过程在NS图中通过自上向下的结构表示,越往下,程序的规模则越小。图2.1 NS图NS图的特点十分鲜明,它没有使用传统的有向线段(即流程线)来表达程序执行的顺序,而是利用矩形的整体和部分的组合来描述程序。这就让NS图在表达程序片段时显得简洁直观,从而加强了图像的可读性,为后期维护程序带来了便利10。但是,NS图的缺点体现在难以对其进行修改,这也是之后NS图没有被广泛使用的重要原因。NS图一经提出,便被成功扩展到Java程序当中,而这样的设计方式在当时绘制流程图方面也得到了肯定。2.2.2 分层布局图分层布局
19、在表达程序时较为清晰明了。如图2.2,在分层布局图中,每一个节点代表一项功能,整个图通过将节点分配到不连续的水平层来强调程序内部之间的依赖关系,这也使得图片整体从顶部到底部有所统一。在绘制分层布局图时,通常使用Sugiyama算法,即在一个图像中,尽可能减少各个线之间的交叉。图2.2 早期的用于表示程序调用和嵌套的分层布局图对于分层布局图,它通过传统的利用有向线段连接节点的方式,自上而下地表达程序片段的执行顺序。但在处理较为复杂的程序片段时,分层布局图往往显得过于凌乱和臃肿,难以让人把握程序的结构和执行逻辑。尽管如此,现如今,分层布局技术依然是最常见的程序可视化方法之一。2.2.3 树布局图树
20、布局图是一类经典的流程图表达形式,它基于空间的程序可视化方法,通过规定将子节点定位于其父节点之下,由上而下地表示程序结构的层次11。如图2.3,为由斯坦福大学的两位学者Reingold和Tilford所提出的树布局图概念模型。图2.3 树布局图要绘制一个相对完美的树布局图,应当遵循四个原则5:第一,具有相同父节点的子节点应该对相对其父节点对称排列;第二,在所有节点不重叠的情况下,控制相邻节点之间的间距相等;第三,在树布局图的绘制过程中,树图的边与边不能有交叉;第四,相同深度的所有节点应当绘制在同一水平线上,用于明确树的结构。要绘制树布局图,首先,我们应该对“树”的概念进行定义:树是由一个或多个
21、节点组成的有限集合。每个树结构都有自己的根节点,除去根节点外的其他节点可以组成一些互不相交的集合,且这些集合本身又可以独立出来成为一个新的树结构。关于树的度,简单地说,即节点的分支数,所以,树的度等于该树结构内各节点中最大度的值。最后,关于树的深度,则是关于构成该树结构所有节点中层次最大的值。之后,算法层面,绘制树布局图需要将数据分为两部分4:第一部分,用于描述节点位置的数据;第二部分,用于描述节点与节点之间关系的数据。前者可以通过定义每一个节点的坐标来实现,后者可以通过节点的深度和偏移量进行判断。所以,针对每一个节点,需要同时创建两个类,第一个类为“节点类”,用于封装一个节点对应位置的所有属
22、性;第二个类为“关系类”,用于封装节点与节点之间关系所对应的所有属性。所以,我们需要定义一系列变量,用于控制树结构图的输出。这其中包括:对应图像化节点的宽度的变量“NodeWidth”,对应节点深度的变量“Heigth”以及对应节点与节点之间距离(通常用于描述处于同一层的相邻节点)的变量“distance”。要想定位一个树结构每一个节点的位置,可以通过为每一个节点定义一个坐标(x,y)来实现。初始状态时,由于节点的位置都处于未知状态,所以将所有节点的坐标统一设置为(0,0),一个树结构只有一个根节点,所以直接将根节点的坐标定义为(0,0),并规定其处于第0层。接着从根节点入手,为其子节点分配坐
23、标。对于每一个子节点,假设它的父节点同时对应a个子节点,则对于每一个子节点,其坐标中x的值为:x=-(a*NodeWidth+(a-1)*distance)/2+(a-1)*(NodeWidth+distance);图2.4 树布局图种简单的根节点与子节点关系图最后,判断此时的树布局图是否有重叠的情况发生。将同层的节点设置为不同的序号,从1开始递增,这样,序号小的节点的父节点的序号必然小于或等于序号大的节点的父节点的序号。设置完序号后,比较序号小的节点和序号大的节点坐标中x的值,若前者坐标种x的值大于后者,则树结构图存在重叠的情况。此时我们需要解决重叠问题。这里,我们通过右移父节点来解决该问题
24、,至于父节点移动的距离dis,其值等于:dis=x+width+distance-a+1;接着,将其子树下所有节点的坐标均加上dis,完成右移操作。图2.5 绘制树布局图过程中重叠情况举例以上,即为绘制树布局图的相关工作,输出树布局图之后,可以发现,树布局图可视化方法可以提供具有良好的连续性和可读性的图像,其自上而下从左到右的经典设计也符合人类阅读的视觉顺序,方便用户理解。但实现该可视化效果所对应的算法,有着较高的时间和空间复杂度,所以树布局图方法不便于处理大批量的数据。2.3 程序可视化系统2.3.1 Graphviz绘图工具Graphviz(Graph Visualization Soft
25、ware)是由贝尔工作室研发的一款著名的开源绘图工具。Graphviz一经发布,便获得了用户的一致好评,其Mac版本工具曾获得2004年年度最佳Mac程序设计奖。Graphviz工具的核心,是应用了一种名为DOT的图形描述语言。DOT的语法非常简洁,例如,当我们需要描绘一个简单的无向图以表达对象之间的简单关系时,仅需通过如下语句3,利用双连字符(-)即可实现:Graph graphnamea - b - c;b - d; 而当我们更进一步,描绘一个简单的有向图时,其语法与上述的无向图语法类似,只需要通过digraph关键字来初始化图形,并且使用箭头(-)来表达节点与节点之间的关系:digrap
26、h hraphname a - b - c;b - d;图2.6 用DOT语言描述简单的无向图与有向图尽管DOT有着如此简单快捷的图形定义功能,其所受限制也是显而易见的。在处理较为复杂的节点关系语句时,经常会输出错误,或者是让用户繁琐地重复手动定义节点的工作,所以,为了要更加顺利地定义图形,用户必须提供一系列处理特殊逻辑关系语句的算法11。因此,在应用DOT定义图形结构的基础上,Graphviz提供了独家的渲染图形的功能,成功实现了对图形的绘制。不仅如此,Graphviz在后续支持了更多的布局引擎,除去DOT所对应的默认布局方式,Graphviz拓展了circo所对应的圆环布局方式、twopi
27、所对应的径向布局方式以及patchwork所对应的哈希图布局方式等。之后,Graphviz支持了众多的输出图片格式,如PNG格式、GIF格式、PDF格式甚至是SVG矢量图格式。最终,在每一个版本的更新和完善后,如今的Graphviz已经是一款相当健壮的绘制工具。2.3.2 Tree-Map系统Tree-Map系统的核心功能,是使用嵌套的矩形图来展示分层化的数据。在Tree-Map系统输出的图像中,每个矩形的面积都与它所代表的数据量成正比6。在所有Tree-Map系统中,最著名的就是由Baker和Eick共同开发的SeeSys系统。SeeSys系统可以实现软件的可视化以及程序片段的交互。SeeS
28、ys的功能十分强大,它可以对文件、目录或者是子系统进行可视化操作,充分显示其内部的结构和功能。在判断出每一块程序功能所对应数据的量之后,SeeSys利用“平铺结构算法”,填充图形中的大矩形。平铺结构算法,即为在保证程序框图按一定顺序执行的前提下,通过将主程序分割为每一个基础块,以基础块的形式描述主程序的执行结构和顺序7。如图2.7所示。图2.7 基于Tree-Map技术的交互式SeeSys系统2.4 本章总结如今,越来越多的程序可视化技术涌现出来,但它们在协助软件开发和维护方面是否能表现出较高的效率?且是否有手段可以对它们进行定量或定性的评估?直到20世纪90年代末,随着这类问题的提出,程序可
29、视化领域的专家们才开始重视制定评判程序可视化技术效率高低的标准8。第一,在认知方面,如何使可视化系统适合特定的程序逻辑,这似乎是个急需解决的问题。所以,程序可视化系统应该基于正确的认知模型,针对开发者、维护者、程序以及要实现的功能进行“量身定制”。第二,在输出方面,输出与显示内容应该直接相关。由于程序可视化系统在时间和空间上可能都非常巨大且复杂。因此,选择适当的程序表现形式是十分必要的,如主流的图形、图表等。第三,在交互方面,现有的交互工具通常不易安装、学习和使用。这直接增加了用户对软件可视化的理解难度。通过提供方向明确的引导流程,也许可以缓解这类问题。而在未来,我们与更复杂的软件交互进行时,
30、可能将如何对大型的信息进行引导提出更高的要求。第四,关于可视化操作所获得结果,是否能与源程序进行交互,是个一个未来需要探讨的问题。本课题的研究方向还仅仅停留在单纯地获得与源程序相对应的CFG控制流图。未来,关于如何实现将CFG控制流图与源代码进行交互,仍然有很长的路要走。第三章 系统分析与设计本章结合系统架构的相关知识,从整体到细节对C源程序可视化系统进行了需求分析并阐述了系统的结构设计方案。3.1 系统需求本系统主要以C源程序为可视化对象,在利用Pycparser库实现对C源程序的解析的基础上,完成对C源程序的可视化,最终用CFG控制流图的形式表现出来。CFG(Control Flow Gr
31、aph),即控制流图,是对程序中控制流程的图形表示。在CFG控制流图中,节点是最基础的块,基础块与基础块之间通过有向线段进行连接,所以,除去初始节点和叶子节点,每个基础块都可以被传入或者传出操作。特别的,每一个CFG控制流图都有一个初始节点,该初始节点对应源程序中引导整个程序执行的第一条语句,是整个CFG控制流图的入口。3.2 系统的结构设计3.2.1 系统的架构设计通过对系统需求的分析,在系统架构上采用分层体系结构,如图3.1所示。图3.1 系统架构图在数据输入层中,主要是读取需要进行可视化操作的C源程序文件,之后去除代码中的头文件引入语句和注释,等待将其传入数据分析层。数据分析层是整个系统
32、的核心,在数据分析层中,系统的主要工作是利用Pycparser库对所获得的C源程序进行处理,获得AST抽象语法树。之后,利用算法将AST抽象语法树进行分块并传入图像展现层。在图像展现层中,依据上一层传过来的AST抽象语法树块绘制CFG控制流图,在界面进行显示并在目标文件夹下输出PNG图片。3.2.2 系统的详细设计数据输入层是本系统的入口。我们可以通过选择C源程序文件的路径来获取C源程序的具体代码内容。在该层中,仅仅获取代码内容还不够,因为C源程序代码几乎总是以#include语句开头来引入各类C源程序库,如“#include stdio.h”,而Pycparser库在处理C源程序的过程中,并
33、不会关心这些库的引用,所以在将C源程序传入数据分析层之前,系统会对代码片段进行轻处理,删去C源程序代码中的头文件引入语句、注释内容以及大段的空行,压缩代码所占的空间,方便后续在数据分析层中交给Pycparser库进行处理。在数据分析层,通过调用Pycparser库提供给我们的接口,将已经进行轻处理的C源程序代码片段进行内部处理。Pycparser库是一类C语言的解析器,它由纯Python所编写,可以被轻松集成到需要解析C源程序代码的应用程序中。熟悉Python语言的人都知道,当我们想在Python中调用C语言时,最佳的选择是使用CFFI(Common Foreign Function Inte
34、rface)库,CFFI库提供了一个级别较低的接口以调用C程序中的库,这也是为什么CFFI库被称为“连接Python与C的桥梁”。正是因为在过去的几年中,CFFI库的使用开始流行,Pycparser库的C源程序解析功能才开始为人们所重视。目前,Pycparser库主要被应用于C代码的混淆、制作主流C编译器的前端、检查定量代码以及程序测试等。而在本系统中,我们利用了Pycparser库可以很方便地解析C源程序的功能,将C源程序片段的字符流转化为AST数据。AST(Abstract Syntax Tree),即抽象语法树,如图3.2所示,它是源代码抽象语法的一种树形结构的表示。在AST抽象语法树中
35、,每一个节点都对应着其源代码中的一类结构。之所以说AST是抽象的,是因为它并不会完整表示出源代码的每一处细节,而是只将源代码的结构很清晰地表达出来,方便我们后续对源代码进行操作。图3.2 AST抽象语法树接着,我们将AST抽象语法树进行切割,按照其语义、执行逻辑和执行顺序分为许多个基础块,每一个基础块即对应源程序代码中一条程序语句的执行,如声明变量的基础块、赋值的基础块、用于判断的判断语句基础块、用于循环的循环语句基础块等。而对AST抽象语法树数据进行分块的算法,也是本系统的核心算法。在系统的代码中,针对基础块声明了一个基础块类Block,用于定义每一个基础块的内部属性。相关代码如下: cla
36、ss Block(object):def _init_(self, identity):self.identity = identityself.sentences = self.parents = self.block_type = Nonedef _str_(self):res = for item in self.sentences:res += str(item) + nreturn resdef SetBlockType(self, block_type):self.block_type = block_typedef AddSentence(self, sentence):self
37、.sentences.append(sentence)def show(self):print(- + str(self.identity) + -start)for item in self.sentences:item.show()print(- + str(self.identity) + -end)在Block类中,用于形容基础块所对应的程序语句的变量名称为“sentences”,而变量sentences所对应的内容即为之后要在CFG控制流图中每一个节点内显示的内容,即一小段程序语句片段。同时,为了方便在CFG控制流图中利用有向线段连接节点,需要同时定义每一个基础块的传入基础块,即对应
38、程序中的“parents”变量。因为在CFG控制流图中,每个节点可能由多个节点传入操作,所以变量parents被设置为数组形式以记录全部的有传入操作的基础块。除去基础块的定义,用于表示CFG控制流图中的有向线段也需要被定义,定义有向线段的Line类所对应的相关代码如下:class Line(object):def _init_(self, line_num=0, code=):self.content = codeself.line_num = line_numdef _str_(self):return self.content # + ( + str(self.line_num) + )d
39、ef line_to_sentence(self, codes):self.content = codesself.line_num - 1def show(self):print(self.content + ( + str(self.line_num) + )由于在涉及循环语句、判断语句等特殊语法时,需要在CFG控制流图中解释程序执行的原因,而这些原因的内容无法通过基础块进行表达,所以,本系统规定将这些用于解释程序执行原因的语句显示在有向线段上,即对应Line类中的变量content。当然,变量content在多数情况下的值都为空。最后,在图像展现层,我们通过规定一系列流程图绘制方案引导系
40、统进行CFG控制流图的绘制。这其中,简单的变量定义和赋值的语句仅需通过单纯的有向线段连接相关的节点即可实现。而当涉及较为复杂的逻辑语句时,如经典的判断语句和循环语句,则需要单独对其绘制方法进行指定。第四章 系统的实现系统开始运行后,展示给用户的初始界面如图4.1所示:图4.1 初始用户界面整个系统的用户界面由三个部分组成:第一部分,文件选择功能。该功能对应数据输入层,获取所需要进行可视化的对象文件;第二部分,代码内容显示功能,在获得可视化目标后,读入程序片段并进行数据处理,等待用于点击“开始”按钮后完成对CFG控制流图的绘制;第三部分,CFG控制流图展示功能。该功能在系统完成对CFG控制流图的
41、绘制之后将其输出,并在目标文件夹下创建PNG图片文件。用户首先需要指定C源程序文件路径,方便系统读入代码。在“请选择文件”下单击“选择”按钮,会弹出一个选择框,供用户选择文件,如图4.2所示。图4.2 选择C源程序文件弹窗在指定了C源程序文件的路径后,系统会读取源程序代码内容,并显示出来,如图4.3所示。图4.3 读取文件后显示代码内容界面接着,用户点击“开始”按钮,系统内部就会对代码片段执行可视化操作并在右侧“CFG控制流图”区域内显示,如图4.4所示。图4.4 系统输出CFG控制流图的界面在这个过程中,CFG控制流图的实现,包含了对每一类程序语句绘制方案的制定。这其中,判断语句和循环语句的
42、实现是大多数CFG控制流图绘图的重点。第一,判断语句。在判断语句中,主要涉及If判断语句和Switch判断语句两类。对于If判断语句,尽管在程序执行的过程中只能同时执行其判断条件为“真”或“假”时一条分支下的程序语句,但最终在绘制CFG控制流图时,必须同时考虑两种情况下程序的执行逻辑,并在CFG控制流程图中并列地展现出来。所以,在系统编写的过程中,对If判断语句单独规定了基础块绘制的算法,相关代码如下:def ParseIfBlock(if_block, codes):blocks = ends = true_ends = false_ends = cond_end_flag = Falset
43、mp_blocks, cond_ends = CheckBlocks(if_block.cond, codes)blocks += tmp_blockstmp_blocks, true_ends = CheckBlocks(if_block.iftrue, codes)if len(tmp_blocks):for cond_end in cond_ends:tmp_blocks0.parents.append(cond_end0, T)else:cond_end_flag = Trueblocks += tmp_blocks(此处代码逻辑和True分支相似,故省略False分支下的程序片段)r
44、eturn (blocks, ends)除了必要的基础块起点终点节点的定义,还单独定义了If判断语句在程序中判定为“True”和“False”的分支下,有向线段连接后续节点的方式。图4.5 两类判断语句If语句和Switch语句CFG控制流图举例和If语句相类似,Switch语句多用于进行判断和选择。Switch语句的绘制方式和If语句相似,如图4.5所示,我们必须考虑Switch语句中每类条件分别被触发后程序分别对应的执行语句,同样地,在CFG控制流图中并列地进行绘制。而实现这一效果的算法,则是运用循环的思想,遍历每一类情况,并执行其分支下的操作。第二,循环语句。循环语句的中止和继续执行往往
45、依赖判断是否跳出循环的判断语句。所以,我们可以将循环语句在跳出循环之前视作是封闭的、由多个重复的判断语句组成的程序执行语句。C源程序中主要涉及While循环语句、For循环语句和Do-While循环语句,而三者之间的区别十分明显:While循环语句在条件不满足时不会被执行,Do-While循环语句先进行一遍循环操作,再对条件进行判断,而For循环语句则自定义初始条件和循环跳出条件。因为其实现方式大同小异,所以此处仅对While循环语句的CFG控制流图的绘制进行分析。与判断语句不同,独立的While循环语句只有一个出口,即为While条件不满足时才可以跳出循环。所以其CFG控制流图绘制的关键点依
46、然是While条件的判断语句,当满足条件时,利用有向线段形成一个封闭循环的节点链。相关代码如下:def ParseWhileBlock(while_block, codes):blocks = real_ends = cond_blocks, cond_ends = CheckBlocks(while_block.cond, codes)blocks += cond_blocksstmt_blocks, stmt_ends = CheckBlocks(while_block.stmt, codes)if len(stmt_blocks):for cond_end in cond_ends:st
47、mt_blocks0.parents.append(cond_end0, T)for stmt_end in stmt_ends:if stmt_end1 = loop_goto_str0 and loop_goto_status0: # continuecond_blocks0.parents.append(stmt_end)loop_goto_status0 = Falseelif stmt_end1 = loop_goto_str1 and loop_goto_status1: # breakreal_ends.append(stmt_end)loop_goto_status1 = Fa
48、lsecontinueelif stmt_end1 = loop_goto_str2 and loop_goto_status2:loop_goto_status2 = Falseelse:cond_blocks0.parents.append(stmt_end)blocks += stmt_blocksfor cond_end in cond_ends:cond_end1 = Freal_ends += cond_endsreturn (blocks, real_ends)需要注意的是,跳出循环的情况不仅仅是While条件语句不满足时触发,循环内部也可以通过“continue”语句跳出当前循
49、环或通过“break”语句永久跳出循环。图4.6 While语句、Do-While语句和For语句CFG控制流图举例。在显示出与代码相对应的CFG控制流图的同时,系统会自动在文件目录下生成一份PNG图文件,如图4.7所示。图4.7 自动生成的CFG控制流图至此,针对本课题所制作的系统已经基本实现了对C源程序的可视化及信息的展示。第五章 总结与展望5.1 课题总结由于程序可视化技术在帮助理解程序方面展现出的强大功能,以及商业领域对降低软件维护成本的需求日益增长,开发更为前沿的程序可视化技术所带来的收益是难以预估的。本文主要针对C源程序的可视化实现进行了系统的论述,并初步设计出一套可视化系统以实现
50、使用图像表达C源程序的代码逻辑。本系统的创新点体现在:(1)使用Pycparser库作为辅助工具,简化了对数据的处理过程,方面我们将更多的精力用于研究CFG控制流图结构的合理输出方案上。(2)提出了对AST抽象语法树数据运用分块思想进行处理的方案,将复杂的问题简单化,解决了可视化过程中整体图像绘制的困难。5.2 后续工作展望本课题所设计的系统虽然初步实现了对C源程序的可视化,但系统本身仍存在着不足之处以及可以拓展和提高的地方:(1)本系统绘制CFG控制流图的核心算法,是通过对AST抽象语法树进行分块再整合的方式。这样的方式在处理大型程序片段时可能无法保证绘图的效率,所以,在利用Pycparse
51、r库实现对AST抽象语法树的输出之后,可以寻求更为高效的绘图方案,保证可视化功能能够面向更为复杂和庞大的程序片段。(2)本系统在输出CFG控制流图信息之后,无法帮助用户通过CFG控制流图与源程序进行交互。所以,在系统的后续研究过程中,应当拓展出通过CFG控制流图的结构点实现与源程序进行交互的功能,甚至可以实现在用户修改CFG控制流图的部分结构之后,系统实时地对源程序自动完成对应的修改的功能。(3)本系统暂时只能针对C源程序进行可视化,后续应当寻求通过对比C源程序与其他编程语言的相同点与不同点,争取让系统可以针对不同编程语言实现可视化。参考文献1. Stasko, John T., John B., and Blaine A. Software visualization: programming as a mult
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织机械的数字化技术发展趋势考核试卷
- 统编版语文六年级下册《语文园地一》精美课件
- 纸张耐高温性能考核试卷
- 纤维板生产过程中的质量管理与控制考核试卷
- 粮油商品知识与实践考核试卷
- 河南省驻马店市平舆县2023-2024学年七年级下学期6月期末考试数学试卷(含答案)
- 笔的行业竞争现状考核试卷
- 合成材料在个人防护装备中的应用考核试卷
- 家禽饲养业产学研深度融合与成果转化机制优化考核试卷
- 二年级下册成语
- 日光温室大棚承包合同
- 电子商务案例分析13例 - 电子商务案例
- 多发伤及复合伤的抢救处理流程
- 2023年郑州科技学院单招面试题库及答案解析
- 《表观遗传》教学设计
- 自动跟随智能小车的定位与跟随系统设计
- 急性心力衰竭试题附答案
- 房室结折返性心动过速
- 光伏工程绿色施工、节能减排方案
- 历史学科中考复习方法交流
- GB/T 6284-2006化工产品中水分测定的通用方法干燥减量法
评论
0/150
提交评论