10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

创建内部 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:221595
用户头像

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

关注

评论

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

阿里“妈宝级”之作,Kubernetes原理剖析与实战应用手册,太全了

Java Kubernetes k8s

JSF源码分析(一)

京东科技开发者

spring jsf 企业号 4 月 PK 榜

一文详解RocketMQ-Spring的源码解析与实战

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

GPU 加速药物研发与基因组学分析

Baidu AICLOUD

生命科学

终于有人把动态规划、冒泡排序、二叉树、链表、栈全部讲清楚了

Java你猿哥

数据结构 算法 二叉树 排序 LeetCode算法

GitHub爆款!Java性能优化:轻松道破软件性能调优,不止搞定JVM

Java你猿哥

Java JVM Java性能优化

品牌活动|行云创新出席“新工业·智物联”全国巡回 CEO 峰会

行云创新

行云创新 新工业 智物联 全国巡回CEO峰会珠海站

python中对象引用 | python小知识

AIWeker

Python python小知识 三周年连更

【Linux】firewall-cmd之防火墙简介及命令详解【附加实战⭐建议收藏!!⭐】

A-刘晨阳

Linux 防火墙 Firewalld防火墙 三周年连更

全栈开发实战|Vue进阶——使用静态模块打包工具webpack

TiAmo

Vue webpack 三周年连更 静态模块打包

浅谈智能语音交互

六月的雨在InfoQ

语音识别 语音合成 三周年连更 智能语音交互

java 开发 SSM 框架整合之 MyBatis 动态 SQL

Java你猿哥

Java sql mybatis SSM框架 if

面试官:介绍一下什么是缓存雪崩、缓存击穿、缓存穿透?

Java你猿哥

redis 面试题 缓存穿透 缓存击穿 缓存雪崩

ThreadLocal源码分析

Java 源码 多线程 ThreadLocal

The Beacon链游NFT系统开发技术

薇電13242772558

NFT

中国边缘云公有云服务市场 Top2,百度智能云让智算无处不在

Baidu AICLOUD

分布式云

天呐!我真的没想到推特GIF动图保存到手机相册竟然简单几步就能完成!

frank

twitter

Android C++系列:C++11函数特殊特性

轻口味

c++ 三周年连更

每个Java程序员都必须知道的四种负载均衡算法

Java 负载均衡 负载均衡算法

ARB链质押挖矿代币空投游戏dapp系统开发合约定制

开发微hkkf5566

超简单!Java 项目自动生成接口文档教程

Apifox

Java 接口文档 API 文档生成 自动生成

我认真总结并分析了Spring事务失效的十种常见场景

Java spring Spring事务

Java中的「接口」到底是什么?

海拥(haiyong.site)

三周年连更

生物计算大模型技术在药物研发领域的应用

Baidu AICLOUD

生命科学 PaddleHelix

拿来吧你!保姆级Docker底层原理及源码实战手册,上线点赞破10W

Java Docker 容器

Typescript- 数据类型

格斗家不爱在外太空沉思

typescript 三周年连更

超级详细|Linux系统下从0到1的玩法大全

浅羽技术

Linux unix 操作系统 命令 三周年连更

Mybatis返回集合类型到底是空集合还是null?源码解读

Java 源码 mybatis

ChatGPT及大模型专题研讨会在蓉成功举办共探前沿技术与产业发展

NLP资深玩家

《人间失格》

后台技术汇

三周年连更 人间失格

华为云开源项目OpenTiny中TinyVue有什么优势?

英勇无比的消炎药

开源 Vue 组件库

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