Transactions on Computer Science and Technology June 2014, Volume 3, Issue 2, PP.73-80
The Design and Implementation of Programming Language Specification Inspection Model ——C language specification Xinyuan Niu, Cong Ma# Computer School, Beijing Information Science & Technology University, Beijing 100101, China #
Email: niuxinyuan@bistu.edu.cn
Abstract By studying programming language specification, a programming language specification inspection model is designed. This model is used to inspect programming language code specification for improving code maintenance efficiency. Automatic walkthroughs is implemented for the software maintenance process. Based on C programming language Regular Expression, The program is designed and implemented for inspection and modification for standard C language specification, to achieve the automatic code review. Lexical analysis is used the programming language regex construct, to complete various types of non-standard code matching regular expression for the C program identifier in header files, source code syntax and statements of lines of code.to finish the standardized C code inspection. The system is done by using Perl scripting language. The model and its implementation can be applied to automatic software maintenance process. Keywords: Automatic Software Maintenance, Specification Inspection Model, Code Walkthrough, Per, C Language Programming Specifications
编程语言规范检查模型的设计与实现* ——C语言规范 牛欣源1, 2,马聪1 北京信息科技大学 计算机学院,北京 100101 摘 要:研究编程语言规范,设计编程语言规范检查模型,运用该模型进行编程语言代码的规范检查,以提高代码维护效 率为目标,实现在软件维护过程中的自动代码走查。分析C语言编程规范,对C程序进行规范检查与修改,设计实现C语 言编程规范检查系统,完成自动代码走查。采用编程语言词法分析正则表达式,构造匹配各类不规范代码的正则表达 式,完成对C程序标识符、头文件、源程序语法格式和语句代码行的不规范代码检查,运用Perl脚本语言实现本系统。该 模型及其实现可应用于软件自动维护过程。 关键词:软件自动维护;规范检查模型;代码走查;Perl脚本语言;C语言编程规范
引言 软件维护是整个软件生命周期中最重要阶段,软件维护费用通常占软件总成本的40%-80%。对企业来 讲,软件维护费用年年上升。因维护工作不力,在维护已有软件的过程中耗费大量人力物力资源。对维护 人员来讲,维护性工作内容乏味,不易出成绩,工作量又不比开发人员少,工作不力或延误或丧失软件开 *
基金资助:北京信息科技大学计算机学院网络文化与数字传播北京市重点实验室开放课题;北京市属高等学校创新团队建设 与教师职业发展计划项目(IDHT20130519) ; 北京市教委专项(PXM2013_014224_000042,PXM2014_014224_000067) - 73 http://www.ivypub.org/cst
发时机。加之程序中没有足够的注释;没有良好的命名规范;也没有详细的软件说明文档,这会使软件的 维护时间、维护费用和期限增长。因此,如何降低软件维护费用,提高软件质量,对于软件开发至关重 要。严格代码编程规范是解决此问题的可行方案。编程规范,是提高软件维护效率而制定的一个规范。虽 然代码规范在软件开发阶段可能会增加软件开发时间,但会减少大量软件维护时间。编程规范能够有效解 决软件维护中出现的问题,有以下优势: 1. 规范代码可以促进团队合作。一个项目大多由一个团队完成,统一的编程风格使得代码可读性大大 提高。 2. 规范代码可以减少bug处理时间。在遵循规范的软件开发过程中,bug不但可以有效减少,而且查找 bug也变得容易。 3. 规范代码可以降低软件维护成本。维护工作不仅仅是能读懂原有代码,而是需要在原有代码的基础 上更新及维护代码。因此,统一的编程风格有利于软件长期的维护。 4. 规范代码有助于代码审查。编程规范不仅使软件开发统一,减少软件审查难度,也使审查有据可 查,大大提高审查效率和效果。 5. 养成按编程规范编写代码的习惯,有助于程序员自身的成长。 编程规范是指为提高软件维护效率而制定的一个规范。目前代码走查多由熟悉编程规范的程序员以人 工方式检查,这样做费时费力、效率低。目前代码走查的流程:由熟悉编程规范的程序员以人工方式检 查,这样做费时、费力、效率低。致使错误未能及时被找到,缺陷未能及早被发现,为软件今后的开发与 维护埋下隐患。要使得代码走查变得高效快捷,这个过程就应按照既定编程规范由程序代替人完成。C语言 规范检查系统就是基于此目的开发研制的一个系统。可以大幅度提高软件质量,减少代码走查时间,提升 软件开发及维护的质量和效率。
研究目标与研究方法
1
1.1 研究目标及手段 主要基于词法分析阶段的正则表达式分析和设计。在分析C语言编程规范的基础上,对正则表达式进行 解析,构造出可匹配不规范代码的正则表达式。并据此完成规范检查。 本系统分为3个模块:检查代码模块、修改代码模块和用户界面模块,并将已实现的编程规范分为4个 类型:命名规范、头文件结构规范、程序格式板式规范和语句代码行规范。 本系统需要达到的目标: 1. 正确检查出不规范代码并且将不规范代码打印输出,检查与修改的文件类型为C程序的源文件和头 文件。 2. 要求本系统对多个C程序进行测试,做到稳定运行,运行结果正常,并不会出现异常终止情况。 研究手段及实验开发环境包括Microsoft Windows 7 Corporation,开发平台采用UltraEdit,开发语言为 Perl脚本语言和批处理命令,代码解释器为ActivePerl。
1.2 研究理论与方法 本系统功能为对C程序源文件和头文件进行代码检查及修改操作,并能够在多用户界面下进行操作。本 系统不会因为打开多用户界面而导致系统出现异常情况,也不会对C程序的检查及修改操作带来影响。Perl 语言内部集成正则表达式规则匹配C程序,将不规范代码输出到指定文本文件中。对正则表达式进行的操作 有:匹配、替换和转化,本系统开发用到了前两种操作。 1.2.1
词法分析设计
编译器第一个步骤称为词法分析或扫描。词法分析器读入组成源程序的字符流,并且将它们组织成为 - 74 http://www.ivypub.org/cst
有意义的词素序列。对于每个词素,词法分析器产生如下形式的词法单元( token)作为输出:<tokenname , attribute-value>。 1. 词法单元由一个词法单元名和一个可选的属性组成。词法单元名是一个表示某种词法单位的抽象符 号,比如一个特定的关键字,后者代表一个标示符的输入字符序列。词法单元名字是由词法分析器处理的 输入符号。 2. 模式描述了一个词法单元的词素可能具有的形式。当词法单元是一个关键字时,其模式就是组成这 个关键字字符序列。对于标识符和其他词法单元,模式是一个更加复杂的结构,可以和许多符号串匹配。 3. 词素是源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单 元的一个实例。 1.2.2
正则表达式设计
正则表达式,在Perl语言中称为模式,是一个匹配(或不匹配)某字符串的模板。虽然有无限多可能的 文本字符串存在,但只要有一个模式就可以将它们分为两组:匹配的串和不匹配的串。正则表达式可以用 来验证字符串是否符合指定特征,可以用来查找字符串,从一个长的文本中查找符合指定特征的字符串, 比查找固定字符串更加灵活方便,也可以用来替换已有的字符串。 正则表达式是一种用来描述词素模式的重要表示方法。虽然正则表达式不能表达出所有可能的模式, 但是它们可以高效地描述在处理词法单元时要用到的模式类型。 归纳步骤:正则表达式可以由较小的正则表达式按照一些规则递归地构建。假定r和s都是正则表达式, 分别表示语言L(r)和L(s),那么: 1. (r)|(s)是一个正则表达式,表示语言L(r)∪L(s)。 2. (r)(s)是一个正则表达式,表示语言L(r)L(s)。 3. (r)*是一个正则表达式,表示语言(L (r)) *。 4. (r)是一个正则表达式,表示语言L(r)。最后这个规则是说在表达式的两边加上括号并不影响表达式 所表示的语言。 正则表达式在Perl语言中的基本运算举两个实例说明: 例1: if (($code =~ m{a}) && ($code =~ m{b})) 本语句实现正则表达式的并运算,运算符为“&&”。$code =~ m{a}作为一个正则表达式,表示变量$code 中要存在小写字母a。$code =~ m{b}作为另一个正则表达式,表示变量$code中要存在小写字母b。如果变量 $code中的字符串既存在小写字母a又存在小写字母b,则返回值为1。若有一个条件不成立,则返回值为0。 例2:[a-z]+ 作为一个正闭包的正则表达式,表示可以有一个或多个小写字母。 1.2.3
正则表达式的扩展
自从Kleene在20世纪50年代提出带有基本运算符并、连接和Kleene闭包的正则表达式之后,已经出现了 很多种针对正则表达式的扩展,它们被用来增强正则表达式描述串模式的能力。 1.一个或多个实例。单目后缀运算符 + 表示一个正则表达式及其语言的正闭包。也就是说,如果r是一 个正则表达式,那么 就表示语言 。运算符 + 和运算符 * 具有同样的优先级和结合性。两个有用的代数定律 = |ε和 =r = r说明了Kleene闭包 * 和正闭包之间的关系。 2.零个或一个实例。单目后缀运算符 ? 的意思是“零个或一个出现”。也就是说,r? 等价于r|ε,换句 话说,L(r?) = L(r)|{ε}。运算符 ? 与运算符 + 和运算符 * 具有同样的优先级和结合性。 3.字符类。一个正则表达式a1|a2|„|(其中 是字母表中的各个符号)可以缩写为[a1a2„]。更重要的 是,当a1,a2,„, 形成一个逻辑上连续的序列时,比如连续的大写字母、小写字母或数位时,可以把它 - 75 http://www.ivypub.org/cst
们表示成a1—。也就是说,只写出第一个或最后一个符号,中间用连词符隔开。因此,[abc]是a|b|c的缩写, [a-z]是a|b|„|z的缩写。 1.2.4
正则表达式实例
现对Perl语言中使用的正则表达式实例说明。例如:匹配模式语句为if ($code =~ m{abc}),其中“=~ m”为匹配符。如果变量$code中存在abc字符串,则返回值为1,反之,返回值为0。替换模式语句为$code =~ s{abc}{x},其中“=~ s”为替换符。将变量$code中的abc字符串全部替换成x,如果$code中无abc字符 串,则变量$code不改变。
实验方法及实验过程
2
2.1 规则的定义 实现C语言编程规范中的编程规则。将C语言编程规范分为4个类型规则:命名规则、头文件结构规则、 程序格式板式规则和语句代码行规则。 以下对4个类型规则进行说明: 1.命名规则:对函数名、宏名和文件名进行命名要求。 2.头文件结构规则:每个头文件中应包括保护语句要求。 3.程序格式板式规则是一个统称规则,其中细分为:代码行规则、代码段内空格规则、格式对齐规则、 长行拆分规则、修饰符位置规则、注释规则。 4.语句代码行规则也是一个统称规则,其中细分为:表达式规则、声明与定义规则、浮点型变量的规 则、指针变量的规则、函数规则、控制语句规则、全局变量规则。 各规则中涵盖1-4条C语言编程规范中的要求,本检查模块涉及标示符命名、头文件保护语句、程序格 式、注释、各类型变量的定义及使用、函数、指针等规范要求,满足企业进行C程序的代码走查。
2.2 规则的检查 本系统以函数为单位实现编程规范中的各条规则,各函数间大多没有联系。本系统以Perl脚本语言编写 而成,因脚本语言是按行读入C程序,被读入的C程序每一行都要进入各规则函数进行检查。由于各规则函 数都有其限制条件,从而有效地避免错误检查情况的发生。 本系统在主函数中调用各规则函数,各规则函数间成并行关系,不会相互调用,从而避免发生冲突情 况。各规则函数需要给予两个实参,分别为本文件名.类型名和当前行代码。如果检查出不规范代码,则该 行代码会被打印在相应的文本文件中。各函数的限制条件基于Perl语言的匹配原则和内部集成的正则表达式 功能,从而正确有效找出不规范代码。 Perl脚本语言的变量及函数使用说明如下。 1.变量。Perl语言中的变量作为一个数据单元,可以存储数字或字符串,并且存储长度无限。变量以 “$”开头后之加变量名。例如:$code。 2.函数的使用。本系统用到的系统函数主要有:print函数,打印输出字符串;split函数,分割字符串; grep函数,从某数组中查找字符;foreach函数,遍历函数。其他自定义各规则函数,通过sub定义函数,以 “&”调用各函数。
2.3 规则函数实现 篇幅所限,举一例说明。 2.3.1
头文件结构规则及检查规则说明 - 76 http://www.ivypub.org/cst
本规则检查C程序的头文件中头文件保护语句是否规范,本规则的主要目的是防止头文件重复编译,减 少程序编译时间。本规则要求头文件保护语句的规范格式为: 首行: #ifndef 本文件名_H; 第二行: #define本文件名_H; „„ 最后一行:#endif 2.3.2
函数设计
表1为头文件结构规则的详细说明。 表 1 头文件结构规则的详细说明 函数名
2.3.3
参数
UpdataHeadFilePara()
$filename, $result
CheckHeadFilePara()
$filename
涉及变量 $first_line_flag $second_line_flag $first_line $second_line $last_line $define_file_name $first_line $second_line $last_line $unregu_flag
功能
提取头文件保护语句的三行有效的代码并 保存
将已保存三行代码与规范格式依次比对查 看是否一致,若不一致则打印输出
本规则检查函数的实现
实 现 本 规 则 需 要 设 计 2 个 函 数 。 第 1 个 函 数 为 UpdataHeadFilePara($filename, $result) , 第 2 个 函 数 为 CheckHeadFilePara($filename)。第1个参数为全局变量$filename中存储本文件名及类型名,第2个参数为全局 变量$result中存储一行源程序代码。第1个函数需要识别本文件是否是头文件,并且保存头文件的首行、第 二行和最后一行,保存代码行为非空行。第2个函数首先检查被保护文件名是否是本文件名,之后检查这三 行代码是否符合规范格式。若不符合,则在不规范代码文本文件中打印输出,并且全局变量$unregu_flag记 录不规范代码数量加1。 2.3.4 1
函数内部逻辑的实现 变量定义
第1个函数定义的全局变量为: $first_line_flag $second_line_flag
#首行被保存标志 #第2行被保存标志
$first_line
#存储首行代码
$second_line
#存储第2行代码
$last_line
#存储尾行代码
第2个函数定义的全局变量为: $define_file_name 2
#存储本文件名及类型名
内部逻辑说明 第1个函数:在头文件首行保存完之后,全局变量$first_line_flag将置1,使全局变量$first_line中的内容
不会被覆盖。当头文件第二行保存完之后,全局变量$second_line_flag将置1,使全局变量$second_line中的 内容不会被覆盖。全局变量$last_line变量保存当前行代码,当本文件所有行检查完后,全局变量$last_line变 - 77 http://www.ivypub.org/cst
量保存的代码为头文件最后一行代码。 第2个函数:首先提取本文件名,保存在全局变量$define_file_name中。之后使全局变量$first_line、 $second_line和$last_line与规范格式比对。若有一行匹配不成功,则三行全部在不规范代码文本文件中打印 输出,全局变量$unregu_flag加1。 3
流程图 UpdataHeadFilePara()函数实现的流程图如图1所示。 开始
本文件是否是头文 件,本行是否是空行
是源文件或是空行
是头文件并且不是空行 $first_line_flag是否 有效
无效
有效 $first_line保存本行代码
$first_line_flag赋值为无效
$second_line_flag是 否有效
无效
有效 $first_line_flag是 否有效
有效
无效 $second_line保存本行代码
$second_line_flag赋值为无效
$last_line保存本行代码
结束
图1
3
UpdataHeadFilePara()函数流程图
实验结果
3.1 系统流程 本系统以批处理文件作为用户界面,检查C程序类型为源程序和头文件类型。本系统的基本操作为:用 户选择存放C程序的文件位置,之后选择检查或修改选项,这时本系统开始检查或修改操作。如果被检查出 C程序中存在不符规范语句,系统会将检查结果以两个文本文件的形式输出,第一个文件输出未初始化的全 局变量与指针;第2个文件输出其余违反C语言规范的C程序,文本文件按检查结果选择性输出。当本系统检 查或修改完代码后,系统会自动返回到用户界面上。C语言规范检查系统处理流程示意图如图2所示。 - 78 http://www.ivypub.org/cst
开始 选择操作选项
修改代码选项
进入批处理文件界面 检查代码选项 选择默认路径选项
修改代码中不规范的空格
逐条检查C程序
选择文件夹路径 选择手动输入路径选项
是否出现全局 变量未初始化
出现
输出记录未初始化全 局变量的文本文件
出现
输出记录其余不规范 代码行的文本文件
输入检查文件夹路径 未出现 是否出现其余不 规范代码
进入指定文件夹
未出现
返回用户界面
进入默认文件夹 结束
图2
C语言规范检查系统处理流程示意图
3.2 系统功能框架 本系统功能为检查C程序是否符合编程规范和修改代码中不规范空格。本系统分为3个模块:检查代码 模块、修改代码模块和用户界面模块。检查代码模块与修改代码模块之间没有联系,相互不会发生冲突。 系统功能模块示意图如图3所示。 C 语 言 规 范 检 查 系 统
检查代码模块 修改代码模块 用户界面模块
图3
系统功能模块示意图
3.3 系统基本功能运行 3.3.1
用户界面模块运行
用户界面以批处理文件实现。系统用户界面的主界面运行效果如图4所示。
图4
系统用户界面的主界面运行效果图
用户输入选项前对应数字,完成对本系统功能的选择。下图展示C语言编程规范中头文件规则的规范内 容。 操作步骤:用户输入数字2回车,选择规范说明选项;之后输入数字2回车,选择头文件结构;系统会 在主界面中输出头文件保护的规范语句信息。其他规范信息和帮助信息通过输入对应的数字来完成,展示 效果与本操作类似。系统用户界面规范内容展示如图5所示。 - 79 http://www.ivypub.org/cst
图5
4
系统用户界面规范内容展示效果图
结语 本系统以提高代码走查效率为宗旨,从而为企业减少软件维护时间与费用,并为软件升级开发节省时
间。本系统使用正则表达式作为实现系统功能的基本原理,并将批处理命令与Perl语言相结合。本系统的难 点在于是否能准确检查出C程序中不规范代码,并在大量程序检查过程中,系统不会异常终止。本系统实现 了38条C语言编程规则,可以初步满足企业对自身C程序代码质量进行提高与完善。本系统考虑了可扩展性 与移植性,便于今后进行功能维护和系统升级。仍存在以下问题,每一条编程规则检查的不规范模板并不 精准,大多数不规范模板不适用一行代码多行书写的情况,有局限,若将代码行多行书写,则检查效果就 大大降低。不规范模板或模型的构建技术仍需优化,做到在一行代码中只要出现不规范的地方,系统就会 打印输出该行。这需要提升C程序词法分析和正则表达式技术的模型整合度,优化适用于各种各样的C程序 代码的规则模型和不规范模板。
REFERENCES [1] Randal L.Schwartz.Perl Language Introduction [M].fifth.Nanjing: Southeast University Press, 2009 [2] Guo youqiang.C Language Programming [M].Beijing: Tsinghua University Press, 2009 [3] Brian W.Kernighan, Dennis M.Ritchie. C Language Programming [M].second.Beijing: Machinery Industry Press, 2011 [4] Chijian, Liu yanfei. C Language Collection [M].Beijing: Electronic Industry Press, 2009 [5] Andrew Koenig.C Traps and defects [M].Beijing: People Post Press, 2008 [6] Zou zhizi. Batch Processing Command Application in Windows [M]. Beijing: People Post Press, 2008 [7] Ron Patton. Software Testing [M]. second.Beijing: Machinery Industry Press, 2006:13-127 [8] 1.0.1-2009, C language programming specifications [S] [9] Huawei-2010, C language programming specifications [S] [10] Baidu Encyclopedia.UltraEdit Introduction[EB/OL].[2012-1-10].http://baike.baidu.com/view/3184.htm [11] Alfred V.Aho.Compilers[M].Second Edition.beijing: China Machine Press, 2011 [12] chromatic.Modern Perl[M].Nether land: Onyx Neon Press, 2010
【作者简介】 1
牛欣源(1965年),女,汉,工学学士,副教授,计算机软件设计技术,1986年西电子科技大学计算机学院本科毕业。
Email: niuxinyuan@bistu.edu.cn - 80 http://www.ivypub.org/cst