基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx

上传人:夺命阿水 文档编号:1226451 上传时间:2024-04-05 格式:DOCX 页数:27 大小:330.01KB
返回 下载 相关 举报
基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx_第1页
第1页 / 共27页
基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx_第2页
第2页 / 共27页
基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx_第3页
第3页 / 共27页
基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx_第4页
第4页 / 共27页
基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx》由会员分享,可在线阅读,更多相关《基于pycparser的C源程序可视化系统设计和实现计算机科学与技术专业.docx(27页珍藏版)》请在课桌文档上搜索。

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第四章系统的实现16第五章总结与展望225.1 课题总结225.2 后续工作展望22参考文献23致谢错误!未定义书签。现如今,软

2、件工程行业迅猛发展并时刻影响着人类的生活。在软件开发的过程中,软件的维护正起着越来越重要的作用。而随着软件规模的不断扩大,包含数百万行代码的软件越来越常见,这无疑对软件维护人员提出了新的挑战。对于开发人员而言,传统的通过阅读程序文本理解程序的方式将耗费大量的时间和精力,从而直接增加软件维护的成本。所以,寻求一种全新的程序理解方案成为了软件工程行业亟需解决的问题。在这种情况下,程序可视化理念的提出,为程序理解提供了新的思路。程序可视化技术寻求通过可视化技术以静态或动态的图像显示程序的代码逻辑或数据结构,从而帮助开发人员理解程序内容,进而帮助企业降低软件维护成本。本文首先对程序可视化技术进行了简要

3、的概述,接着分别介绍了经典的可视化方法,并对现有的可视化系统进行了分析。之后,阐述了本课题所制作的C源程序可视化系统的结构,并对系统主要功能的实现进行了阐述。最后总结了可视化技术发展的前景和系统开发过程中的不足。关键词:C源程序;PyCParSer库;程序可视化AbstractNowadays,thesoftwareengineeringindustryhasgainedrapiddevelopmentandkeptaffectinghumanlife.Softwaremaintenancehasplayedasignificantroleintheprocessofsoftwaredevel

4、opment.Withthescaleofsoftwarebecominglargerandlarger,it,scommontomeetthesoftwarewhichcontainsmillionsoflinesofcode,anditundoubtedlyposesnewchallengesforsoftwareengineer.Fordevelopers,thetraditionalwaytounderstandtheprogramisreadingthecode,whichtakesalotoftimeandenergyandmakesthecostofsoftwaremainten

5、anceincreasesalot.Therefore,seekingforanewprogram-understandingmethodhasbecomeaproblemthathastobesolvedinthesoftwareengineeringindustry.Inthiscase,theconceptofprogramvisualizationhasprovidednewmethodforprogramunderstanding.Theprogramvisualizationtechnologyvisualizesthecodelogicordatastructureofthepr

6、ogramwithastaticordynamicimage.Thishelpsthedevelopersunderstandtheprogramcontenteasily,andhelpsthecompanyreducethecostofsoftwaremaintenance.Firstly,thearticlegivesabriefoverviewofprogramvisualizationtechnology.Thenitintroducestheclassicvisualizationtechnologiesandanalyzestheexistingvisualizationsyst

7、ems.Afterwards,itdescribesthestructureoftheCsourceprogramvisualizationsystemandtherealizationofthemainfunctionsofthesystem.Finally,itimagestheprospectsofthedevelopmentofvisualizationtechnologyandsummariesthedeficienciesinthedevelopmentprocess.Keywords:Csourceprogram;Pycparser;Programvisualization前言程

8、序可视化是当今软件工程产业研究的热门领域。程序可视化技术旨在利用创建图像、图表或动画等方式将数据或文本转化为图形内容以传递信息,帮助人们加深对程序内容的理解。因为通过实例化的资料帮助人类理解抽象化的思想是十分简单有效的,所以,程序可视化的理念自1987年被提出后,便取得了较为广泛的关注和较快的发展。伴随着软件行业的发展,计算机程序可视化已逐步成为帮助开发和维护人员理解程序逻辑、帮助企业降低软件维护成本的主流辅助技术。与传统的通过程序语言解释程序内部逻辑的方法不同,程序可视化可以以更为直观生动的图像信息展现程序片段的内部逻辑。直到今天,程序可视化的公认定义仍然没有在该领域内达成共识。现有的每类程

