在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

关注

评论

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

YOLOv5全面解析教程⑥:模型训练流程详解

OneFlow

人工智能 深度学习

Matlab常用图像处理命令108例(二)

timerring

图像处理

一天吃透Git面试八股文

程序员大彬

git 面试

AutoCompleteTextView的基本使用

芯动大师

android 控件 AutoCompleteTextView

前端学习

阡陌r

28岁小公司程序员,无车无房不敢结婚,要不要转行?

程序员晚枫

程序员 收入

量化合约系统开发(规则开发)丨量化合约开发(源码说明)

系统开发咨询1357O98O718

使用OpenAI接口释放ChatGPT API 的力量

devpoint

React nextjs ChatGPT

Kubernetes容器状态探测的艺术

俞凡

Kubernetes 云原生

从混乱到完备:我的研发流程之路

SkyFire

研发流程

初识大热的ChatGPT的几点思考|社区征文

穿过生命散发芬芳

ChatGPT

极氪汽车 APP 系统云原生架构转型实践

阿里巴巴中间件

阿里云 云原生

【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(上篇)

码界西柚

分布式 2PC 3PC 原理分析 分布式协议

LeSS敏捷框架高效生产力实践

俞凡

敏捷开发 大厂实践

大型供应链物流企业的数字化转型方法论

明道云

DAPP马蹄链智能合约系统开发(开发方案及详细)

系统开发咨询1357O98O718

DAPP/LP单双币(子母币)流动性质押挖矿分红系统开发(开发说明及源码)

系统开发咨询1357O98O718

架构训练营-模块9秒杀系统

张Dave

JavaScript异步编程的深入理解,使用回调函数实现异步编程

兴科Sinco

JavaScript 前端 前端开发 异步编程

在前端领域摸爬滚打7年,我终于掌握了这些沉淀技巧

小鑫同学

强强联合:Neovim+ChatGPT | 社区征文

SkyFire

ChatGPT neovim

前端学习路径

阡陌r

架构实战 8 - 消息队列MySql表格设计

架构实战营 「架构实战营」

DAPP智能合约链游开发源码案例丨DAPP智能合约链游系统开发(逻辑及方案)

系统开发咨询1357O98O718

One-YOLOv5 v1.2.0发布:支持分类、检测、实例分割

OneFlow

人工智能 深度学习

Spinner(列表选项框)的基本使用

芯动大师

android spinner galley

将老人拉出无声的世界,AI是怎么做的?

脑极体

AI医疗

如何设计一个优秀的 Go Web 项目目录结构

江湖十年

Go 设计 后端 项目 Web Service

国内AGV调度系统到底是什么水平?

申扬科技

调度系统 AGV

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