DSL和面向语言编程的崛起

The rise of DSLs and Language Oriented Programming?

几天前JetBrains(好像以前也是最早推出MDA工具的)推出他们的“MPS” (Meta Programming System元编程系统)的EPA产品:Charisma

MPS在一个月前已经到达其第一个里程碑。

MPS 是Martin Fowler在Language Workbenches: The Killer-App for Domain Specific Languages?(DSL的杀手级应用) 发明的。它是自由和开放源码,并提供一个有趣的建立在Java上的语言扩展的DSL新方法。

另外一家http://intentsoft.com/发布了他们的Language Workbench语言工作台的demo,是运行在.net. 上。

在云计算领域,Force.com也在利用元编程 Meta Programming,这对于商业应用以及CRM相关应用是非常有吸引力的。


按照Martin Fowler的说法,面向对象的领域建模让我们得以“汇集词汇”,但语法――将词汇组合起来的方法――却是缺失的;DSL补足了语法的方面。因此面向语言编程引导我们“从思考词汇,即对象,走向一种结合了词汇和语法的语言观念。”

传统的与API和框架沟通的方式:你要“从最基本的共识着手并解释所有的细节”。因为它们没有“任何内建的上下文”。因此代码中总是不断重复一些上下文,以致成了干扰。相反DSL“总是有着隐含的上下文,上下文几乎从不露面,就算露面也是很少很少,通常最多一次”。因此我们不必一再地提供上下文信息,于是代码更具可读性,也更有表现力。

Fowler和Ford都强调了可读性的重要。他们认为DSL的动机经常被误解。目的并不是为了让业务分析师能够自己写代码,而是为了让他们能够阅读和检验代码,从而填补专业开发者和业务人员之间的罅隙。

Neal Ford强调说如果一门DSL很难读,那么它的设计就是很糟糕的,因为“[使用DSL的]目的之一就是为了创造出更容易阅读的代码”(按这个说法,SQL大概是最容易阅读的代码,很难相信对于中国人非英语国家,有比SQL更容易阅读的语言了。)。

个人评价:概念是非常吸引人,就象SQL已经是数据库的元编程,那么是否SQL就应该继续大行其道呢?让用户学习一下某种语言的DSL,和让其学习SQL哪个成本更低以及更容易呢?我担心象LinQ那样类似SQL的DSL会导致面向数据库死灰复燃。

另外,使用DSL确实完成了面向业务用户的封装,他们不必了解更多软件专业知识,但是灵活性是不是就丧失呢?数据库就是因为其不可伸缩,是一个封闭的盒子,而遭遇性能瓶颈,如何解决这个矛盾呢?

也许基于云计算平台的DSL才是一个更佳的选择。


[该贴被banq于2009-08-30 15:55修改过]
[该贴被admin于2009-08-30 15:55修改过]
[该贴被admin于2009-08-30 15:59修改过]

>DSL目的并不是为了让业务分析师能够自己写代码,而是为了让他们能够阅读和检验代码,从而填补专业开发者和业务人员之间的罅隙。

这个目标还是比较赞同的,关键是语言必须面向业务,以前Java比较简单,简单的一些类名称,估计有点抽象思维的业务分析师能够理解,但是Java 5以后引入C的泛型,特别是泛型类型范围限制,让普通程序员都很费解,别说业务分析师。好好的一个面向业务的Java语言就让SUN和JSR那些标准专家给毁了。

这是SUN恶意强奸JDK的一个结果,所以OpenJDK和动态语言Scala等发展最终会迫使SUN放弃骑在JDK上面的位置,拉下马来,现在他已经被收购,下一步就是被从JDK拉下马,否则Java将和Cobol一样,成为遗留系统,也不能取得C那样低调底层强大悠久的位置。

从这次JDK 7发布来看,SUN总算停止了过去任意改变语言定义的习惯,增加了对动态语言支持,这应该是一个改变的姿态:
java7新特点

想法很好,但是很难操作

其实DSL也是为了实现你在关于DDD,语言和主流架构中提出的问题。

DDD面向对象建模方法汇集了词汇,但是缺乏将词汇组织起来的语法,DSL就是试图对语法的定义,也是对架构框架的进一步定义吧。

太多了。。。现在。
groovy 中也自己的 meta programming api了。。。