浏览:3412008-03-30 11:17   来自满延平      :

一切自动化是人类的一个梦想,人们为了实现这个梦想不断努力。人们利用计算机软件与硬件实现办公自动化、管理自动化的同时,也在考虑程序代码的自动生成。

    在软件工程发展过程中,计算机科学家为了降低软件开发得强度,缩短开发周期,减少代码的重复书写,从而减轻程序员的编程负担,一直以来都致力于代码自动生成方面的研究。Lex/Yacc是最早用于自动化编写编译程序的工具。随着现代化信息环境日趋复杂,各种应用软件的开发难度随之加大,这需要更有技巧,更有方法地从事软件开发,开发团队之间也必须更无障碍地沟通,否则极可能无法在有限的开发时间中完成任务。由于时间上的压力,一般人只注重程序的编写速度,却忽略其完成后的实用性与维护性,加上大型程序多人共同参与开发,每个人都有各自的程序风格,容易造成严重的差异性,随着系统规模越来越大,这将造成系统完成后在测试及维护上沉重的负担,代码自动生成技术更显出了其显著的优越性。尽管这些应用没有代码生成工具也能开发完成,但利用代码生成技术可以大大加速软件的开发进度,提高软件的质量。 

    代码生成的优势与劣势分析 
    传统的代码开发调试工作流包括“编辑、编译、以及测试”。如图1所示。代码生成增加了一些新的工作流元素。传统的编辑、编译、以及测试阶段仍然适用。在代码生成的工作流中,首先编辑模版和定义文件(或者生成器本身),然后运行生成器创建输出文件。接着对输出文件进行编译测试(如果目标语言不是编译的语言,不考虑图1(右)中的编译阶段)。


图1 传统工作流与代码生成工作流的对比

 代码生成的分类
    在技术领域一般我们可以将代码生成技术分为两大类:被动模式和主动模式(见图2)。在被动模式下,代码生成器产生一系列的代码,然后软件开发者可以自由的修改、编辑这些代码,但代码生成器不再承担对代码的维护工作。大多数软件集成开发环境(IDE)中的应用“向导”就是这种类型的代码生成器。被动模式的代码生成技术有其应用的范围,但是被动模式的生成系统有天生的局限性。生成器只运行一次,然后就不再承担对代码的维护工作。与此相反,主动模式下的代码生成器则对生成的代码“长期”负责,可以通过改变生成器的输入参数并重新运行生成器来改变输出的代码。如编译器生成器就是一种主动模式的代码生成器。     在技术领域一般我们可以将代码生成技术分为两大类:被动模式和主动模式(见图2)。在被动模式下,代码生成器产生一系列的代码,然后软件开发者可以自由的修改、编辑这些代码,但代码生成器不再承担对代码的维护工作。大多数软件集成开发环境(IDE)中的应用“向导”就是这种类型的代码生成器。被动模式的代码生成技术有其应用的范围,但是被动模式的生成系统有天生的局限性。生成器只运行一次,然后就不再承担对代码的维护工作。与此相反,主动模式下的代码生成器则对生成的代码“长期”负责,可以通过改变生成器的输入参数并重新运行生成器来改变输出的代码。如编译器生成器就是一种主动模式的代码生成器。


图2 被动模式与主动模式的对比

    下面我们介绍几种常见的代码生成技术,这些技术对开发一个实用的代码生成器非常重要。可以依据代码生成技术的使用场合、复杂度等对这些生成技术进行分类,这里我们采用依据生成技术的输入、输出对它们进行分类。
    (1)代码挑拣器,代码挑拣器的输入是源代码,通过拣取需要的信息可以生成各种文件,代码挑拣器的使用相当广泛,可以使用它来生成代码API文档(最著名的就是JavaDoc了)、获取常量和函数原型等。 
    (2)内联代码扩展器,内联代码扩展器的输入是带有特殊标记的源代码,这些特殊标记经过扩展器的处理后将被替换为相关的代码从而产生最终的生产源代码,内联代码扩展器的典型应用是将SQL语句嵌入到源代码中,其主要特点是使得底层结构和复杂的查询分开。
    (3)混合代码生成器 混合代码生成器与内联代码扩展器很像,它也是处理源代码中的特殊注释但是与内联代码扩展器不同,它的结果将直接输出到输入的源代码中。这种方式的一个典型应用就是在对话框控件和它们代表的变量之间建立映射关系。
    (4)部分类生成器 部分类生成器的输入是模板文件和包含特定类所需信息的定义文件,这些信息经过生成器将产生应用的基类。通过继承该基类可以完成剩余的工作。Velocity是一个源代码开放的Java模版引擎。
    (5)层第生成器 层第生成器将生成一个多层应用的所有代码。模型驱动的开发是这种生成器的一个很好例子。通过UML模型输入和其余XML文件,生成器能够生成一个包含多个系统的完整应用,并且模型和代码之间可以单向乃至双向同步。

楼主

注册用户登录后才能回复,登录注册
> 返回“软件工厂”


其他话题

相关链接
1 31631