爲何 ClojureScript 很重要

這篇文章對 ClojureScript 生態的描述有些過期了,
新的生態能夠稍微參考這邊的描述 http://cljs-book.clj.im/javascript

免責聲明

我寫這篇文章的目的, 主要是介紹 ClojureScript, 介紹其社區的能耐
然而我本人只是按着教程寫過簡單的 ClojureScript, 並非自身用戶
同時, 我最近一直在關注 ClojureScript 的發展, 蒐集了很多的資料
總結一下就是我不能給出關於 ClojureScript 一個公允的評價
而是打算有目的地吹捧 ClojureScript, 但願國內有更多人關注這門語言html

Clojure 的做者

那麼個人目的, 或者說出發點, 實際上是 JavaScript 當中的各類問題
咱們知道 JavaScript 最初設計時沒有理解清楚需求, 埋了大量的坑
而不少語言是背後有牛人作精心的設計的, 好比 Clojure
JavaScript 本打算學 Scheme, 沒成功, 然而 Clojure 可算成功了
Clojure 繼承了大量的 Lisp 特性, 屬於很明顯的 Lisp 和 JVM 結合的技術前端

Clojure 的做者是 Rich Hickey, 2011 年有他的採訪這樣介紹他:
http://codequarterly.com/2011...java

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.node

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.react

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.android

我在網上看到他的很多的演講, 風格其實差很少, 觀點也差很少
他當過大學老師, 常常演講開頭翻詞典解釋名詞的意思, 總之就是那樣一個風格
觀點都是函數式編程, 不可變數據居多, 圍繞着 Clojure 語言跟 Datomic 數據庫
還有人專門寫了個文章, 介紹 Rich Hickey 一向的那些主張:ios

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

ClojureScript 的發明

時間一晃而過, Clojure 發明是在 2007 年, 到如今已經有 8 年的時間了
https://en.wikipedia.org/wiki...
按照去年的統計, 大體是 GitHub 上第 23 名的語言, 跟 Haskell 和 Lua 差很少
http://githut.info/
整個語法是 Lisp 融入了 Java 風格語言的一些括號, 就像是這樣github

(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 比比, 誰看起來更靠譜

相關文章
相關標籤/搜索