APP下载

表驱动代码生成技术在编译器中的应用❋

2015-08-07齐晓斌

微处理机 2015年3期
关键词:代码生成编译器代码

林 卓,齐晓斌,卫 进

(中航工业西安航空计算技术研究所,西安710119)

表驱动代码生成技术在编译器中的应用❋

林 卓,齐晓斌,卫 进

(中航工业西安航空计算技术研究所,西安710119)

针对MDA(模型驱动架构)领域的新背景,结合编译器技术,提出了一种基于表驱动的代码自动生成技术。该技术应用在编译器后端,实现中间代码到目标代码的生成,尤其当目标代码数量大、结构复杂时,该技术的优势将会更加明显。经过实验验证,表驱动代码生成技术在具有通用代码生成技术优势的同时,不仅提高了生成效率,而且降低了代码的耦合度和逻辑控制复杂度。以数据为中心,实现了数据与控制相分离,使整个系统具有良好的可维护性和扩展性。

表驱动;代码自动生成;编译器

1 引 言

编译器主要实现翻译功能,以一种程序语言作为输入,以另一种等价的程序作为输出[1],输出的程序可以是汇编语言也可以是其他高级语言。传统的编译器一般以汇编语言作为输出,而某些新型编译器则使用其他成熟的程序语言作为目标语言,这种编译器的输入一般比较简单,甚至只是单一的模型描述文件,而生成的目标代码则是功能强大的框架代码程序,不仅文件数量大,而且组织层次复杂。在模型驱动的体系结构中,新型编译器的应用越来越广泛。

面对这种新的应用场景,传统编译技术显的力不从心,尤其在编译器后端实现从中间表示到目标语言映射时暴露出效率低、代码可维护性差等缺点。提出了一种基于表驱动的代码自动生成技术,它高效地实现了从编译器中间表示到目标语言的映射,降低程序间的耦合,并且具有较好的通用性和可维护性等优点。

2 编译器结构

编译器是一个复杂系统,按照其工作的不同性质将其分为前端和后端,之间通过中间表示IR联系起来。前端依赖于源语言;后端的输入取决于中间表示,与源语言无关,输出依赖于目标语言,主要包括优化阶段和目标代码生成阶段。

设计了一种编译器,以一种建模语言文件为输入[2],经过编译器前端生成中间表示,最终由后端生成C++框架代码。着重研究该编译器的后端,即采用何种方式生成目标代码。

3 通用代码自动生成技术

通用代码自动生成技术是对代码自动生成技术普遍遵守的特性进行的归纳和总结[3-5]。该技术主要由三部分组成:模板、输入数据、代码生成器。下面就使用这种技术设计一款存在于编译器后端的代码自动生成系统。

(1)模板

代码生成系统中的模板定义了通用程序流程框架,体现了此类程序的同构性。模板代码中将共性部分一次性写成,异性部分通过每次代码替换生成,这种共性和异性的合体称之为模板。

(2)输入数据

代码自动生成系统中输入数据就是中间表示IR。在代码自动生成过程中,需要对中间表示进行不断扫描,提取出相应信息生成特殊代码段,用于对模板中标签的替换。

(3)代码生成器

代码生成器是代码自动生成系统的引擎,模板和输入数据等资源由它统一调配,是代码生成系统的核心。通用代码生成器的流程如图1所示。

图1 代码生成器流程图

代码生成器启动后,首先根据输入信息加载模板文件,加载的模板文件可能只是库中的一部分。然后遍历相匹配的模板子库,对模板文件进行处理,处理流程如图2所示。

图2 模板处理流程

模板代码主要由静态代码和动态代码组成。静态代码是模板程序中的不变部分,在进行模板操作时直接输出,不做修改;动态代码是模板程序中的可变部分,在代码产生过程中,要完成相应标签的替换,才能形成最终的目标代码[6]。模板处理实际是对模板文件的分析过程,针对不同内容进行分类处理。其中,标签代码生成部分是复杂的逻辑处理过程,需要结合IR中的信息和标签特征信息,生成特殊代码段。当模板文件与标签之间的组合关系增多时,逻辑处理程序将会愈发复杂。