9、序可视化技术都可以对特定的程序信息进行可视化操作,但不同的程序可视化技术在其定义中强调的重点又不尽相同。所以,各种形式的程序可视化技术相互依赖又各有特色。本课题主要以C源程序为可视化对象,通过分析较为成熟的程序可视化技术和研究现有的程序可视化系统,借助Python编程语言在数据分析方面的优势以及Pycparser库对C源程序的解析能力,初步实现针对C源程序的可视化效果。第一章绪论本章主要介绍了软件可视化的研究背景和意义,概述了本课题研究的主要内容,并在本章的最后对论文的组织结构进行了介绍。1.1 课题研究背景及意义在软件工程行业高速发展的当下,由于软件功能的增加、应用程序需求的演变等诸多因素,

10、程序正变得越来越复杂。可想而知,通过源代码本身去理解程序是一项非常艰巨且耗时的任务,所以复杂的软件通常很难被开发人员所理解,甚至很少被运营维护人员所理解,这也直接导致维护软件的成本越来越高。因此,从降低软件维护成本的角度出发,软件工程领域的学者已经开始寻求通过多种方案解决这个问题,这其中最关键的方案即为程序可视化技术。众所周知,和书面信息相比,视觉图像信息给予人脑的刺激则更为深刻。通过分析程序源代码的逻辑结构并利用图形的组合在图像上将其显示出来,可以帮助开发人员更加迅速准确地理解程序,进而降低软件维护的成本。1.2 课题主要内容本课题主要以C源程序为研究对象,分析程序可视化领域较为成熟的可视化

11、方法,对比这些技术的优缺点,研究现有的可视化系统,并在利用PyCParSer库实现对C源程序的解析功能的基础上,完成C源程序的可视化系统。本课题所涉及的主要工作如下:(1)对程序可视化技术的分析。通过对NS图、树布局图、分层布局图和正交布局图的分析,找出程序可视化技术的特点以及每种技术的优缺点,从而寻求高效的可视化C源程序的方案。(2)对现有的程序可视化系统的研究。通过对GraPhViZ绘图工具和Tree-MaP系统的研究,总结主流程序可视化系统的特点和所用技术,方便C源程序可视化系统的分析与设计。(3)研究PyCParSer库以及AST抽象语法树与C源程序的关系。学习如何通过使用PyCPar

12、Ser库,获得与C源程序相对应的AST抽象语法树,以及分析在获得了AST抽象语法树之后所要进行的工作。(4)研究能够实现绘制CFG控制流图的算法。CFG控制流图在表示不同的程序语句的执行时有着不同的规则。通过分析C源程序的执行逻辑,寻求制定相关算法以准确地控制CFG控制流图的输出。1.3本文的组织结构本文共分为五章,各个章节内容安排如下:第一章:绪论。本章主要介绍了本课题的研究背景及意义、论述了程序可视化与软件业发展的关系和其重要性、阐述了本文的主要工作内容,最后介绍了本文的组织结构。第二章:程序可视化。本章详细阐述了程序可视化的相关概述,介绍了较为经典的程序可视化技术,分析了它们的优缺点,以

13、及研究了现有的较为成熟的可视化系统。第三章:系统的分析与实现。本章主要介绍了本课题所制作的C源程序可视化系统架构以及详细设计的相关内容。第四章:系统的实现。本章介绍了本课题所制作的C源程序可视化系统内部的核心代码,通过例举相关例子,介绍了系统在处理不同逻辑的C源程序时所进行的处理。第五章:总结与展望。通过总结全文,提出对程序可视化领域发展前景的设想与展望。第二章程序可视化本章对程序可视化进行了详细的概述,并分析了现有的可视化方法以及研究了现有的可视化系统。2.1 程序可视化概述程序可视化领域起步于计算机科学领域发展之后,它在20世纪80年代中期被提出,之后迅速发展并成为一个独立的研究领域。早期

14、的程序可视化主要针对算法逻辑实现可视化,之后,该领域的研究范围持续扩大,发展到针对定量的程序信息进行研究。因为在软件工程产业,运用程序可视化技术可以帮助开发和维护人员高效地理解软件,同时降低软件后期运营维护成本,因此,自20世纪90年代中期以来,程序可视化逐步被认为是涉及商业利益的一门学科。计算机程序通常以文本形式表示一一早期的计算机内部机器代码是完全由。和1的序列组成的,之后,现代计算机系统沿用了这样的传统。因为这样的程序片段难以被人所理解,所以开发人员很快就想出了利用英文符号代替大量的0和1,也正是这些英文符号组成了“程序集”。之后,Basic.C、JaVa等语言发展壮大,它们利用了颜色、

