写点什么

在 JRuby 中构建领域特定语言

  • 2007 年 5 月 22 日
  • 本文字数:931 字

    阅读完需:约 3 分钟

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:30371
用户头像

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

关注

评论

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

太厉害了,终于有人能把Ansible讲的明明白白了,建议收藏

互联网老辛

ansible

介绍一款能取代 Scrapy 的爬虫框架 - feapder

星安果

Python 爬虫 Scrapy feapder

噱头or契机:多端协同游戏的草蛇灰线

脑极体

如何利用 Google 开源工具 Ko 在 kubernetes 建并部署 Go 应用

公众号:云原生Serverless

Kubernetes 云原生

产品训练营第三周作业

innovator琳

产品

Python OOP-2

若尘

面向对象 oop 面向对象编程 Python编程

Go 的 UTF-8 实现

Rayjun

utf-8 Go 语言

40 图|硬核解析用 Mac M1 玩转 SpringCloud

悟空聊架构

开源 Mac SpringCloud m1 passjava

深入汇编指令理解Java关键字volatile

AI乔治

Java 架构 volatile Java内存模型

Java最前沿技术——ZGC

AI乔治

Java 架构 jdk ZGC JVM

掉坑了!GROUP_CONCAT函数引发的线上问题

AI乔治

Java MySQL 架构 GROUPING运算符

一次用户故事拆分分享

Bruce Talk

敏捷 Agile 用户故事 User Story

苹果(Apple Watch)手表使用必知必会19条

Flychen

苹果手表 IWatch Apple Watch

HZFE 快报002 / 比特币7年来首次跌破50天均线

HZFEStudio

大前端 金融科技 科技互联网 资讯

内容平台与热点挖掘思考

程序员架构进阶

28天写作 4月日更 领域思考 内容平台

Golang 反射

escray

学习 极客时间 Go 语言 4月日更

ceph-csi源码分析(2)-组件启动参数分析

良凯尔

Kubernetes 源码分析 Ceph CSI

【得物技术】得物分布式UI自动化实践

得物技术

测试 UI 质量 自动化测试 得物技术

浅析 Linux 中的 I/O 管理

赖猫

Linux

微信读书又更新,吃灰已久的Pencil又能拿出来遛一遛了。

彭宏豪95

效率工具 读书 阅读 4月日更 微信读书

读书有用吗

孙苏勇

读书

关于读书的随想

小天同学

读书 4月日更

ceph-csi源码分析(1)-组件介绍与部署yaml分析

良凯尔

Kubernetes 源码分析 Ceph CSI

Git 常用命令速查

箭上有毒

4月日更

大数据-数据处理分类篇

进击的梦清

大数据 批处理 流式计算框架

打通本地部署和公有云,混合云架构让“鱼”和“熊掌”兼得(一)

UCloud技术

混合云

高效获取信息的几点经验

彭宏豪95

效率 信息 阅读 4月日更

大学生调研:在选择工作时,最看重什么?

石云升

28天写作 4月日更 1 周年盛典

Flink的Checkpoint持久化存储方案

五分钟学大数据

flink 4月日更

基于NIO高性能、可扩展网络应用库:xSocket

风翱

4月日更 xSocket

DAPP系统开发运营版,DAPP系统开发案例源码

系统开发咨询1357O98O718

在JRuby中构建领域特定语言_Java_Ian Roughley_InfoQ精选文章