写点什么

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

  • 2008-10-22
  • 本文字数:1263 字

    阅读完需:约 4 分钟

最近越来越多的人使用像 Scala Groovy JRuby 这样的兼容于 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)工具 GSpec easyb ,还有 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?

2008-10-22 15:221627
用户头像

发布了 88 篇内容, 共 272.9 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

Android工程架构演进及康威定律

石头

5G时代,如何彻底搞定海量数据库的设计与实践

奈学教育

海量数据库的设计与实践

【写作群星榜】5.29~6.4写作平台优秀作者&文章排名

InfoQ写作社区官方

写作平台 排行榜 热门活动

如何让解决无法访问 GitHub 的问题?

JackTian

GitHub

过滤器 和 拦截器 6个区别,别再傻傻分不清了

程序员小富

Java

判例学习(一)梨视频诉字节跳动帮助侵权二审判决

Yin

学习 读书笔记 互联网 知识产权 法律

hexo博客系统的实现原理与搭建

音视频专家-李超

Hexo 博客

NIO 看破也说破(五): 搞,今天就搞,搞懂Buffer

小眼睛聊技术

Java 学习 读书笔记 架构 后端

大数据中台之Kafka,到底好在哪里?

奈学教育

kafka

预告|2020中国CRM品牌测评报告

人称T客

我是一个连地摊都不会摆的废人

Neco.W

创业 投机 投机者 地摊

MyBatis启动之XMLConfigBuilder解析配置文件(二)

ytao

后端 mybatis

【大厂面试03期】MySQL是怎么解决幻读问题的?

NotFound9

MySQL 数据库 编程 架构

分布式架构,刚性事务-2PC必须注意的问题及3PC详细解

奈学教育

分布式架构 2PC注意事项 3PC详解

Silicon Labs Gecko bootloader 简介

taox

zigbee bootlaoder

TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?

小林coding

Linux TCP 网络安全 计算机网络 网络协议

万字总结——反射(框架之魂)

学习Java的小姐姐

Java 反射 Java 25 周年

C++:两百字三段代码解决函数返回局部变量问题

韩小非

c++ 函数栈调用 返回局部变量

别做误人子弟的「职业导师」

Tony Wu

职业成长 导师 教练

ARTS-WEEK02

子路无倦

深入理解Java虚拟机

Skye

深入理解JVM

centos6.9开机启动服务说明

唯爱

HTML5 && CSS

shirley

html5 css3

使用ADMT和PES实现window AD账户跨域迁移-介绍篇

BigYoung

windows AD ADMT PES 迁移

深入理解JVM垃圾回收机制 - 何为垃圾?

Skye

深入理解JVM 垃圾回收机制

游戏夜读 | 网络游戏怎么赚钱?

game1night

强烈安利第一个画图工具!

我是程序员小贱

高效工作 高效

原创 | TDD工具集:JUnit、AssertJ和Mockito (十七)编写测试-标签和过滤

编程道与术

Java 编程 TDD 单元测试 JUnit

白天写代码,晚上摆地摊!9年前摆地摊学会了这些道理...

王磊

机器学习算法评估指标——2D 目标跟踪

做技术BP的文案Gou

学习 2D 评估标准

python3.8.3安装ipython和jupyter

肖飞码字

python3.x Jupyter Notebook

创建内部DSLs——Groovy比Java更好吗?_Java_Srini Penchikala_InfoQ精选文章