15、字体、间距和缩进,更好地帮助开发人员实现了所需的程序功能。在计算机程序编写的过程中,理解程序逻辑比学习并运用程序语言实现目标功能通常扮演着更为重要的角色。尽管程序的表达经历了上述所有的改进,文本表达形式仍然是解释程序的非常有限的一类方式。试想,如果一个程序由上百万行代码组成,那么通过阅读代码理解这样一个程序所带来的工作量无疑是巨大的。因此,寻求更好的程序理解技术成为了从业者和研究人员的新的目标。除去通过阅读程序片段以理解程序逻辑的方法,图形则更可以用于生动地说明程序某些方面的执行逻辑一一这种利用图形解释程序片段的手段即“程序的可视化”。对于程序可视化,马德里理工大学计算机科学系副教授G6mez

16、HenriqUeZ提出了一个简单的定义“程序可视化是赋予程序除源代码形式之外的其他形式的艺术J之后,加拿大国防研究署的专家丰富了程序可视化的内涵:“以静态或动态形式显示传统程序代码或数据结构。”如今,随着程序可视化研究范围的持续扩大,程序可视化的内涵正不断被丰富和完善。2.2 程序可视化方法2.2.1 NS图20世纪80年代,开发人员已经开始尝试许多种将程序文本转换为图形的方法。由当时纽约州立大学的两名研究生Nassi和Shneiderman提出的标准流程结构图初步实现了这样的功能。如图2.1所示,NS图的基本结构是一个大的矩形,它被细分为代表指令的小矩形。在NS图中,条件语句由两个分隔的三角

17、形进行表示一一如果条件为真,则在“是”分支下继续操作;反之,如果条件为假,则在“否”分支下继续操作。当程序片段涉及循环语句时,可以进行矩形间的嵌套。整体而言,程序的执行过程在NS图中通过自上向下的结构表示,越往下,程序的规模则越小。条件 /值1值2值nCASE部分CASE部分 CASC部分选择图2.1NS图NS图的特点十分鲜明,它没有使用传统的有向线段(即流程线)来表达程序执行的顺序,而是利用矩形的整体和部分的组合来描述程序。这就让NS图在表达程序片段时显得简洁直观,从而加强了图像的可读性,为后期维护程序带来了便利加。但是,NS图的缺点体现在难以对其进行修改,这也是之后NS图没有被广泛使用的重