4 表驱动代码自动生成

通用代码自动生成技术能够满足后端代码生成系统的功能要求,但仍存在一定的设计缺点,主要表现在以下三个方面:

(1)文件操作频繁,降低系统运行效率。

通用代码生成器对模板文件逐个进行扫描和分析,完成代码替换后进行输出。内存和外存数据交换次数多,文件操作频繁。

(2)逻辑处理复杂,条件判断过多,降低代码可维护性和执行效率。

通用代码生成器流程在进行标签代码生成时,存在大量的判断语句。当前系统中存在15种公共标签、54种特殊标签和153个模板文件,针对“每个模板文件中含有何种标签,每种标签做何种处理?”这个问题,即使对这些模板和标签进行恰当分类,程序中条件判断的次数也会非常多,带来复杂的逻辑处理过程,不便代码维护,容易引入错误。

(3)信息处理分散,影响功能模块化;代码耦合程度高,给后期的修改和扩展功能带来困难。

针对普通代码自动生成存在的缺陷,提出基于表驱动的代码自动生成技术。表驱动的方法是将各类信息归类到一张表中,当需要特定信息时,可以直接从表中进行查找,而不用过多的逻辑判断语句就能获得对应结果。当判断逻辑比较简单时,采用逻辑判断语句会更加明了,但随着判断逻辑的复杂化,表驱动的优势就越来越明显[7]。基于表驱动的代码生成器工作流程如图3所示。

图3 基于表驱动代码生成器流程

在表驱动代码生成器中,驱动表处于核心地位,它以XML文件的方式存储在本地。在代码生成器启动时,加载驱动表配置文件到内存中,形成内存中的“驱动表”。它的单个表项如表1所示,包含模板的各类信息,需要提取信息时,可以查找表获取,既免去大量的逻辑判断,又可以使功能模块更加清晰、处理更加集中。

表1 驱动表中单个表项

单个表项中信息分为四项:①模板文件名;②模板类型,用于区分不同的子库;③文件属性,用于区分该文件是头文件或源文件,两种文件最终的输出目录不同;④标签信息,是驱动表中的核心属性,显示当前模板文件包含的所有标签信息。

驱动表中的标签信息借鉴了PSW(Program StatusWord程序状态字)[8]的思想,它是一个立即数,以每一位的状态来区分各类标签信息,如图4所示。

不同的“位”代表不同的标签,在某一位中1代表此模板文件含有这个标签,0则反之。例如表1中的标签SET_ATTRIBUTE值为0x10,GET_ATTRIBUTE值为0x20,通过“与”操作,驱动表中标签信息属性相应的二进制位被置为“1”,即该模板文件中含有上述两个标签。

图4 标签信息PSW

基于表驱动的代码生成技术解决了通用代码生成技术存在的问题,优化主要体现在以下三大方面:

(1)文件操作处理集中,减少文件操作频率。

通过查询驱动表,将类型相符的子模板库全部加载到内存缓冲区,在内存中完成字符串替换工作,最后统一进行目标文件输出,这样文件操作频率将大大降低。

(2)以驱动表为中心,借助函数路由机制,完成动态代码生成。

驱动表包含了模板信息、标签信息、以及两者之间的对应关系等信息,因此不需要进行复杂的逻辑判断,只要通过查表就可获得所需信息。函数路由器根据标签PSW位信息,调用对应的处理函数来生成动态代码。

(3)使用驱动表配置文件,实现代码的松耦合。

驱动表以xml文件的方式存储在本地。只需修改配置文件中的相关项,即可完成增加标签信息、修改模板文件及标签对应关系等操作,代码几乎不用变动。

5 实 验

为对比上述两种代码生成技术的生成效率,使用两种代码生成技术进行代码自动生成实验。

表2中,列举了5个测例,使用两种代码生成技术生成相同行数的目标代码,对所消耗的时间进行对比。

表2 代码生成耗时统计

图5是两种技术生成每万行代码所消耗时间的趋势图。可以看到,表驱动代码生成技术所消耗的平均时间约为通用代码生成技术的1/2。而效率方面的提高,仅仅是表驱动代码生成技术诸多优势中的一个方面。

