APP下载

一种从源程序代码到标准流程图的转化方法

2019-06-07宋倩

软件导刊 2019年1期
关键词:流程图

摘 要:流程图可清晰、直观地表示算法执行流程和程序结构,将程序源码直接转化成流程图的方法多样。流程图结构與程序源码紧密相关,但目前缺乏将流程图标准化的统一方法。因此提出一种将程序源代码转换为标准流程图的方法。首先参照ISO 5807:1985标准,定义标准化流程图节点、边类型及其结构;然后提出将基于特定程序语言的流程图转换为标准化流程图定义的方法;最后通过实例具体说明该方法标准化规则。实验结果表明,该方法将源代码转换为标准流程图的操作行之有效。

关键词:源程序代码;流程图;标准流程图定义;流程图标准化方法

DOI:10. 11907/rjdk. 182612

中图分类号:TP301文献标识码:A文章编号:1672-7800(2019)001-0065-04

Abstract: A flow chart clearly and intuitively represents the execution flow and program structure of the corresponding algorithm. Many methods and tools can directly convert the program source code into a flowchart, but the structure of the obtained flowchart is closely related to the program source code, and there is still no unified method to further standardize the flowchart. This paper presents a method for converting program source code into a standard flowchart. Firstly, by referring to the ISO 5807:1985 standard, the nodes, edge types and their structures of the standardized flowchart are defined. Then, the method of converting the flow chart based on the specific programming language into the standardized flowchart definition is given. Finally, the standardization rules of the method are specifically illustrated by examples. The results show that the method is effective to convert source code to standard flowchart.

0 引言

在软件项目开发过程中,程序流程图是软件开发人员必不可少的工具。流程图一般由平面图节点、边和文字标号构成,可以清晰地表示算法执行流程和程序整体结构。在很多复杂的程序设计过程中,通常先用流程图描述算法整体思路,再依据流程图编写出对应的程序代码。此外,在代码分析中,流程图可清晰地展示程序整体结构,用它分析程序结构远方便于直接分析源程序代码本身[1]。现有许多方法和工具可把程序源码直接转化成流程图[2-5]。但是在实际工作中,利用现有工具得到的流程图与源代码紧密相关,有时将程序代码转换成流程图的工作并不需要体现具体的代码语句,为将流程图进一步标准化,也不仅局限于源程序代码的具体内容,目前还没有一个统一的方法。

针对上述问题,本文提出一种从源程序代码到其流程图的标准转化方法,分别定义流程图节点类型和边类型,将节点、边及结构标准化后生成对应的标准流程图,并通过实例具体说明该方法的转化规则。

1 相关工作

理解一个源程序的首要任务是弄清其逻辑结构,包括控制依赖结构和数据依赖结构。其中,程序控制依赖结构包括程序整体结构与控制流程结构。程序整体结构描述程序单位 (如过程、函数或子程序)间的调用关系及联系信息,并以程序结构树的形式(即程序调用结构图或程序模块图)简单明确地刻画其结构;控制流程结构描述程序控制结构传递和流向,并以程序流程图的方式详细刻画程序单位结构[6]。

流程图用具有各种确定含义的符号、简洁的说明文字和各种连线描述某一个问题(或某一项工作)的定义、分析或解决方法,图中各种符号表示操作、数据、流向等,被广泛用于描绘各种类型的信息处理问题[7-10]。随着计算机学科的迅速发展,流程图在诸多领域得到广泛应用。

美国国家标准化协会(American National Standards Institute)规定了一些常用流程图符号[11-14],已被世界各国程序人员使用。文献[8]介绍了通过流程图表示一种算法执行流程和程序整体结构的方法。1973 年美国学者Nassi& Shneiderman提出一种不允许破坏结构化构造的工具,并以他们二人的名字命名,称为N-S结构化流程图,该图去掉带箭头流程线,将全部算法写在一个矩形框内,其基本元素也是一个框,可以包含其它从属性元素。

2 标准转化方法

2.1 标准流程图定义

根据ISO 5807:1985标准[15],流程图一般由平面图节点、边和文字标号构成。本文对流程图元素进行综合分析,从节点类型、边类型和结构类型3方面进行标准流程图元素定义。

(1)节点类型。程序流程图表示程序操作顺序[16],程序代码经过转换成为流程图的节点和边,一个节点对应一种类型。本文在标准化流程图节点、边的基础上,结合流程图结构,给出标准流程图节点类型,见表1。

