InfoQ

新闻

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

作者 Srini Penchikala 译者 张龙 发布于 2008年10月22日 下午3时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?

为什么选择动态语言 发表人 Lawrence Lee 发表于 2008年10月23日 下午8时12分
DSL还是非常用的,决定学习Groovy了 发表人 波涛 邢 发表于 2008年10月29日 下午8时3分
  1. 返回顶部

    为什么选择动态语言

    2008年10月23日 下午8时12分 发表人 Lawrence Lee

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

  2. 返回顶部

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

    2008年10月29日 下午8时3分 发表人 波涛 邢

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

深度内容

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。

豆瓣网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

融合思想:深入探索S#arp架构

Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。

王雷谈开源以及新兴市场计划

中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。

使用HTML5构建下一代的Web Form

HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。