为什么 ClojureScript 很重要

这篇文章对 ClojureScript 生态的描述有些过时了,
新的生态可以稍微参考这边的描述 http://cljs-book.clj.im/

免责声明

我写这篇文章的目的, 主要是介绍 ClojureScript, 介绍其社区的能耐
然而我本人只是按着教程写过简单的 ClojureScript, 并不是自身用户
同时, 我最近一直在关注 ClojureScript 的发展, 搜集了不少的资料
总结一下就是我不能给出关于 ClojureScript 一个公允的评价
而是打算有目的地吹捧 ClojureScript, 希望国内有更多人关注这门语言

Clojure 的作者

那么我的目的, 或者说出发点, 其实是 JavaScript 当中的各种问题
我们知道 JavaScript 最初设计时没有理解清楚需求, 埋了大量的坑
而很多语言是背后有牛人做精心的设计的, 比如 Clojure
JavaScript 本打算学 Scheme, 没成功, 然而 Clojure 可算成功了
Clojure 继承了大量的 Lisp 特性, 属于很明显的 Lisp 和 JVM 结合的技术

Clojure 的作者是 Rich Hickey, 2011 年有他的采访这样介绍他:
http://codequarterly.com/2011...

Best known as the inventor of Clojure, a Lisp that runs on the Java Virtual Machine and the first new member of the Lisp family to attract any widespread interest since Scheme and Common Lisp, Rich Hickey has been a software developer and consultant for two decades.

Prior to starting work on Clojure, he made four attempts to combine Lisp with either Java or Microsoft’s Common Language Runtime: jfli, Foil, Lisplets, and DotLisp but Clojure was the first to draw significant attention.

In past lives Hickey has been a music composition major, a guitarist, and a serious C++ programmer, even teaching an Advanced C++ course at New York University. In this interview, Michael Fogus talks with Hickey about complexity, abstraction, and the past, present, and future of Clojure.

我在网上看到他的不少的演讲, 风格其实差不多, 观点也差不多
他当过大学老师, 经常演讲开头翻词典解释名词的意思, 总之就是那样一个风格
观点都是函数式编程, 不可变数据居多, 围绕着 Clojure 语言跟 Datomic 数据库
还有人专门写了个文章, 介绍 Rich Hickey 一贯的那些主张:

The Unofficial Guide to Rich Hickey's Brain
http://www.flyingmachinestudi...

ClojureScript 的发明

时间一晃而过, Clojure 发明是在 2007 年, 到现在已经有 8 年的时间了
https://en.wikipedia.org/wiki...
按照去年的统计, 大致是 GitHub 上第 23 名的语言, 跟 Haskell 和 Lua 差不多
http://githut.info/
整个语法是 Lisp 融入了 Java 风格语言的一些括号, 就像是这样