(2)边类型。用户可通过流程图边的走向了解工作具体流程,而边是由控制依赖关系决定的,因此制定标准化流程图时将边分为两种类型:数据依赖边(Data Dependency Edge,DDE)和控制依赖边(Control Dependency Edge,CDE),见表2。针对两种边的性质,本文给出如下定义:

定义1数据依赖边:如果存在变量Var,则从程序节点V 1到V2存在数据依赖边满足:①可以通过指针直接或间接地将V1赋值给VAR;②V2可直接或间接通过指针使用VAR中的值;③程序中存在执行路径,从对应于V1节点的代码到对应于V2节点的代码,沿着该路径没有给变量Var任何赋值。

定义2控制依赖边:如果条件的取值控制下一节点的执行,则存在从control或loop节点到下一节点的控制依赖边。

[边类型\&边描述\&边图符\&DDE\&数据依赖边\&\&CDE\&控制依赖边\&\&]

(3)结构类型。程序中循环结构,如for循环、while循环、do-while循环等,在一定程度上均可实现相同功能,但是利用现有工具和方法生成的流程图样式却不相同,表3列出了各种循环结构利用现有工具生成的流程图样式和标准化后的结构样式。

由表3可以看出,3种不同循环结构利用现有工具生成的流程图样式不同,在进行标准化时,以for循环为参照,while和do-while循环统一转化成与for循环结构一样的形式。

2.2 特定语言流程图转换为标准流程图的方法

将基于特定程序语言生成的流程图转换成标准流程图时,需将基于特定程序语言的流程图中的节点、边和结构对照标准流程图定义进行转换,再合并相邻同种节点类型无逻辑关系的节点;为应对代码抄袭中的常用混淆手段,如多余的变量声明、添加冗余代码等,还需根据标准化流程图进一步生成主流程图[17-20]。整个流程包括4个步骤:

(1)節点与边标准化——映射。定义(映射)两个非空集合A与B间存在对应关系f,而且对于A中的每一个元素x,B中总有唯一元素y与之对应,将这种对应为从A到B的映射,记作f:A→B。

有时将程序代码转换成流程图的工作无需体现具体的代码语句,因此需要将节点和边一一映射转换为标准流程图中的节点和边。将程序代码转换成对应的流程图,边根据类型定义相应转换成数据依赖边和控制依赖边。

(2)结构标准化。如果两段代码使用不同类型的循环结构或相同循环结构的不同形式,则流程图中循环结构也可能不同。如在图3中,有的循环结构在生成的流程图中只体现判断条件语句的节点,初始化语句和控制条件语句自动省略,而有的循环一句对应生成一个节点,不便于用户利用流程图理解程序的循环结构。此时标准流程图代表判断条件语句的节点统一变为loop类型,按照结构标准化转化规则,将按照程序源码生成的流程图中代表初始化语句和控制条件语句的两个节点删除。边集e根据类型定义相应转换成数据依赖边和控制依赖边。

(3)无逻辑关系节点合并。两个节点一一映射转换成对应的节点类型,若两个相邻节点是同一类型,判断两个节点之间是否有逻辑关系,即数据依赖关系和控制依赖关系。若无逻辑关系,则将两个相邻的同种类型节点合并在一起。如图1所示,a=1和b=1两个相邻节点一一映射成同一种节点类型,而且两者无任何逻辑关系,因此可以合并成一个"assign"节点;同样将两个节点的顺序交换,也可以合并成一个。

(4)主数据流图生成。结合传统的程序依赖图(Program Dependency Graph, PDG),把输出程序结果的语句转换成流程图节点输出标记,在程序流程图生成后,从流程图输出节点开始图的深度遍历,进而得到一个最大连通图,删除不在最大连通图中的节点,最终得到的程序流程图被称为主流程图。

对于利用解析程序生成的流程图,如果抄袭者添加一些无用代码,会导致产生多余图节点,无用代码对程序运行结果不产生影响,因此可去除冗余节点。从该角度分析可知,凡是与输出结果无关的图节点都应删除,该过程即为主数据流图的生成过程[10]。

3 转化实现

本部分通过一个实例说明特定语言流程图转换为标准流程图的方法。为利用Java实现求n的阶乘,分别运用while和for循环结构,利用现有工具生成的流程图样式分别见图3和图4。