18、要原因。NS图一经提出,便被成功扩展到JaVa程序当中,而这样的设计方式在当时绘制流程图方面也得到了肯定。2.2.2 分层布局图分层布局在表达程序时较为清晰明了。如图2.2,在分层布局图中,每一个节点代表一项功能,整个图通过将节点分配到不连续的水平层来强调程序内部之间的依赖关系,这也使得图片整体从顶部到底部有所统一。在绘制分层布局图时,通常使用SUgiyama算法,即在一个图像中,尽可能减少各个线之间的交叉。JJVSCFile Fold Zoom Navigate Slice Show Options9: int3E)0;0: char e pul81:B MuK(Val Ctfgnph. r

19、ot Bb 3File Zoom Navigate Show Options HelpJbjkcFile Navigate Slice图2.2早期的用于表示程序调用和嵌套的分层布局图对于分层布局图,它通过传统的利用有向线段连接节点的方式,自上而下地表达程序片段的执行顺序。但在处理较为复杂的程序片段时,分层布局图往往显得过于凌乱和臃肿,难以让人把握程序的结构和执行逻辑。尽管如此,现如今,分层布局技术依然是最常见的程序可视化方法之一。2.2.3 树布局图树布局图是一类经典的流程图表达形式,它基于空间的程序可视化方法,通过规定将子节点定位于其父节点之下,由上而下地表示程序结构的层次UL如图2.3,为

20、由斯坦福大学的两位学者Reingold和Tilford所提出的树布局图概念模型。图2.3树布局图要绘制一个相对完美的树布局图,应当遵循四个原则:第一,具有相同父节点的子节点应该对相对其父节点对称排列;第二,在所有节点不重叠的情况下,控制相邻节点之间的间距相等;第三,在树布局图的绘制过程中,树图的边与边不能有交叉;第四,相同深度的所有节点应当绘制在同一水平线上,用于明确树的结构。要绘制树布局图,首先,我们应该对“树”的概念进行定义:树是由一个或多个节点组成的有限集合。每个树结构都有自己的根节点,除去根节点外的其他节点可以组成一些互不相交的集合,且这些集合本身又可以独立出来成为一个新的树结构。关于

21、树的度,简单地说,即节点的分支数,所以,树的度等于该树结构内各节点中最大度的值。最后,关于树的深度,则是关于构成该树结构所有节点中层次最大的值。之后,算法层面,绘制树布局图需要将数据分为两部分:第一部分,用于描述节点位置的数据;第二部分,用于描述节点与节点之间关系的数据。前者可以通过定义每一个节点的坐标来实现,后者可以通过节点的深度和偏移量进行判断。所以,针对每个节点,需要同时创建两个类,第一个类为“节点类”,用于封装一个节点对应位置的所有属性;第二个类为“关系类”,用于封装节点与节点之间关系所对应的所有属性。所以,我们需要定义一系列变量,用于控制树结构图的输出。这其中包括:对应图像化节点的宽

22、度的变量“NodeWidth”,对应节点深度的变量“Heigth”以及对应节点与节点之间距离(通常用于描述处于同一层的相邻节点)的变量“distance”。要想定位一个树结构每一个节点的位置,可以通过为每一个节点定义一个坐标(x,y)来实现。初始状态时,由于节点的位置都处于未知状态,所以将所有节点的坐标统一设置为(0,0),一个树结构只有一个根节点,所以直接将根节点的坐标定义为(0,0),并规定其处于第0层。接着从根节点入手,为其子节点分配坐标。对于每一个子节点,假设它的父节点同时对应。个子节点,则对于每一个子节点,其坐标中X的值为:x=-(d*NodeWidth+(a-1)*distance

23、)2+(tz-1)*(NodeWidth+distance);图2.4树布局图种简单的根节点与子节点关系图最后,判断此时的树布局图是否有重叠的情况发生。将同层的节点设置为不同的序号,从1开始递增,这样,序号小的节点的父节点的序号必然小于或等于序号大的节点的父节点的序号。设置完序号后,比较序号小的节点和序号大的节点坐标中X的值,若前者坐标种X的值大于后者,则树结构图存在重叠的情况。此时我们需要解决重叠问题。这里,我们通过右移父节点来解决该问题,至于父节点移动的距离由S,其值等于:)来表达节点与孽之间的关系:digraphhraphnamea-b-c;b-d;图2.6用DoT语言描述简单的无向图与

24、有向图尽管DOT有着如此简单快捷的图形定义功能,其所受限制也是显而易见的。在处理较为复杂的节点关系语句时,经常会输出错误,或者是让用户繁琐地重复手动定义节点的工作,所以,为了要更加顺利地定义图形,用户必须提供一系列处理特殊逻辑关系语句的算法L因此,在应用DoT定义图形结构的基础上,GraPhViZ提供了独家的渲染图形的功能,成功实现了对图形的绘制。不仅如此,GraPhViZ在后续支持了更多的布局引擎,除去DOT所对应的默认布局方式,Gmphviz拓展了CirCO所对应的圆环布局方式、twopi所对应的径向布局方式以及PatChWork所对应的哈希图布局方式等。之后,GraPhViZ支持了众多的

25、输出图片格式,如PNG格式、GIF格式、PDF格式甚至是SVG矢量图格式。最终,在每一个版本的更新和完善后,如今的GraPhViZ已经是一款相当健壮的绘制工具。2.3.2 Tree-Map系统Tree-Map系统的核心功能,是使用嵌套的矩形图来展示分层化的数据。在Tree-Map系统输出的图像中,每个矩形的面积都与它所代表的数据量成正比。在所有Tree-M叩系统中,最著名的就是由Baker和Eick共同开发的SeeSys系统。SeeSys系统可以实现软件的可视化以及程序片段的交互。SeeSyS的功能十分强大,它可以对文件、目录或者是子系统进行可视化操作,充分显示其内部的结构和功能。在判断出每一

