在JRuby中构建领域特定语言

2007 年 5 月 22 日

JavaOne 大会闭幕演讲是 Rob Harrop 主题为《JRuby 探索:为 Java 虚拟机创建领域特定语言》的演讲。领域特定语言(Domain Specific Languages,DSLs)提供了为程序开发或业务的特定目标创建出一种自定义语言的方式,并且人气与日俱增。InfoQ 网站上就有 Martin Fowler介绍领域特定语言的演讲,以及对博客圈子里相关论战的报导。

但问题是,为什么你要这么做呢?原因有很多,其中包括:可以简化重复性任务,可以封装样板式代码(Boiler-plate Code),或者是可以更有效表达代码目的的 API。不管你有什么特殊原因,所有的 DSL 都可以为你的项目带来清晰的价值。

在演讲中探讨的方法是创建一个 JRuby 的 DSL,可以在 Java 类内部使用。因为由 JRuby 生成的字节码最终会在 JRE 上运行,所以这个 DSL 应该被视为“内部”DSL——使用一个通用编程语言来创建一个特定编程语言。另外一种可选方式是“外部”DSL,需要一个外部的编译器和生成器,这样则会使得整合工作难度增大。

这个方法的优点在于创建 DSL,其中展示了一些 JRuby 语言的技术,使得 DSL 的开发变得更加容易:

  • 运算符重载——对运算符进行重载可以使 DSL 可以提供一个更为自然的语法
  • Hash 和符号(Symbol)——使用 Hash 和符号可使表达关系和标识对象更加容易
  • Block——Block 可以封装可运行逻辑,并允许逻辑储存起来(置于 Hash 中),用于稍后执行
  • 动态类型扩展——可以用动态的方式向类和对象加入方法
  • 方法缺失(Method Missing)——当调用了一个不存在的方法时,可以进行自陷(Trap),这样可以避免需要提前了解所有操作
  • 整合——可以使用已有 Java 代码

为了全面获得使用 JRuby 创建 DSL 的好处,演讲中还给出了关于编程方式的技巧: - 确保你不会使用动态语言来编写 Java 代码

  • 从通用构建 Block(Common Building Blocks)创建 DSL
  • 识别问题,然后创建出一个合适的语法表达出解决方案
  • 提供元数据和行为——不要让你的 DSL 变成配置文件
  • 用 Ruby 的方式思考:使用类型扩展;使用 Block;在对象上使用方法
  • 保证有限的作用域;仅仅解决领域中相应的小部分问题,不要让 DSL 变成一个通用编程语言

对于开发人员来说,DSL 是另外一种可以利用的工具。只要花一小部分时间,就可以节省更大部分的时间。

查看英文原文: Building Domain-Specific Languages in JRuby

2007 年 5 月 22 日 22:30 209
用户头像

发布了 117 篇内容, 共 93740 次阅读, 收获喜欢 0 次。

关注

评论

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

影响王兴的一本书

池建强

读书笔记 无限游戏 王兴

遥感影像处理有高招,“专治”各类花式并发的述求!

华为云开发者社区

容器 k8s 遥感

SQL数据库:子查询和关联子查询

大规模数据处理学习者

SQL子查询 SQL关联查询

牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。

Geek_71bb95

Java 程序员 架构 面试 编程语言

数字货币交易所功能,场外OTC交易所开发公司

13530558032

企业工作流设计原则及注意事项

力软.net/java开发平台

工作流

这套JVM核心知识你要全都会,月薪还不过18K可以直接跳槽了

小Q

Java 学习 架构 面试 JVM

亿级大表分库分表实战总结(万字干货,实战复盘)

比伯

Java 编程 程序员 架构 计算机

刷Github时发现了一本阿里大神的算法笔记!标星70.5K

Java架构师迁哥

MySQL全面瓦解—子查询和组合查询

比伯

Java 编程 程序员 架构 计算机

关于linux操作系统中的buff/cache

程序员架构进阶

Linux cache buffer

【乘风破浪的开发者】丁一超:从AI实战营出发探索未知的AI世界

华为云开发者社区

华为 AI modelarts

从“小众”到“首选”,推动云原生产业落地华为云作用几何?

华为云开发者社区

云计算 架构 容器

usdt区块链支付系统开发,承兑支付平台搭建

WX13823153201

usdt区块链支付系统开发

React Fiber 是什么?

局外人

react.js 前端 React

成年人的世界都不容易-看看做到年薪50万的程序员,到底有多累?

Java架构师迁哥

拒招中国程序员后,开源平台 GitLab 又开始大规模封杀开发者账户

Java架构师迁哥

多线程问的太深入不知道怎么回答,从volatile开始给你讲清楚

小Q

Java 学习 面试 volatile 多线程

“3+3”看华为云FusionInsight如何引领“数据新基建”持续发展

华为云开发者社区

数据库 新基建 华为云

那个小白还没搞懂内存溢出,只能用案例说给他听了

田维常

内存溢出

从红黑树的本质出发,彻底理解红黑树!

996小迁

Java 架构 面试 程序人生

#不吐不快# IT职场里的奇葩经历

InfoQ写作平台

职场搞笑 活动专区 奇葩的经历

USDT币支付系统开发搭建,区块链承兑商支付平台

13530558032

数字货币钱包开发费用,区块链钱包开发优势

13530558032

Alibaba首发的《Java技术成长笔记》,渴望提升自己的程序员的必备宝典!

Geek_71bb95

Java 程序员 架构 面试 编程语言

「Spring Boot 2.4 新特性」一键构建Docker镜像

AI乔治

Java Docker 架构

《精通lambda表达式:Java多核编程》.pdf

田维常

Lambda

anyRTC AI降噪|让声音更清晰

anyRTC开发者

人工智能 AI 音视频 WebRTC RTC

亿级大表分库分表实战总结(万字干货,实战复盘)

云流

学习 编程 架构 计算机网络

云算力挖矿模式系统开发,云算力平台搭建

13530558032

覆盖全网的阿里微服务架构有多牛:K8S+实战+笔记+项目教程

马士兵老师

Java 程序员 微服务 Spring Cloud 阿里云 K8S

在JRuby中构建领域特定语言-InfoQ