写点什么

JRuby 和 Clojure——一对好搭档?

2009 年 3 月 28 日

Clojure 是一种 LISP 风格的语言,运行在 JVM 上。Clojure 的一大特色就是其并发机制,它支持不可变的数据结构(Clojure 是来自于可持久化的数据结构)。Clojure 还有一个特色是软件事务存储(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM 还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个JVM 上的实现。

Clojure 有望在近期发行 1.0 版,已经有很多 Clojure 库已经可以用了。其中一些是受到了 Ruby 库的启发,这里只列出几个:

  • Compojure 是一个 Clojure 的 web 框架。从它的 README 文件可以看出它是受到了 Ruby 的 web 框架 Sinatra 的启发。
  • Ring 用来提供 HTTP 服务,类似于 Python 的 WSGI 和 Ruby 的 Rack。
  • clj-record 是一个类似于 ActiveRecord 的 ORM 映射器。
  • Lancet 是个 Clojure 构建工具,类似于 Rake,开发者是 Stuart Halloway。
  • clj-haml 是从 Ruby 的 HAML 库移植过来的。

Clojure 库受 Ruby 库的启发,是这两种语言的相互影响的一种途径。另外一种途径是 JRuby——两种语言共享了相同的底层运行库——JVM。

Daniel Kwiecinski 在一篇博客中探索了融合 JRuby 和 Clojure 的想法,并实验了让 Clojure 数据结构和一些特性作为 Ruby 对象在 JRuby 中能用。就这一点上特别有意思的是 Clojure 的可持久化的数据结构,例如它的可持久化向量(Persistent Vectors)。注意:在这里,“可持久”并不是指数据被保存在磁盘上。可持久化的数据结构是不可变的;像插入之类的操作也许能用,但需要对数据结构做一个完整的“拷贝”。Clojure 的实现和不变的约束允许避免被迫做一个完整的“拷贝”;而只主要复制一些相对较小的要素。Karl Krukow演示了Clojure 的可持久化向量的实现,还解释了它的原理。

JRuby 开发人员的另一个机会是 Clojure 支持的STM,它提供了一条路让 Ruby 开发人员去尝试这个概念。即使 Ruby 代码没有明确使用任何 Clojure STM 特性,也可以用 Clojure 来写底层的应用模型,而让 JRuby 来做前端部分,比如 Rails 或者其他 Ruby 框架。

还有一个选择是用 Clojure 来解决性能瓶颈。尽管 JRuby 的性能还在稳步提升,但仍有一些时候需要在性能和 (J)Ruby 的多态与灵活性之间权衡。在 MRI 中,在一个 Ruby 应用程序中,性能瓶颈可以通过写一些本地扩展来解决。在 JRuby 中,一种方案是用 Java 写代码, 用 Java 源代码,或者生成 JVM 字节码都行(要么用Ruby 的字节码DSL 生成字节码,要么用Clarles Nutter 的Duby 之类的语言)。

选择一个低级的系统语言,比如C(用于MRI)或者Java(用于JRuby)有些短处:这降低了Java 的等级,也丢掉了一些特性,比如Block、很多类型的元编程等等。

要解决这个问题,Clojure 是一个可能的方案:这种语言具有多种级别的灵活性。例如,普通的Clojure 函数都有较低的调用开销,因为它们都尽量降为静态函数调用。Clojure 还提供了不同风格的运行期多态,例如用 multimethods 的形式。

Clojure 是一种 LISP 语言,并且具有强大的宏系统。宏可以实现编译期的元编程(compile-time metaprogramming),帮你你把生成代码的工作扔给计算机(而不是写样板文件或者反复手工写 Java 代码)。Clojure 代码最终会编译成 JVM 字节码,并且支持提前( Ahead Of Time,AOT )编译。Azul 的 Cliff Click研究了几种JVM 语言的性能,其中包括Clojure 和JRuby,并提供一些有关Clojure 性能的信息。总之,Clojure 提供了很大的便利让你用优雅的风格写出运行飞快的代码。

硬币的另一面自然是依赖的问题:使用Clojure 意味给项目增加一个新的依赖。这究竟是不是个好主意,把Clojure 这样的语言加入一个工程,是许多团队都会面对的问题。

并发性的解决方案STM,并且共享数据已经被广泛讨论。Clojure 的创建人 Rich Hickey 跟 Azul 的 Cliff Click 有一个很长的讨论,议题就是 STM。关于 STM 的另一个信息来源是去年九月的ACMQueye 的并发性专刊

你怎么认为:JRuby 和Clojure——是一对好搭档吗?

查看英文原文: JRuby and Clojure - A Good Match?

2009 年 3 月 28 日 04:142054
用户头像

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

关注

评论

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

GitMaster 更新v1.9.0,支持Gitea,Gist拥抱黑暗模式

neo

gitlab tree gitee GitHub、

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

InfoQ写作平台官方

写作平台 排行榜

涵盖多场景区块链与政务结合 应用前景广阔

CECBC区块链专委会

区块链 互联网 数字政务

架构师训练营0期11周

WW

mPaaS 客户端证书错误避坑指南

阿里云金融线TAM SRE专家服务团队

有为而治:平衡吞噬世界的系统之熵

IT民工大叔

【FCC前端教程】44关学习CSS与CSS3基础「二」

三钻

CSS 前端 FCC

架构师训练营第 11周作业和感想

tuuezzy

极客大学架构师训练营

oeasy教您玩转linux010107那啥在哪 whereis

o

LeetCode题解:155.最小栈,使用两个栈,详细注释

Lee Chen

LeetCode 前端进阶训练营

数据挖掘学习指南(转载)

Jackchang234987

数据挖掘 产品经理

建设开发者生态:6项华为API管理原则落地

华为云开发者社区

开发者 API 华为云 API Explorer平台 应用技术

企业网络安全漏洞多,这些等保服务来填坑

华为云开发者社区

Web 安全 防火墙 等保 DDoS

学习Python真的能找到工作吗?

代码制造者

Python 程序员 编程语言 低代码 零代码

化妆品行业与区块链的融合可减少甚至消除假冒伪劣

CECBC区块链专委会

区块链 化妆品

开发者的福音,LR.NET模块化代码生成器

Philips

敏捷开发 快速开发 模块化流程 代码质量 .net core

分享一个阿里云轻量级开源前端图编排,流程图js组件——butterfly-dag

InfoQ_39ba186c207f

Java 流程图 flow canvas html/css

最强云硬盘来了,让AI模型迭代从1周缩短到1天

华为云开发者社区

SSD 云存储 All-Flash 云硬盘 擎天架构

屏幕共享接入指南

anyRTC开发者

WebRTC 在线教育 直播 RTC

面试官想知道都在这里

escray

学习 面试 面试现场

抗疫复产,CDN助企业破局发展

华为云开发者社区

CDN 网络 华为云 CDN加速 企业应用

穿什么衣服去面试?

escray

学习 面试 面试现场

软件开发丨关于软件重构的灵魂四问

华为云开发者社区

软件 开发者 软件开发 代码 软件重构

微服务架构下,DLI的部署和运维有何奥秘?

华为云开发者社区

Docker 大数据 Serverless 数据湖 DLI

区块链 新基建定位下的新使命 2020新区势

CECBC区块链专委会

区块链 新基建

甲方日常 3

句子

工作 随笔杂谈 日常

微前端在民生 APaaS/PSET 平台的探索与实践

亻尔可真木奉

探索与实践 案例分享 微前端

Flink-状态后端作用-11

小知识点

scala 大数据 flink

消息队列之推还是拉,RocketMQ 和 Kafka 是如何做的?

yes

kafka RocketMQ

柔性电子拥有改变地球的能力吗?

脑极体

ShardingSphere简介+实战

云淡风轻

ShardingJDBC

低代码的认知误区与落地实践

低代码的认知误区与落地实践

JRuby和Clojure——一对好搭档?-InfoQ