26、块程序功能所对应数据的量之后,SeeSyS利用“平铺结构算法”,填充图形中的大矩形。平铺结构算法,即为在保证程序框图按一定顺序执行的前提下,通过将主程序分割为图2.7基于Tree-Map技术的交互式SeeSys系统IH11IHMTTiTMW2.4 本章总结如今,越来越多的程序可视化技术涌现出来,但它们在协助软件开发和维护方面是否能表现出较高的效率?且是否有手段可以对它们进行定量或定性的评估?直到20世纪90年代末,随着这类问题的提出,程序可视化领域的专家们才开始重视制定评判程序可视化技术效率高低的标准。第一,在认知方面,如何使可视化系统适合特定的程序逻辑,这似乎是个急需解决的问题。所以,程序可

27、视化系统应该基于正确的认知模型,针对开发者、维护者、程序以及要实现的功能进行“量身定制”。第二,在输出方面,输出与显示内容应该直接相关。由于程序可视化系统在时间和空间上可能都非常巨大且复杂。因此,选择适当的程序表现形式是十分必要的,如主流的图形、图表等。第三,在交互方面,现有的交互工具通常不易安装、学习和使用。这直接增加了用户对软件可视化的理解难度。通过提供方向明确的引导流程,也许可以缓解这类问题。而在未来,我们与更复杂的软件交互进行时,可能将如何对大型的信息进行引导提出更高的要求。第四,关于可视化操作所获得结果,是否能与源程序进行交互,是个一个未来需要探讨的问题。本课题的研究方向还仅仅停留在

28、单纯地获得与源程序相对应的CFG控制流图。未来,关于如何实现将CFG控制流图与源代码进行交互,仍然有很长的路要走。第三章系统分析与设计本章结合系统架构的相关知识,从整体到细节对C源程序可视化系统进行了需求分析并阐述了系统的结构设计方案。3.1 系统需求本系统主要以C源程序为可视化对象,在利用Pycparser库实现对C源程序的解析的基础上,完成对C源程序的可视化,最终用CFG控制流图的形式表现出来。CFG(ControlFlowGraph),即控制流图,是对程序中控制流程的图形表示。在CFG控制流图中,节点是最基础的块,基础块与基础块之间通过有向线段进行连接,所以,除去初始节点和叶子节点,每个

29、基础块都可以被传入或者传出操作。特别的,每一个CFG控制流图都有一个初始节点,该初始节点对应源程序中引导整个程序执行的第一条语句,是整个CFG控制流图的入口。3.2 系统的结构设计3.2.1 系统的架构设计通过对系统需求的分析,在系统架构上采用分层体系结构,如图3.1所示。图3.1系统架构图在数据输入层中,主要是读取需要进行可视化操作的C源程序文件,之后去除代码中的头文件引入语句和注释,等待将其传入数据分析层。数据分析层是整个系统的核心,在数据分析层中,系统的主要工作是利用PyCParSer库对所获得的C源程序进行处理,获得AST抽象语法树。之后,利用算法将AST抽象语法树进行分块并传入图像展

30、现层。在图像展现层中,依据上一层传过来的AST抽象语法树块绘制CFG控制流图,在界面进行显示并在目标文件夹下输出PNG图片。3.2.2 系统的详细设计数据输入层是本系统的入口。我们可以通过选择C源程序文件的路径来获取C源程序的具体代码内容。在该层中,仅仅获取代码内容还不够,因为C源程序代码几乎总是以include语句开头来引入各类C源程序库,如“#inckidestdio.h,而PyCParSer库在处理C源程序的过程中,并不会关心这些库的引用,所以在将C源程序传入数据分析层之前,系统会对代码片段进行轻处理,删去C源程序代码中的头文件引入语句、注释内容以及大段的空行,压缩代码所占的空间,方便后

31、续在数据分析层中交给PyCParSer库进行处理。在数据分析层,通过调用PyCParSer库提供给我们的接口,将已经进行轻处理的C源程序代码片段进行内部处理。PyCParSer库是一类C语言的解析器,它由纯PythOn所编写,可以被轻松集成到需要解析C源程序代码的应用程序中。熟悉Python语言的人都知道,当我们想在Python中调用C语言时,最佳的选择是使用CFFI(CommonForeignFunctionInterface)库,CFFI库提供了一个级别较低的接口以调用C程序中的库,这也是为什么CFFI库被称为“连接Python与C的桥梁二正是因为在过去的几年中,CFFl库的使用开始流行,