图5 每万行代码花费时间

6 结束语

表驱动的代码生成技术可以应用在编译器后端,从而实现目标代码的自动生成。尤其当目标代码数量大、结构复杂时,表驱动代码生成技术的优势将会更加明显,它与一般的代码生成技术之间的对比如表3所示。

通过分析可得,表驱动的代码生成技术不仅提高了生成效率,并且降低了代码耦合度、逻辑复杂度,实现了数据与控制相分离,使系统具有良好的可维护性和扩展性。

表3 两种生成技术对比

[1] Cooper,K.D.编译器工程[M].北京:机械工业出版社,2006.

Cooper,K.D.Engineer a Compliler[M].Beijing:China Machine Press,2006.

[2] 林卓,吴健,万豪,等.分布式仿真环境下虚拟试验对象建模技术研究及应用[J].计算机测量与控制,2012(11):3011-3013.

Lin Zhuo,Wu Jian,Wan Hao.In the environment of Distributed simulation the research and apply on virtual testmodeling technology[J].Computer Measurement&Control,2012(11):3011-3013.

[3] 陈翔,王学斌,吴泉源.代码生成技术在MDA中的实现[J].计算机应用研究,2006(1):147-150.

Cheng Xiang,Wang Xuebin,Wu Quanyuan.Code Generating Implementation in Model Driven Architecture[J].Application Research of Computers,2006(1):147-150.

[4] 赵跃华.基于敏捷方式的Java代码生成方法的设计[J].计算机工程与设计,2009(12):3018-3021.

Zhao Yuehua.Design of Java code generation on agile[J].Computer Engineering and Design,2009(12):3018-3021.

[5] 魏驰,吴健,宋银,等.虚拟试验对象框架代码自动生成技术的研究与实现[J].计算机测量与控制,2012(10):2745-2748.

Wei Chi,Wu Jian,Song Yin,et al.Study and Implementation of automatic code generation technology for virtual test object framework[J].Computer Measurement&Control,2012(10):2745-2748.

[6] Ivo Damyanov,N.H.Metadata Driven Code Generation Using.NET Framework[J].International Conference on Computer Systems and Technologies-CompSysTech,2004.

[7] McConnell.Code Complete[M].Beijing:Univer-sity of Electronic Science and Technology of China,2006.

[8] 周荷琴,吴秀清.微型计算机原理与接口技术(第4版)[M].合肥:中国科学技术大学出版社,2008.

Zhou Heqin,Wu Xiuqing.Microcomputer Princi-ple and Interface Technology(Fourth)[M].Hefei:Press of University of Science and Technology of China,2008.

Application of Table-driven Code Generation Technology in the Com piler

Lin Zhuo,Qi Xiaobin,Wei Jin
(Xi’an Aeronautics Computing Technique Research Institute,AVIC,Xi’an 710119,China)

For new background of MDA(Model Driven Architecture)field,combined with compiler technology,the code automatically generated technology based on table-driven is presented,which is used in the back-end compiler to automatically generate the intermediate code to the target code,especially when the code possesses large number or the structure is complex,its advantage will bemore apparent.The experimental verification shows that the technology not only has the advantage of universal code generation technology,but also improves the generated efficiency and reduces the coupling of the code and logic control complexity.In data-centered,data and control are separated to keep the good maintainability and scalability for the system.

Table-driven;Code automatically generated;Compiler

10.3969/j.issn.1002-2279.2015.03.015

TP301

A

1002-2279(2015)03-0050-04

十二五核高基课题(2012ZX01041-002-003)

林卓(1987-),男,陕西西安人,助理工程师,硕士研究生,主研方向:从事计算机软件与理论方面研究。

2014-11-13

猜你喜欢

代码生成编译器代码
Lustre语言可信代码生成器研究进展
基于相异编译器的安全计算机平台交叉编译环境设计
一种基于模型和模板融合的自动代码生成方法
创世代码
创世代码
创世代码
创世代码
基于Web应用界面的代码自动生成软件设计
代码生成技术在软件开发中的应用
Microchip为MPLAB XC系列专业版编译器推出低成本可续订包月许可证