Meta Programming System(MPS)是JetBrains开发的面向语言编程的新工具。开发者可以用它扩展编程语言,也可以用它为企业应用创建领域特定语言(DSLs)。JetBrains开发团队近日宣布推出MPS的beta版。
\MPS提供的软件开发环境可以创建新的定制语言,也可以扩展现有语言,然后用它们开发面向领域的应用。MPS还可以定义新语言的类型系统、约束和专门的编辑器。MPS用一棵抽象句法树(AST)来维护代码。AST由节点组成,节点又包含属性、子节点和引用,程序代码就靠AST和这些节点完整地表达出来。创建新语言的时候,开发者定义代码编排和表达的规则,还可以规定语言类型系统的组成元素。MPS凭借这些规则即时检查程序代码,减少用新语言编程的出错机会。MPS还采用了代码生成的办法:用新语言在更高的层次上表达,然后MPS生成Java、XML、HTML、JavaScript等语言的可编译代码。用MPS建立新语言的时候,必须从BaseLanguage扩展。MPS已经提供了一些常用的BaseLanguage扩展,协助开发者处理字符串、容器、日期、正则表达式等语言成分。
\面向语言编程(LOP)是一种新的编程风格。在LOP里,语言好比传统编程中的类和方法,是搭建软件所用的建筑材料,开发者根据需要,或创建专门的新语言,或对旧语言作扩展。Martin Fowler 曾撰文说明用语言工作台作为IDE工具去实现面向语言编程,也介绍过用MPS作为语言工作台。
\MPS还适合用来创建DSL,因为它可以为任意新语言实现定制的语言编辑器和其他约束条件。不熟悉传统编程的领域专家,可以用本行专业术语构成的DSL在MPS里工作。
\MPS软件对所有人免费,其中大部分代码还会以Apache 2.0许可开源。MPS起初是JetBrains从2003年开始的一个研究项目,JetBrains员工已经用它开发过一些新产品。目前团队的主要目标是下个月的Beta 2版,以及2009年第一季度的1.0版。11月的时候JetBrains还发布过IDE产品IntelliJ IDEA的8.0版,团队协作工具的TeamCity的4.0版。MPS beta版下载和概念说明,请参阅他们的网站。网站上还有用户指南、教程和专门的博客站点介绍MPS工具的详细信息。
\InfoQ采访了JetBrains公司MPS核心开发者Konstantin Solomatov,向他询问MPS的软件功能和项目未来的路线图。InfoQ问及MPS与其它建模及代码生成工具的对比,比如Eclipse Modeling Framework(EMF)、openArchitectureWare(oAW)。
\MPS所依据的概念与EMF、oAWE类似。三种技术都可以创建元模型,也都可以描述编辑器、自动完成、模型转换(MPS称之为“生成器”)等方面。EMF模型通常用图形编辑器来编辑,你可以用方框线条绘制出代表各实体的图解。这种做法对某些领域很有效,比如绘制ER图。但我们认为不适宜用EMF创建任何相对复杂的软件。\\oAW最值得注意的部分的xText框架,它定义的文字型DSL可以被解析成EMF模型。不过用这种方式创建语言有其局限。如果在同一个文件里混用多种语言,必须保证文法不会出现二义性,也就是说所有的输入都只能存在一种解释。文本型的语言很难保证这一点。比方说有两家厂商都想为Java补充一种支持金融货币的语言,而两家厂商都在语言里新增了Money类型。那么,如果代码里两种类型都用到了,我们解析文件的时候就无法分辨一个Money类型的变量到底属于哪一种语言。
\MPS把模型表示成一棵可以直接编辑的抽象句法树。在MPS里,代码看似文本,在很多方面的表现也如同文本,但由于我们从不需要在代码和文本之间来回转换,也就完全不用担心文法上的二义性。
好像MPS还可以编排语言的文法。这项功能与Oslo和OMeta等工具的类似功能有何异同?
\因为MPS不是基于文本的,它没有任何文本上的文法。定义语言就是定义它的抽象句法树,它的抽象文法。而没有文本上的文法,也就没有语言兼容的问题,语言从定义上就是兼容的。Oslo和Ometa都是基于文本的,因此都有类似于xText的问题。\\Oslo和Ometa只能定义语言的解析器,与之相比,MPS的功能更多,能定义语言的编辑器、约束、类型系统、数据流分析,还有生成器。
JetBrains开发团队在那些产品中采用了MPS作为建模和开发工具?
\其中一个是代号为“Charisma”的问题跟踪系统,它也会在2009年第一季度公开发布。它是完全用MPS编写的。 Charisma也成了MPS本身所用的问题跟踪系统,还被用到TeamCity凳产品中。在创建Charisma的时候,我们开发了一门完整的Web开发语言,在MPS中扮演相当于J2EE的角色。\
MPS项目的未来路线图如何,有何新特性?
\本次Beta的主要目的是收集MPS用户的反馈,并且决定将来的路线图。我们已经有1.0的计划,不过1.0版不会有任何大的变动和新特性。我们将在2009第一季度发布完MPS 1.0之后,再公布更长远的路线图。届时计划中应该会包括调试器和用于定义UI的若干新语言。\
查看英文原文:JetBrains Meta Programming System Supports Language Oriented Programming and DSLs