32、PyCParSer库的C源程序解析功能才开始为人们所重视。目前,PyCParSer库主要被应用于C代码的混淆、制作主流C编译器的前端、检查定量代码以及程序测试等。而在本系统中,我们利用了PyCParSer库可以很方便地解析C源程序的功能,将C源程序片段的字符流转化为AST数据。AST(AbstractSyntaxTree),即抽象语法树,如图3.2所示,它是源代码抽象语法的一种树形结构的表示。在AST抽象语法树中,每一个节点都对应着其源代码中的一类结构。之所以说AST是抽象的,是因为它并不会完整表示出源代码的每一处细节,而是只将源代码的结构很清晰地表达出来,方便我们后续对源代码进行操作。图3.

33、2AST抽象语法树接着,我们将AST抽象语法树进行切割,按照其语义、执行逻辑和执行顺序分为许多个基础块,每一个基础块即对应源程序代码中一条程序语句的执行,如声明变量的基础块、赋值的基础块、用于判断的判断语句基础块、用于循环的循环语句基础块等。而对AST抽象语法树数据进行分块的算法,也是本系统的核心算法。在系统的代码中,针对基础块声明了一个基础块类Block,用于定义每一个基础块的内部属性二相关代码如下:classBlock(object):definit(self,identity):self.identity=identityself,sentences=self,parents=self.

34、block_type=Nonedef_str_(self):res=,n,foriteminself.sentences:res+=str(item)+,nreturnresdefSetBIockType(self,block_type):self.blocktype=blocktypedefAddSentence(self,sentence):self.sentences.append(sentence)defshow(self):print(+Str(Selfidentity)+start)foriteminself.sentences:item.show()print(-,+Str(Se

35、lfidentity)+”end)在BIOCk类中,用于形容基础块所对应的程序语句的变量名称为“sentences”,而变量sentences所对应的内容即为之后要在CFG控制流图中每一个节点内显示的内容,即一小段程序语句片段。同时,为了方便在CFG控制流图中利用有向线段连接节点,需要同时定义每一个基础块的传入基础块,即对应程序中的“parents”变量。因为在CFG控制流图中,每个节点可能由多个节点传入操作,所以变量parents被设置为数组形式以记录全部的有传入操作的基础块。除去基础块的定义,用于表示CFG控制流图中的有向线段也需要被定义,定义有向线段的Line类所对应的相关件码如用cla

36、ssLine(Object):def_init_(self,line_num=0,code=):self.content=codeself.line_num=line_numdef_str_(self):returnself.content#+(+str(self.line_num)+,)defline_to_sentence(self,codes):seiEcontent=codesself.line_num-1defshow(self):print(self.content+(+str(self.Iine_num)+,)由于在涉及循环语句、判断语句等特殊语法时,需要在CFG控制流图中解释程

37、序执行的原因,而这些原因的内容无法通过基础块进行表达,所以,本系统规定将这些用于解释程序执行原因的语句显示在有向线段上,即对应Line类中的变量Contem。当然,变量Contem在多数情况下的值都为空。最后,在图像展现层,我们通过规定一系列流程图绘制方案引导系统进行CFG控制流图的绘制。这其中,简单的变量定义和赋值的语句仅需通过单纯的有向线段连接相关的节点即可实现。而当涉及较为复杂的逻辑语句时,如经典的判断语句和循环语句,则需要单独对其绘制方法进行指定。第四章系统的实现系统开始运行后,展示给用户的初始界面如图4.1所示:图4.1初始用户界面整个系统的用户界面由三个部分组成:第一部分,文件选择

38、功能。该功能对应数据输入层,获取所需要进行可视化的对象文件;第二部分,代码内容显示功能,在获得可视化目标后,读入程序片段并进行数据处理,等待用于点击“开始”按钮后完成对CFG控制流图的绘制;第三部分,CFG控制流图展示功能。该功能在系统完成对CFG控制流图的绘制之后将其输出,并在目标文件夹下创建PNG图片文件。用户首先需要指定C源程序文件路径,方便系统读入代码。在“请选择文件”下单击“选择”按钮,会弹出一个选择框,供用户选择文件,如图4.2所示。C打开*1ESolidstatedisk(D:)Examplesv)ExamplesP名称修改日期蝇大B CkC2018/4/23 20:16C源II