(def
 ^{:arglists '([x seq])
    :doc "Returns a new seq where x is the first element and seq is
    the rest."
   :added "1.0"
   :static true}

Clojure 首先是在 JVM 上运行的, 借助了 JVM 上的 Bytecode:
http://blog.ndk.io/2014/01/26...


总之 Clojure 到现在已经有了其巨大的生态圈, 而且熟练引用 Java 类库:
https://github.com/razum2um/a...

然后终于说到了 ClojureScript, 前面说运行在 JVM 上, 这边开始浏览器了
ClojureScript 是 2011 年开始开发, 后面主要是 David Nolen 在露脸
ClojureScript 在几年当中逐渐完善工具链, 渐渐变得易用
同时能, 也一阵一阵地把 Clojure 更新的功能移植过来
复杂的历史可以看这份 PDF 来了解:
http://www.michielborkent.nl/...

我接触 ClojureScript 主要是在 LightTable 名噪一时的那段时间
Chris Granger 用 ClojureScript 开发 LightTable, 运行在 node-webkit 上
LightTable 特别厉害的是他的 live coding 功能, Clojure 代码直接显示结果
而且我们也看到了 JavaScript 在其中运行, 进行代码热替换, 非常震撼的开发工具
live coding 从此一发不可收拾, Chris Granger 也把 ClojureScript 夸上天上了

Om

后来发生的事情终于跟我有点搭上了, 2013 年, Om 开始开发了
其实我到 2014 年夏天才接触 React 的, 但总之事情蔓延到 React 社区过来了
Om 神奇的地方在于他的性能据说在 React 的基础上提升了 3 倍.. 不可思议
背后端原因呢, 是不可变数据, 后来 Facebook 做了 immutable-js 也达到了效果
可是这么一搞, React 社区对应自身的理解慢慢就变了

Om 听说做了几个事情, 首先是上边说的不可变数据, 提高 DOM Diff 效率
然后还有 render loop 处理, 合并 DOM 操作, 具体可以看文章
http://swannodette.github.io/...

随后更多细节的出现, 让人都觉得用不可变数据写 React 都是理所当然的了
http://www.slideshare.net/bor...
还有这个 David Nolen 的采访: Om: Enhancing Facebook's React with Immutability
http://www.infoq.com/news/201...

不过这个事情还没完, ClojureScript 社区实际上超能折腾
还记得我们用 react hot loader 时候觉得多厉害, 还有 Redux 觉得多震撼
但是 Redux 作者说了他就是受到 Elm 跟 figwheel 的启发才弄出来的
Elm 前面我写过了, 一门用来研究的 Haskell 方言嘛
而 figwheel, 实际上就是 ClojureScript 社区的方案用来做 React 的 live coding
https://github.com/bhauman/le...

Live Coding 经过 Bret Victor, Chris Granger 这些人一搞, 已经深入人心了
至少前端开发如果还做不到代码热替换, 多少有点, 那个, 对吧, 不够好玩
因为 ClojureScript 数据不可变嘛, 实现起来比 JavaScript 还是要容易一点
关于 Figwheel 的视频多看一下就知道了, JavaScript 还在追赶呢, 什么 Amok, Redux 的..
Bruce Hauman - Developing ClojureScript With Figwheel
https://www.youtube.com/watch...
Interactive Programming in ClojureScript
http://rigsomelight.com/2014/...

由于这样的事情, React 现在跟 Clojure 社区越走越近
但是怎么看, JavaScript 实现 immutable, ClojureScript 可是默认就实现了的
Clojure 的 persistent data structure 通过编译, 很直接就在 ClojureScript 实现
不是要函数式编程吗? JavaScript 一堆历史包袱, 怎么和看起来就是 Lisp 的 Clojure 比
还有事件处理, Clojure 有 core.async, 我也不懂, 但 JavaScript 呢, promise?
还在 ClojureScript 学习门槛太高了, Webpack 也不兼容, 不会翻了天

跨平台

随后发生的戏剧性的事情是, ClojureScript 也号称前后端都能写了
本来 JavaScript 同时写前端后端, 风光了很久, 可是呢 Node.js 性能也就那副样子
跟跑在 Clojure 上的 JVM 当然是比不了, 人家是正经的服务器端语言, Java 级别的
然后前端呢, Om 一来, 前端也能函数式编程了, ClojureScript 一编译, 正好
于是 Clojure 后端写高性能服务器, 前端高性能 DOM 操作, 反正全栈了
接着又来一招, 后端有 Dotamic 数据库, 前端又给实现了 DataScript
前面讲过, 就是 persistent data structure 当数据库用嘛, 反正前后端又打通了

JavaScript 这边也算争气, 因为 iOS 有 JavaScriptCore, 能运行嘛
我们知道 React Native 就是借此在 iOS 上运行的, 对前端开发者来说还不错
可是呢, 最近事情偏偏多了起来, Clojure Europe 上, David Nolen 介绍了新项目
大致上就是 ClojureScript 做一些处理, 减少 JVM 的依赖, 更加方便嵌入
比方说, 前些天出来的 Replete, 就是一个在 iOS 上运行 ClojureScript REPL 的例子
http://blog.fikesfarm.com/pos...

又来了一个叫 Replicator 的项目, 干脆 Android 上也来搞一个
http://tahmid.me/posts/2015-0...

这下也热闹了, Bootstrapped ClojureScript 目标还是挺远大的, 看 Wiki:
https://github.com/clojure/cl...

总结

概括一下上边提到的 ClojureScript有哪些好处

  • 作者开发经验多, 设计语言考虑得多, 不像 JavaScript

  • 天生支持 Lisp Macro 跟 persistent data structure, 而 JavaScript 靠山寨

  • 函数式编程支持明显比 JavaScript 好

  • JavaScript React 能做的, ClojureScript 也能做, 还更能折腾

  • 在后端有 Clojure 撑腰, 又把 Node.js 给压下去了

至于坏处呢... 自己翻文档看看语法学起来多难就知道了
http://funcool.github.io/cloj...
还有 JVM 的启动时间, Emacs 的嬗变程度, leningen 的不适应程度
当然你还可以看看 Clojure 中文社区冷清程度...
http://clojure-china.org/
http://blog.clojure.cn/
https://groups.google.com/for...
但是, 我不明白为啥 QQ 群(130107204)偏偏有好多人

最后 Rich Hickey 的演讲让我获益良多, 有兴趣的同学可以看看
https://github.com/matthiasn/...
http://www.infoq.com/author/R...
当然看得目的主要是跟 Brendan Eich 比比, 谁看起来更靠谱

阅读 17.4k

推荐阅读
题叶
用户专栏

ClojureScript 爱好者.

542 人关注
252 篇文章
专栏主页