InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

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

作者 Srini Penchikala 译者 张龙 发布于 2008年10月22日

领域
架构 & 设计,
语言 & 开发
主题
动态语言 ,
领域专用语言 ,
Java
标签
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的更多信息。

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

译者 张龙 热衷于编程,乐于分享,对新技术有强烈的探索欲,对Java轻量级框架有一定研究。

为什么选择动态语言 发表人 Lee Lawrence 发表于
DSL还是非常用的,决定学习Groovy了 发表人 邢 波涛 发表于
  1. 返回顶部

    为什么选择动态语言

    发表人 Lee Lawrence

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

  2. 返回顶部

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

    发表人 邢 波涛

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

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。