39、) c2.c2018/4/23 19:26。源B c3,c2018/4/21 10:17C源B c4.c2018/4/23 18:24C源B c5,c2018/5/18 1:03C源AOneDrive?此电脑33D对象a三=图片图西不栽力音乐更面本地磁盘(C)_Solidstatedisk(D:)-E(E:)-F(R)文件名:cl.c图4.2选择C源程序文件弹窗在指定了C源程序文件的路径后,系统会读取源程序代码内容,并显示出来,如图4.3所示。图4.3读取文件后显示代码内容界面接着,用户点击“开始”按钮,系统内部就会对代码片段执行可视化操作并在右侧“CFG控制流图”区域内显示,如图4.4所示。

40、C1427406006请选择文件CFG控制流图图4.4系统输出CFG控制流图的界面在这个过程中,CFG控制流图的实现,包含了对每一类程序语句绘制方案的制定。这其中,判断语句和循环语句的实现是大多数CFG控制流图绘图的重点。第一,判断语句。在判断语句中,主要涉及If判断语句和SWitCh判断语句两类。对于If判断语句,尽管在程序执行的过程中只能同时执行其判断条件为“真”或“假”时一条分支下的程序语句,但最终在绘制CFG控制流图时,必须同时考虑两种情况下程序的执行逻辑,并在CFG控制流程图中并列地展现出来。所以,在系统编写的过程中,对If判断语句单独规定了基础块绘制的算法,相关代码如下:defPa

41、rseIfBlock(if_block,codes):blocks=ends=true_ends=false_ends=cond_end_flag=Falsetmp_blocks,cond-ends=CheCkBlOCks(if-block.cond,codes)blocks+=tmp_blockstmp_blocks,true_ends=CheckBlocks(if_block.iftrue,codes)iflen(tmp_blocks):forcond_endincond_ends:tmp_blocks0.parents.append(cond_end0,T)else:cond_end_f

42、lag=Trueblocks+=tmp_blocks(此处代码逻辑和True分支相似,故省略False分支下的程序片段)return(blocks,ends)除了必要的基础块起点终点节点的定义,还单独定义了If判断语句在程序中判定为“True”和“False”的分支下,有向线段连接后续节点的方式。图4.5两类判断语句If语句和Switch语句CFG控制流图举例和If语句相类似,Switch语句多用于进行判断和选择。Switch语句的绘制方式和If语句相似,如图4.5所示,我们必须考虑SWitCh语句中每类条件分别被触发后程序分别对应的执行语句,同样地,在CFG控制流图中并列地进行绘制。而实现这

43、一效果的算法,则是运用循环的思想,遍历每一类情况,并执行其分支下的操作。第二,循环语句。循环语句的中止和继续执行往往依赖判断是否跳出循环的判断语句。所以,我们可以将循环语句在跳出循环之前视作是封闭的、由多个重复的判断语句组成的程序执行语句。C源程序中主要涉及While循环语句、FOr循环语句和Do-While循环语句,而三者之间的区别十分明显:WhiIe循环语句在条件不满足时不会被执行,Do-WhiIe循环语句先进行一遍循环操作,再对条件进行判断,而For循环语句则自定义初始条件和循环跳出条件。因为其实现方式大同小异,所以此处仅对WhiIe循环语句的CFG控制流图的绘制进行分析。与判断语句不同

44、,独立的WhiIe循环语句只有一个出口,即为WhiIe条件不满足时才可以跳出循环。所以其CFG控制流图绘制的关键点依然是WhiIe条件的判断语句,当满足条件时,利用有向线段形成二?封闭循环的节W链。相关代码如下:defParseWhileBlock(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)iflen(

45、stmt_blocks):forcond-endincond_ends:stmt_blocks0.parents.append(cond_end|0|,|T)forstmt_endinstmt_ends:ifstmt_end|1=loop_goto_str|0andloop_goto_status101:#continuecond_blocks0.parents.append(stmt_end)loop_goto_statuslO=Falseelifstmt_end|1=loop_goto_strl1andloop_goto_status1:#breakreal_ends.append(stmt_end)lP-gto-status1=Falsecontinueelifstmt_end|1=loop_goto_strl2andloop_goto_statusl2:loop_goto_status2=Falseelse:cond_blocksOJ.parents.append(stmt-end)blocks+=stm

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号