14
Clojure と ClojureScript

Clojure&clojure script

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Clojure&clojure script

Clojure とClojureScript

Page 2: Clojure&clojure script

Clojure とは• Rich Hickeyが開発した Lisp方言、 Java VM上で動く• Richは大学で作曲専攻、音楽系のソフトウェアを開発している。 Lisp->C++にポーティングする際にオブジェクト指向に嫌気がさして Clojure開発に着手した

• Richが2年半かけて開発、2008年6月に初期バージョンを発表、現在の最新バージョンは 1.6

Page 3: Clojure&clojure script

なぜ Clojure か( Clojure の特徴)?• インタープリタ言語であること➩手軽なこと• 関数型言語であり、第一級関数が利用できること➩引数として関数が利用でき、短い効率的なコードがかけること

• JVM上で稼働すること➩ Javaの膨大な資産が利用できること、高速でスケーラビリティが高いこと

• データはイミュータブルで更新不可であること➩マルチコア、並列処理でもバグが発生しにくいこと

• ソフトウェアトランザクションメモリ (STM)により同期的更新も可能なこと➩ミュータブルにも対応

• Lisp言語であること➩処理とデータが同じ表現であり、マクロにより新たなシンタックスが定義できること

• 遅延束縛を提供➩シンプルな記述で性能と省メモリーを提供

Page 4: Clojure&clojure script

類似の Scala との比較

http://www.infoq.com/jp/articles/the-joy-of-clojure

From The Joy of Clojure の著書の一人の Chris Houser氏

調査 : もっとも表現力に富んだ汎用プログラム言語は Clojure , CoffeeScript , Haskell

http://www.infoq.com/jp/news/2013/04/Language-Expressiveness

Clojureのコアライブラリは高々 8KLines

Page 5: Clojure&clojure script

Scala vs Clojure

Scala: Adorned Overflowing Magnificent

Clojure: Clean Structured Focused

Page 6: Clojure&clojure script

どんな人が Clojure を使うか• ベンチャーでいちはやくサービスや製品を提供したい

• でも、事業の拡大に対してスケーラビリティを担保したい

• 少人数でスキルの高い技術者でチームを固めたい• 関数型言語を極めたい、かつ実用的なソフトウェアを作りたい•制御構造がないので、再帰もしくはmapで記述•基本的にはデータの更新ができない モナド➩

• Javaの資産を活用したい• Lispを勉強したい

Page 7: Clojure&clojure script

Java プログラムとの比較public class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; }}

(defn blank? [str] (every? #(Character/isWhitespace %) str))

Java

Clojure

Javaの 1/10程度のコード量で記述可能Programming Clojure(Stuart Halloway,Aaron Bedra)より

Page 8: Clojure&clojure script

Clojure の事例• CEP(Complex Event Processing)のひとつである

twitter Stormのベース部分はClojureで書かれており、秒 100万件のイベントを処理可能である

• 次世代のDatabaseである datomicは clojureで記述されている。

• ビッグデータ、データ分析とは親和性が高い• cascalog、 incanter、 clojuraticaなど

• Akamai、 citi bankなどで利用されている• http://

dev.clojure.org/display/community/Clojure+Success+Stories

• 東大発のベンチャー企業のテンクー (Xcoo,Inc)が開発した研究者のためのゲノム解析 /可視化のクラウドサービスはすべて clojureで記述されている• https://chrov.is/

Page 9: Clojure&clojure script

Clojure で Hello World$ lein replnREPL server started on port 42412 on host 127.0.0.1REPL-y 0.3.0Clojure 1.5.1 Docs: (doc function-name-here) (find-doc "part-of-name-here") Source: (source function-name-here) Javadoc: (javadoc java-object-or-class-here) Exit: Control+D or (exit) or (quit) Results: Stored in vars *1, *2, *3, an exception in *e

user=> (+ 1 2 3)6user=> (println "Hello World")Hello Worldniluser=> (javax.swing.JOptionPane/showMessageDialog nil "Hello World")niluser=> Bye for now!

Page 10: Clojure&clojure script

ClojureScript とは• JavaScriptを生成する clojureベースのコンパイラである

• Google closureライブラリを用いてコンパイルする

• CoffeeScript、 TypeScriptと同様の位置づけであるが、ブラウザロジックを Lispで記述する• ClojureScriptは Google closureでの最適化を行うので高速、短いコンパイルコードになる

• ClojureScriptと JavaScriptはどちらも型なし言語なので相性がよい

• ブラウザのみならず、 nodejsのコードも作成可能(必要性はあまりないが。。。)

Page 11: Clojure&clojure script

ClojureScript 実行の流れ

ClojureScriptREPL

Browser REPLclient

Effect

Browser REPL

server

JVM browser

JS転送結果

ClojureScriptソースコード

JavaScript 最適化されたJavaScript

ClojureScriptコンパイラ

Google closureコンパイラ

Java VM

コード入力

Page 12: Clojure&clojure script

ClojureScript の実例• Chris Gingerが KickStarterで資金を調達して開発しているもっともシンプルで軽量かつ美しいエディタといわれる LightTableは1万行程度のClojureScriptで書かれている• プラグインによるフルカスタマイズ• Live Evaluation機能

• ClojureScript+Facebook ReactJSを利用したDevid Nolenの omが最も ClojureScript界隈で最もHotになっていてメーリングリストでは毎日数10通のやりとりがなされている。• コンポーネントのサポート• ReactJSが提供する Virtual Domと Clojureの immutableの親和性 高速な➩ JavaScriptソフトウェアの作成

Page 13: Clojure&clojure script

ClojureScript で Hello World

$ lein trampoline cljsbuild repl-rhinoRunning Rhino-based ClojureScript REPL.To quit, type: :cljs/quitClojureScript:cljs.user> (+ 1 2 3)6ClojureScript:cljs.user> (println "Hello World")Hello WorldnilClojureScript:cljs.user>

Page 14: Clojure&clojure script

Browser-repl での HelloWorld