【模型驱动软件设计】「域体系结构」代码生成技术

      现在要提出作为选择或构建MDSD工具的基础的、被公认的那些技术--即可以从域体系结构中分解出来的那些方面,因为它们具有更加一般的本质。但是一个域体系结构不能离开它们:代码生成技术是一个重要的基础。

一、代码生成--选择它的原因

      在MDSD中,建模、代码生成和架构开发之间有一种紧密的联系--例如,可以从DSL中生成MDSD平台的架构完成代码。

1.性能

          在许多情况下,因为有人希望在保持一定灵活度的同时实现一种特定层次的性能。考虑到它们可以达到的性能,传统的面向对象的技术并不总是充分的,如构架、多态性或反射。使用代码生成从理论上规定配置--这也是它灵活性的所在---而且也生成了高效的代码。

2.代码规模

         选择使用代码生成的另一个原因是代码规模。如果在编译时知道哪些特征是在你运行时需要的,那么生成器只需要在代码中加入那些部分。这能够帮助缩小图像。反之亦然,过度扩展源代码层的构件会极大地放大图像。

3.可分析性

      复杂、通用的架构或运行时间系统倾向于将编程语言相关的复杂性重新放置在一个专有的配置层上。它们通常会大量地利用解释,这妨碍了对程序属性进行静态分析的可能性,而且偶尔会削弱错误检测。相反,生成的编程语言源代码具有分析手工编写代码的能力。        

4.早期错误检测

       灵活的系统通常使用弱类型允许在运行时间内做出决定。

5.平台兼容性

        在MDA背景下使用代码生成的一个典型的例子就是独立于实现的平台对应用程序逻辑进行编程,这使得向更新的、潜力更好的平台变换更加容易。

6.语言的限制

       大多数编程语言在它们的表达中存在不方便的约束,可以使用代码生成绕过它们。

7.模块单元

        一个系统的横切特性,如日志或持久化,一般是局部实现的---即不是散步在应用程序中的---通过代码生成。

8.自我测量

        这里必须提到自我测量的问题。自我测量描述了一个程序对自己的访问。这允许程序获得有关自己的信息,例如关于类、它们的属性和操作。

二、分类

1.元编程

      代码生成器是把规范作为输入参数,并生成源代码作为输入的元程序。

2.程序和源程序的分离/混合

      在元程序和基程序被混合的情况下,存在一种通用的编程和元编程的语言,而且源代码组件不是分离的而是混合的。

       混合程序和元程序是一种非常有利的方法。然而,得到的系统容易变得极其复杂,因此它和主流软件开发之间的相关非常有限。混合的方法进一步暗示了目标语言不再是代码生成的一个参数。

     如果程序和元程序是分离的,则系统的创建要分两个阶段完成。元程序被运行并创建基程序作为输出,然后终止。程序不知道存在元程序。可以通过元编程过程,包括构建过程来维持这种间隔。

     分离元程序和基程序的方法不支持元对象协议,不过由于它的复杂度较低,它更适合于典型的以体系结构为中心的模型驱动软件开发。

3.生成的和非生成的代码的隐式和显式集成

         这两种程序类型的隐式集成产生的代码已经构成了一种生成的和非生成的diamanté的混合体。结果,不再需要担心这两种分类的集成了。

        在其他情况下,生成的代码最初独立于手写的代码部分。必须用一种合适的方式集成这两种代码。

4.关系

       总的来说,可以生成器分类的两个方面之间存在着一种关系:

  • 程序和元程序分离的生成器通常用于创建于手工创建的代码分离的代码,而且该代码必须用手工集成。
  • 程序和元程序混合的生成器不需要这种手工的集成---生成器已经创建了组合的系统。

5.程序和源程序混合的例子

       C++预处理器是一种混合程序和元程序的系统。这里应用的语言是彼此独立的:还可以将C++预处理器用于其他编程语言,因为它知识在文字上对源代码进行处理,因为系统是基于宏扩展的,所以预处理器产生了集成了生成的代码和手工创建的代码的源代码。

三、生成技术

          如下生成器的分类:

1.模版和滤波

        这种生成技术描述了最简单的代码生成的情况。用模版重复一个用文本表示的模型的相关部分,例如通过XML使用XSLT。

      使用模版和滤波的生成相当直接和耐用,不过样式表很快就变得非常复杂。

2.模版和元模型

       为了避免产生直接从模型中生成代码的问题,可以实现一个多级生成器,它首先分析XML,然后实例化一个元模型,最后把它和模版一起用于生成。

3.框架处理器

       框架处理器的重要元素框架基本上是要生成的代码的规范。类似于面向对象的语言中的类,框架可以被多次实例化。在这种实例化过程中,变量被绑定为具体的数值。每个实例可以拥有自己的槽值,就像类一样。

4.基于API的生成器

       最流行的代码生成器的类型大概是基于API的。它们简单地提供了一个API,用它可以生成目标平台的元素或语言。在概念上,这些生成器基于目标语言的抽象语法,因此总是针对一种语言,或更加精确地说是针对目标语言的抽象语法。

5.内联的生成

      内联的生成是指“规则的”源代码包含在编译或某种预处理过程中生成的更多源代码或字节/机器代码的构件的情况,例如C++预处理器指令或C++模版。

6.代码的品质

      继续另一个在Java领域非常流行的机制:代码品质。在Java中,这些首先被JavaDoc所使用,其中使用特殊的注释使自己生成HTML文档成为可能。可扩充的JavaDoc体系结构使得插入定制的标签和代码生成器成为可能。XDoclet也许是最流行的例子。

7.代码交织

      代码交织描述了单独的但在语法上完整的而且独立的代码段的混合。

8.组合不同的技术

      将不同的代码生成技术进行组合也是可能的。开发源工具通过模版创建了源代码。这种源代码又包含代码品质。基于模版生成该代码是使用Velocity发生的,此外用XDoclet进行处理。

     另一种流行的组合是基于API的生成器,它可以选择性地读取模版以简化对API的处理。

9.不同方法间的共同点和不同点

      首先,基于标准对不同方法进行分类。需要提出许多的其他特征、不同点和共同点。在原则上,框架处理器和基于API的生成器将会构建要创建的系统的一个AST。

10.其他系统

     在代码生成领域存在许多其他系统。不过,它们与MDSD的关系不大。

  • 元对象协议允许访问编译器结构。
  • 许多主要存在Java背景下的工具允许修改生成的字节代码。

猜你喜欢

转载自blog.csdn.net/zhb15810357012/article/details/131216069