MDA项目思路小结
从上学期期末进入模型驱动开发项目小组到现在已经有四个月了,对MDA的开发思想慢慢有了了解,以前总觉得用UML建模什么的都很浮云,而且根本没什么技术含量,在嵌入式领域更是少有用武之地,但是回望一下前段时间所做的工作,发现自己原来的想法还是太幼稚,而且把UML这套技术体系看得也太简单了。虽然现在仍不能说对UML已经有了深入的了解,但是认识的层面比起以前还是有了很大的提高。
OMG定义的四层模型体系架构,从上到下依次是元元模型(M3)、元模型(M2)、模型(M1)、实例(M0)层,每一层模型都是其上层模型的实例,如MOF(Meta Object Facility)处于元元模型这一层,UML处于元模型这一层,那么UML实际上是MOF的一个实例,即UML是根据MOF而定义出来的。我们也可以根据需求用MOF来定义一套自己的元模型而舍弃UML,但是显然这需要很强的技术后盾做支持,毕竟目前有着数量庞大的商业和开源工具很好地支持UML的最新规范,其中有的工具甚至能够很好将模型生成对应的框架代码,使用起来非常方便。而定义自己的元模型则意味着需要自己来实现相应的配套工具,其难度可想而知。有人可能会问,既然每层都是上一层模型的一个实例,那么处于最顶层的MOF又是谁的实例?这个问题我到现在弄得也不是很清楚,但是根据MOF的标准可以知道,它是自定义的,但是具体怎么自定义,则需要进一步的了解。
根据上面所述,UML是处于元模型层的,而我们实际所要建立的软件的模型则是处于模型层,即对UML提供的模型元素进行实例化,形成模型层中需要的各模型元素,来表述软件中的静态模块和动态动作,当然,仅仅依靠UML提供的状态图和交互图是没法精确表述模型动作语义的,因此而引发了项目组对xUML(可执行UML)的探索。Kenndy Carter公司与OMG合作,产生了一套具体的可执行UML建模方案,在模型中加入表示动作语义的ASL代码(Action Specification Language),从而精确地表达模型中每个操作、每个信号的具体实现。就像高级语言对于汇编语言来说更容易让人理解一样,ASL对模型中行为的表述则可以看成是高级语言在模型层次上的抽象。我们可以对C语言这样的高级语言开发编译器,生成汇编语言,那么同样的道理,对ASL这种模型层次的语言,我们也可以对它进行词法、语法、语义分析,将其映射到高级语言,这就是代码生成的基本思想。
当然,具体的实现远比上面的概念要复杂,也是我们接下来要好好研究的对象。首先,模型中的静态元素(比如类、类的属性、类之间的关联)存储在XML文件中,我们要对静态元素生成高级语言(如C语言)的框架代码,如何将模型中的规则完整而准确地映射到C语言上就需要仔细考虑,确定映射规则后,再考虑如何解析XML文件并提取其中存放的信息进行映射。其次,模型中的动态元素(比如操作、类的状态转换),由于这些是用ASL这种抽象语言表达出来的,对这种语言进行词法和语法分析,生成其抽象语法树,这就相当于要开发一个ASL的编译器,充分解析出ASL代码中的语法元素后,再考虑如何将ASL中的语法元素映射到C语言上,映射的过程可以手工的,也可以选用模版(如StringTemplate)来完成。最后,就是如何对生成的C代码文件进行管理,组织各函数之间的调用关系,利用用GCC之类的编译器,对其生成可执行文件。生成的代码可用并且完全符合模型中表达出来的需求,这才是最终的目标。至于做出的工具是否要做成Eclipse的插件,是否要有友善的界面,则需要根据小组前期工作完成的好坏而定。
由于前期的验证工作已经完成并写出了相关文档,下一步将进入较为困难的实现工作,在这里梳理一下思想,以方便以后返回来重新体会,目前的理解肯定还是有很多局限性,在后面还需要慢慢的深入体会和纠正。