从两者生成的流程图中可以看出,for循环中5节点的控制语句只体现了i<=n这一句,i=1和i++被自动省略,而在while循环中由于这3句是分开写的,所以均被体现出来,且一句代表一个节点。因此结构标准化时,删除while循环结构流程图代表i=1和i++两个语句的节点,边集e根据删除的两个节点和依赖关系进行相应改变,实现流程图结构标准化。

4 结语

本文提出了一种从源程序代码到其流程图的标准转化方法,定义了流程图节点类型和边类型、节点、边以及结构标准化后生成对应的标准流程图,并通过实例具体说明该方法的转化规则。

下一步将从以下3个方面进行深入研究:

(1)由于标准化后的流程图节点不受具体代码语句或编程语言约束,因此可考虑继续深入研究基于流程图的跨程序语言代码相似度检测。

(2)本文方法对于检测控制结构级的代码冗余和错误还有上升空间,可继续优化流程图标准转换。

(3)对于将程序源代码转化成流程图的工作,有的实验系统现在仅提供对应接口,用于集成到其它系统中,后续工作可将系统实现为一个用户界面友好的工具,既可单独使用也可服务于其它软件以供集成使用。

参考文献:

[1] 朱云, 曾晓勤, 朱宁,等. 基于图文法的程序流程图与源代码自动转换[J]. 计算机工程与科学, 2015, 37(5):937-945.

[2] 天涯海角路.几款代码转流程图软件[EB/OL]. https://www.cnblogs.com/aademeng/articles/6905245.html.

[3] 丁忠俊. 从源程序到流程图的转换方法及实现[J]. 计算机科学与探索,1993(5):34-39.

[4] GB/T 1526—1989.信息处理数据流程图、程序流程图、系统流程图、程序网络图和系统资源图的文件编制符号及约定[S].

[5] ANNOMIT Y. Information processing: documentation symbols and conventions for data, program and system flowcharts, program network charts and system resources charts: ISO 5807:1985[S/OL].http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=11955.

[6] GB/T 5271.1—2000.信息技術[S].

[7] 童天添. 科技期刊信息处理类流程图的编辑加工[J]. 编辑学报, 2017,29(1):33-36.

[8] 谭浩强. C程序设计[M]. 第4 版. 北京:清华大学出版社,2010:19-28.

[9] 严蔚敏. 数据结构:C语言[M]. 北京:清华大学出版社,2011:13.

[10] 胡正军. 程序代码相似度检测方法研究及应用[D]. 长沙:中南大学,2012.

[11] 李沐东. 教学设计流程图符号的标准化问题[J]. 教育传播与技术,2006(1):52-54.

[12] 孙林,岳丽华,贾文举. 一种从源程序代码到其流程图的自动转换算法[J]. 网络新媒体技术,2001,22(3):181-186.

[13] 杨超培. 程序化一种重要的标准化方法[J]. 信息技术与标准化, 1999(1):25-25.

[14] 刘大为. 一种经改进的流程图[J]. 质量指南, 1995(3):12-13.

[15] 波尔. 结构化与面向对象程序设计[M]. 第7版.北京:电子工业出版社,2008.

[16] SHIBUTANI T,ONOGUCHI M,YAMADA T,et al. Optimization of the filter parameters in (99m)Tc myocardial perfusion SPECT studies: the formulation of flowchart[J]. Australasian Physical & Engineering Sciences in Medicine,2016,39(2):571-581.

[17] 廖湖声. 基于程序流程图的数据例化与程序例化[J]. 计算机学报,2001,24(9):985-990.

[18] 冯晓宁,李麒星,王卓. 一种基于BPMN的业务流程图到BPEL的映射方法[J]. 计算机研究与发展,2013,50(s1):44-52.

[19] 汪文勇,王学东,向渝,等. 汇编嵌入式软件程序流程图自动生成的研究[J]. 计算机科学,2005,32(2):173-175.

[20] 黄烟波,赵旭华,刘中宇. 基于.NET的流程图绘制程序的设计与实现[J]. 计算机技术与发展,2007,17(5):231-233.

猜你喜欢

流程图
专利申请审批流程图
专利申请审批流程图
HTML 5 Canvas技术在工程流程图中的研究与应用
宁海县村级权力清单36条
《天津医药》稿件处理流程图
《天津医药》稿件处理流程图
《天津医药》稿件处理流程图
《天津医药》稿件处理流程图
《天津医药》稿件处理流程图
《天津医药》稿件处理流程图