為什么 ClojureScript 很重要

jopen 9年前發布 | 24K 次閱讀 ClojureScript

免責聲明

我寫這篇文章的目的, 主要是介紹 ClojureScript, 介紹其社區的能耐

然而我本人只是按著教程寫過簡單的 ClojureScript, 并不是自身用戶

同時, 我最近一直在關注 ClojureScript 的發展, 搜集了不少的資料

總結一下就是我不能給出關于 ClojureScript 一個公允的評價

而是打算有目的地吹捧 ClojureScript, 希望國內有更多人關注這門語言

Clojure 的作者

那么我的目的, 或者說出發點, 其實是 JavaScript 當中的各種問題

我們知道 JavaScript 最初設計時沒有理解清楚需求, 埋了大量的坑

而很多語言是背后有牛人做精心的設計的, 比如 Clojure

JavaScript 本打算學 Scheme, 沒成功, 然而 Clojure 可算成功了

Clojure 繼承了大量的 Lisp 特性, 屬于很明顯的 Lisp 和 JVM 結合的技術

Clojure 的作者是 Rich Hickey, 2011 年有他的采訪這樣介紹他:

http://codequarterly.com/2011/rich-hickey/

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 一貫的那些主張:

ClojureScript 的發明

時間一晃而過, Clojure 發明是在 2007 年, 到現在已經有 8 年的時間了

https://en.wikipedia.org/wiki/Clojure

按照去年的統計, 大致是 GitHub 上第 23 名的語言, 跟 Haskell 和 Lua 差不多

http://githut.info/

整個語法是 Lisp 融入了 Java 風格語言的一些括號, 就像是這樣

clojure
(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-compilation.html

總之 Clojure 到現在已經有了其巨大的生態圈, 而且熟練引用 Java 類庫:

https://github.com/razum2um/awesome-clojure

然后終于說到了 ClojureScript, 前面說運行在 JVM 上, 這邊開始瀏覽器了

ClojureScript 是 2011 年開始開發, 后面主要是 David Nolen 在露臉

ClojureScript 在幾年當中逐漸完善工具鏈, 漸漸變得易用

同時能, 也一陣一陣地把 Clojure 更新的功能移植過來

復雜的歷史可以看這份 PDF 來了解:

http://www.michielborkent.nl/fpamsclj/fpamsclj.pdf

我接觸 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 倍.. 不可思議

背后端原因呢, 是不可變數據, 后來 非死book 做了 immutable-js 也達到了效果

可是這么一搞, React 社區對應自身的理解慢慢就變了

Om 聽說做了幾個事情, 首先是上邊說的不可變數據, 提高 DOM Diff 效率

然后還有 render loop 處理, 合并 DOM 操作, 具體可以看文章

http://swannodette.github.io/2013/12/17/the-future-of-javascript-mvcs/

為什么 ClojureScript 很重要

隨后更多細節的出現, 讓人都覺得用不可變數據寫 React 都是理所當然的了

http://www.slideshare.net/borgesleonardo/high-performance-web-apps-in-...

還有這個 David Nolen 的采訪: Om: Enhancing 非死book's React with Immutability

http://www.infoq.com/news/2014/01/om-react

不過這個事情還沒完, ClojureScript 社區實際上超能折騰

還記得我們用 react hot loader 時候覺得多厲害, 還有 Redux 覺得多震撼

但是 Redux 作者說了他就是受到 Elm 跟 figwheel 的啟發才弄出來的

Elm 前面我寫過了, 一門用來研究的 Haskell 方言嘛

而 figwheel, 實際上就是 ClojureScript 社區的方案用來做 React 的 live coding

https://github.com/bhauman/lein-figwheel

為什么 ClojureScript 很重要

Live Coding 經過 Bret Victor, Chris Granger 這些人一搞, 已經深入人心了

至少前端開發如果還做不到代碼熱替換, 多少有點, 那個, 對吧, 不夠好玩

因為 ClojureScript 數據不可變嘛, 實現起來比 JavaScript 還是要容易一點

關于 Figwheel 的視頻多看一下就知道了, JavaScript 還在追趕呢, 什么 Amok, Redux 的..

Bruce Hauman - Developing ClojureScript With Figwheel

https://www.油Tube.com/watch?v=j-kj2qwJa_E

Interactive Programming in ClojureScript

http://rigsomelight.com/2014/05/01/interactive-programming-flappy-bird...

由于這樣的事情, 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/posts/2015-07-20-ios-clojurescript-repl-avai...

為什么 ClojureScript 很重要

又來了一個叫 Replicator 的項目, 干脆 Android 上也來搞一個

http://tahmid.me/posts/2015-07-15-bootstrapped-cljs-repl-for-android.h...

為什么 ClojureScript 很重要

這下也熱鬧了, Bootstrapped ClojureScript 目標還是挺遠大的, 看 Wiki:

https://github.com/clojure/clojurescript/wiki/Bootstrapped-ClojureScri...

總結

概括一下上邊提到的 ClojureScript有哪些好處

  • 作者開發經驗多, 設計語言考慮得多, 不像 JavaScript
  • 天生支持 Lisp Macro 跟 persistent data structure, 而 JavaScript 靠山寨
  • 函數式編程支持明顯比 JavaScript 好
  • JavaScript React 能做的, ClojureScript 也能做, 還更能折騰
  • 在后端有 Clojure 撐腰, 又把 Node.js 給壓下去了

至于壞處呢... 自己翻文檔看看語法學起來多難就知道了

http://funcool.github.io/clojurescript-unraveled/

還有 JVM 的啟動時間, Emacs 的嬗變程度, leningen 的不適應程度

當然你還可以看看 Clojure 中文社區冷清程度...

http://clojure-china.org/

http://blog.clojure.cn/

https://groups.google.com/forum/#!forum/cn-clojure

但是, 我不明白為啥 QQ 群(130107204)偏偏有好多人

最后 Rich Hickey 的演講讓我獲益良多, 有興趣的同學可以看看

https://github.com/matthiasn/talk-transcripts/tree/master/Hickey_Rich

http://www.infoq.com/author/Rich-Hickey

當然看得目的主要是跟 Brendan Eich 比比, 誰看起來更靠譜

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!