BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Srini Penchikala 关注 34 他的粉丝 ,译者 张龙 关注 12 他的粉丝 发布于 2008年10月23日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

最近越来越多的人使用像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的更多信息。

查看英文原文:Is Groovy a Better Choice Than Java for Creating Internal DSLs?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

为什么选择动态语言 by Lee Lawrence

个人对动态语言使用过一段时间,就企业开发来说,最适合适应需求的变化,可以做到无需编译的嵌入到现有代码逻辑,快速响应需求变化。但是负面影响是如果没有专用工具或对DL core 有深入了解,对于调试来说还是比较困难的。

DSL还是非常用的,决定学习Groovy了 by 邢 波涛

DSL还是非常用的,决定学习Groovy了

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT