创建内部DSLs——Groovy比Java更好吗?[转]

Srini Penchikala译者 张龙 2008-10-23

 

查看英文原文: Is Groovy a Better Choice Than Java for Creating Internal DSLs?
来自:http://www.infoq.com/cn/news/2008/10/groovy-internal-dsl

摘要 相对于内部DSLs,Java更适合于创建外部DSLs,因为内部DSLs更依赖于宿主语言的语法。Groovy动态方法的强大功能使其更适合于创建内部DSLs。Venkat最近撰写了一篇关于Groovy中的元编程特性及如何利用该技术编写内部DSLs的文章。

 

最近越来越多的人使用像ScalaGroovyJRuby 这样的兼容于JVM的语言来开发领域特定语言(Domain Specific Languages ,即DSLs)。但他们真的比Java更适合创建内部DSLs么?Venkat Subramaniam 解释了为何像Groovy这样的动态语言中的“本质优于形式(Essence over ceremony)”及“元编程”特性有助于开发内部DSLs。

他说相对于内部DSLs,Java更适合于创建外部DSLs,因为内部DSLs更依赖于宿主语言的语法。Groovy动态方法的强大功能使其更适合于创建内部DSLs。Venkat最近撰写 了一篇关于Groovy中的元编程 特性及如何利用该技术编写内部DSLs的文章,

元编程是像Groovy及JRuby这样新一代Java平台语言所共有的一个特性,但Java本身却不具备该特性,它有助于构建内部DSLs,允许 开发者动态增加并调用方法。Groovy针对每个Java类都有一个元类(metaclass)。开发者可以轻松地在运行期将方法添加到类中。它还可以通 过methodMissing 方法轻松地在运行期对方法进行合成。Venkat通过一个示例应用(基于一个简单的输入文件)阐述了创建基于Groovy的内部DSL所需的步骤。他还使用一个示例应用比较了Groovy代码与Java代码在处理DSL时的区别。

很多文档 都谈到了如何使用Groovy编写DSL,同时还有几个DSL实现,如behavior testing DSL 、基于Groovy的行为驱动开发(Behavior Driven Development,即BDD)工具GSpeceasyb ,还有Groovy Finite State Machine (FSM)DSL。

InfoQ向Venkat问到当前DSL(外部和内部)在企业应用中的使用情况及动态语言在创建DSLs中的未来角色。他说到:

DSLs已经在企业应用中流行很长一段时间了。所谓的新东西无外乎就是对其认识的增强和更多可用的工具。当然动态语言背后的动力也在推进着内部DSLs的使用。

Groovy中的元编程看起来很强大。在开发Web应用时该特性有哪些典型的应用场景?

当然很强大了。 GORM 已经在 Grails 中大量使用该特性进行Web开发了。如果你向表中增加一个字段,你就可以轻松地在相应的模型类上使用查找方法来查询基于该新增加的字段值的对象。这些方法基于约定被动态合成起来,不需要再手工去创建了。你还可以在任何需要类似的动态行为的地方使用元编程。在使用 AOP 的地方,你也可以使用元编程。

您觉得动态语言在创建内部DSL的发展中将会扮演怎样的角色呢?

当然会有一些挑战。一方面,动态语言使得解析和处理内部DSLs变得异常简单。然而验证内部DSLs却并不轻松。我相信支持工具 和好的验证器会在未来几年出现。这当然是很好的研究和实验领域。假如不久后能跨越这些障碍,那么在相同的平台上如Java和.NET将动态语言与传统语言 混合起来所获得的这种能力会使得内部DSLs更棒。

之前的一篇文章 中,Venkat通过一个示例应用阐述了如何使用Java创建外部和内部DSLs。我们可以从Venkat所编写的 中了解到关于Groovy中的元编程更多的信息。请阅读这篇 文章以了解Java在创建内部DSL中的角色。可以从这里 了解InfoQ上关于DSLs的更多信息。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值