Your SlideShare is downloading. ×
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
ClojureとClojurescript
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

ClojureとClojurescript

156

Published on

ClojureとClojurescriptの概要です。

ClojureとClojurescriptの概要です。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
156
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Makoto Hashimoto
  • 2. • Rich Hickeyが開発したLisp方言、Java VM上で動く関数型 言語である • Richは大学で作曲専攻、音楽系のソフトウェアを開発して いる。Lisp->C++にポーティングする際に苦労し、オブ ジェクト指向に嫌気がさしてClojure開発に着手した • Richが2年半かけて開発、2008年6月に初期バージョ ンを発表、現在の最新バージョンは1.7-alpha-5 • Simple made easy
  • 3. • Lisp言語であること➩処理とデータが同じ表現で あり、マクロにより新たなシンタックスが定義で きること(Lispであることが最大の特徴であり最 大の欠点) • インタープリタ言語であること➩手軽である • 関数型言語であり、第一級関数が利用できること ➩抽象度の高い記述、関数の引数として関数が利 用でき、短い効率的なコードがかける • データはイミュータブルで更新不可であること➩ マルチコア、並列処理でもバグが発生しにくいこ と
  • 4. • JVM上で稼働すること➩Javaの膨大な資産が利用 できること、高速でスケーラビリティが高いこと • ソフトウェアトランザクションメモリ(STM)によ り同期的更新も可能なこと➩並列処理、ミュータ ブルにも対応 • 遅延評価を提供➩シンプルな記述で性能と省メモ リーを提供 インタープリターサイト http://www.tryclj.com/ http://clojurescript.net/
  • 5. Scala: Adorned(飾られた) Overflowing(満ち溢れている) Magnificent(壮大な、豪華な) Clojure: Clean Structured Focused
  • 6. 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 Joke!
  • 7. Program Source Code CPU secs Elapsed secs Memory KB Code B ≈ CPU Load k-nucleotide Clojure 21.87 8.56 403,468 2723 68% 36% 84% 69% Java 36.65 10.71 1,120,960 1844 94% 82% 84% 83% binary-trees Clojure 47.04 13.93 609,300 750 83% 87% 89% 81% Java 18.84 13.36 511,792 603 71% 21% 20% 31% fannkuch-redux Clojure 76.33 19.94 69,456 1491 97% 97% 96% 95% Java 70.25 17.81 27,048 1282 98% 99% 99% 99% spectral-norm Clojure 18.37 5.28 65,296 918 84% 98% 83% 84% Java 17.60 4.55 25,696 950 96% 96% 97% 98% n-body Clojure 28.20 27.01 73,664 1440 98% 3% 2% 3% Java 22.64 22.62 25,232 1424 1% 2% 1% 97% mandelbrot Clojure 32.17 8.95 154,340 1195 89% 89% 87% 97% Java 28.05 7.17 86,152 796 98% 97% 98% 99% regex-dna Clojure 27.16 8.59 606,564 707 69% 92% 75% 81% Java 22.72 6.31 648,924 1410 89% 96% 88% 89% pidigits Clojure 5.43 4.19 84,588 1944 64% 13% 47% 8% † Java 3.15 3.03 29,084 938 3% 4% 81% 21% † fasta-redux Clojure 6.14 5.01 73,828 1428 48% 24% 9% 43% † Java 2.63 2.57 25,272 1443 2% 77% 2% 24% † reverse-complement Clojure 4.06 2.73 569,780 727 15% 35% 95% 7% Java 2.73 1.25 307,740 1661 37% 90% 44% 50% fasta Clojure 7.97 6.64 73,500 1653 5% 50% 8% 58% Java 5.78 2.16 33,640 2457 84% 59% 61% 66%
  • 8. Program Source Code CPU secs Elapsed secs Memory KB Code B ≈ CPU Load k-nucleotide Ruby 37.35 12.36 457,396 996 70% 69% 97% 68% Java 36.65 10.71 1,120,960 1844 94% 82% 84% 83% regex-dna Ruby 28.73 9.65 118,660 529 66% 65% 67% 100% Java 22.72 6.31 648,924 1410 89% 96% 88% 89% pidigits Ruby 10.96 10.98 76,712 240 0% 1% 100% 1% Java 3.15 3.03 29,084 938 3% 4% 81% 21% binary-trees Ruby 169.68 57.70 257,388 1123 65% 97% 67% 67% Java 18.84 13.36 511,792 603 71% 21% 20% 31% reverse-complement Ruby 8.21 8.22 132,256 255 1% 0% 0% 100% † Java 2.73 1.25 307,740 1661 37% 90% 44% 50% † spectral-norm Ruby 391.41 102.20 41,320 828 96% 96% 95% 95% Java 17.60 4.55 25,696 950 96% 96% 97% 98% n-body Ruby 640.09 640.26 7,160 1137 1% 0% 0% 100% Java 22.64 22.62 25,232 1424 1% 2% 1% 97% fasta-redux Ruby 108.37 108.45 252,508 772 1% 0% 100% 1% Java 2.63 2.57 25,272 1443 2% 77% 2% 24% fannkuch-redux Ruby 3,197.06 828.60 30,592 1426 96% 98% 96% 97% Java 70.25 17.81 27,048 1282 98% 99% 99% 99% mandelbrot Ruby 1,865.72 467.23 65,176 1019 100% 100% 100% 100% Java 28.05 7.17 86,152 796 98% 97% 98% 99% fasta Ruby 148.59 148.66 7,652 987 18% 23% 32% 29% † Java 5.78 2.16 33,640 2457 84% 59% 61% 66% †
  • 9. • ベンチャーでいちはやくサービスや製品を提供し たい、かつ事業の拡大に対してスケーラビリティ を担保したい • 少人数でスキルの高い技術者でチームを固めたい • 関数型言語を極めたい、かつ実用的なソフトウェ アを作りたい • 制御構造がないので、再帰もしくはmapで記述 • 基本的にはデータの更新ができない➩モナド • Javaの資産を活用したい • Lispを勉強したい
  • 10. 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)より
  • 11. $ lein repl nREPL server started on port 42412 on host 127.0.0.1 REPL-y 0.3.0 Clojure 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) 6 user=> (println "Hello World") Hello World nil user=> (javax.swing.JOptionPane/showMessageDialog nil "Hello World") nil user=> Bye for now!
  • 12. • 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+S tories • 東大発のベンチャー企業のテンクー(Xcoo,Inc)が開 発した研究者のためのゲノム解析/可視化のクラウド サービスはすべてclojureで記述されている • https://chrov.is/
  • 13. プロダクト version 解説 ring 1.3.2 アプリケーションサーバーのライブラリであり、pythonの WSGIやrubyのRackにインスパイヤされて開発された。 compojure 1.3.1 Ringのルーティングライブラリである。 enlive 1.1.5 clojureベースのテンプレートライブラリ Http-Kit 2.1.6 ClojureベースのWebSocketサポートのアプリケーション サーバー、60万同時接続を1台のPCで実現した。 Immutant 2.0.0- beta1 Jboss.orgの正式プロジェクト、Wildfly(J2EE)のClojureライ ブラリ、Undertow、HornetQ、Infinispan、Quartzなどをサ ポート Instaparse 1.3.5 Clojureベースの文脈自由文法のパーサー、Rich Hickeyが絶 賛した Monger 2.0.1 MongoDBのライブラリ、機能が多い上に使いやすくかつ性 能がよい。 Incanter 1.5.6 ClojureベースのRのような分析環境 Pallet Palletopsが提供しているclojureベースのプロビジョンツー ル
  • 14. • JavaScriptを生成するclojureベースのコンパイラ である • Google closureライブラリを用いてコンパイルす る • CoffeeScript、TypeScriptと同様の位置づけであ るが、ブラウザロジックをLispで記述する • ClojureScriptはGoogle closureでの最適化を行うので高 速、短いコンパイルコードになる • ClojureScriptとJavaScriptはどちらも型なし言語 なので相性がよい • ブラウザのみならず、nodejsのコードも作成可 能(必要性はあまりないが。。。)
  • 15. ClojureScript REPL Browser REPL server Effect Browser REPL client JVM browser JS転送 結果 ClojureScript ソースコード JavaScript 最適化された JavaScript ClojureScript コンパイラ Google closure コンパイラ Java VM コード入力
  • 16. • Chris GingerがKickStarterで資金(7,317名、 $316,720)を調達して開発しているシンプルで軽 量かつ美しいエディタといわれるLightTableは1万 行程度のClojureScriptで書かれている • プラグインによるフルカスタマイズ(clojure,python, • Live Evaluation機能 • Cilcle-CIのフロントエンド • CIツールであるCilcle-CIはclojurescript/omで開発され ている。
  • 17. $ lein trampoline cljsbuild repl-rhino Running Rhino-based ClojureScript REPL. To quit, type: :cljs/quit ClojureScript:cljs.user> (+ 1 2 3) 6 ClojureScript:cljs.user> (println "Hello World") Hello World nil ClojureScript:cljs.user>
  • 18. • 開発者はDavid Nolen • Facebook ReactjsをClojurescriptでラッパーした もの • 単なるラッパーではなく、immutableの特性などclojure の特徴を活かす • Todoベンチマークで高速なjavascript処理を記録 • Om > React >> angularjs
  • 19. • UST THE UI • ReactはMVCの中のViewのためのフレームワークであ り、残りのModel、Controlに対して技術的な前提は何も 置いていないこと • VIRTUAL DOM • ReactはVirtual DOMをDiffの仕組みを用いた超高速な実 装を提供している • DATA FLOW • Reactは一方向のデータフローを実装しているので、ボ イラープレートを少なくすることで従来の開発よりも シンプルになる
  • 20. (ns om-app.stripe (:require-macros [cljs.core.async.macros :refer [go]]) (:require [om.core :as om :include-macros true] [om.dom :as dom :include-macros true] )) (def app-state (atom {:list ["Lion" "Zebra" "Buffalo" "Antelope"]})) ;;; ストライプのための関数を定義します。 (defn stripe [text color] (dom/li #js {:style #js {:backgroundColor color :fontSize 30}} text) ) ;;; 黄色と白のストライプで表示します。 (om/root (fn [app owner] (om/component (apply dom/ul #js {:className "animals"} (map stripe (:list app) (cycle ["#ff0" "#fff"]))))) app-state {:target (. js/document (getElementById "app"))})
  • 21. • Emacs • Clojure-mode、cider、companyの利用 • LightTable(初めての方はおすすめ) • 軽量、カスタマイズ可能なエディタ、Liveモードの利用 • CounterClockWise • Clojure用Eclipseプラグイン、使ったことがない。。。
  • 22. • Clojure/Clojurescriptを用いることで短いコード でかつ性能、スケーラビリティのあるソフト ウェアを開発することができる。 • メンテナンス性も高い • 米国を中心にひそかに広がっている。 • 特にWeb技術(ブラウザ、nodejs)は注目度が高い • 国内ではScalaが圧倒的な人気で実にマイナーであるの は残念 • 極めて多くの種類のライブラリがあり、 Clojure/Clojurescriptで実システムを開発するこ とは何ら問題がない
  • 23. • String • java.lang.String • “abcdefg” • Character • java.lang.Character • A • Number • Java.lang.Long • Java.lang.Double • Java.math.BigDecimal • clojure.lang.ratio • … • 1,110.0,1000M,1/3 • Bool • java.lang.Boolean • true/false • nil • Keyword • Clojure.lang.keyword • :foo • mapのキーになることが多い • Symbol • 関数名、変数名など • List • Clojure.lang.IPersistentList • (1 2 3),((1 2 3),(“a” “b”)) • Vector • Clojure.lang.IPersistentVector • [1 2 3],[[1 2 3] [2 3]] • Map • Clojure.lang.IPersistentMap • {:a 1 :b 2 :c 3} • Set • Clojure.lang.IPersistentSet • #{"a" "b" "c"}
  • 24. • 関数定義 • 変数束縛 • m..nの総和 (def x 1) x ;;=> 1 (defn add [a b](+ a b)) (add 1 2) ;;=> 3 (defn sigma-n [m n] (reduce + (range m (+ 1 n)))) (sigma-n 1 10) ;;=> 55 (defn sigma-fx [fn m n] (reduce + (map fn (range m (+ 1 n))) )) (sigma-fx (fn [x] (* x x) 1 10)) ;;=> 385 • m..nの2乗の総和 • 無名関数fn (def x (fn add [a b](+ a b))) (x 1 2) ;;=> 3 ;; add関数と同じ
  • 25. • let • do • if • Try…catch ・map ・Reduce • reduce • 再帰(階乗) (defn factorial[n] (loop [cnt n acc 1] (if (zero? cnt) acc (recur (dec cnt) (* acc cnt))))) (factorial 10) ;;=> 3628800 (let [x 2 y 3] (* x y)) ;;=> 6 (if (odd? x) true false) (map inc [1 2 3 4 5]) ;;=> (2 3 4 5 6) (map (fn [x] (* x x)) (range 10)) ;;=>(0 1 4 9 16 25 36 49 64 81) (do (println “5 * 10”) (* 5 10)) ;;=> 6 (reduce + [1 2 3 4 5]) ;;=> 15 ;; =(+ (+ (+ (+ 1 2) 3) 4)) (try (dosomething) (catch false)
  • 26. • ネームスペースの宣言 • マクロ (ns my-name-space) (ns chestnut-app.server (:require [clojure.java.io :as io] [compojure.core :refer [GET defroutes]] [compojure.route :refer [resources]] [compojure.handler :refer [api]] [ring.adapter.jetty :refer [run-jetty]])) (defmacro when [test & body] (list 'if test (cons 'do body))) (when (odd? x) (println (str "value " x)) true) (defn my-odd [x] (when (= (rem x 2) 1) (println (str "value " x)) true) ) (my-odd 1) true (ns utils.rule-util (:import java.io.ByteArrayInputStream) (:import java.io.InputStream) )
  • 27. • メソッド呼び出し • インスタンス化 • スレッディングマクロ • Javaクラスの宣言 ;;(.toUpperCase "fred") ;;-> "FRED“ ;;(.instanceMember Classname args*) (.getName String) ;;-> "java.lang.String“ ;;(Classname/staticMethod args*) (System/getProperty "java.vm.version") ;;-> "1.6.0_07-b06-57“ ;;Classname/staticField Math/PI ;;-> 3.141592653589793 (.substring (String. "John McCarthy") 0 4) ;;-> “John” (-> (String. "John McCarthy") (.substring 0 4) (.toUpperCase) ) ;=> “JOHN” (ns com.domain.tiny (:gen-class :name com.domain.tiny :methods [#^{:static true} [binomial [int int] double]]))
  • 28. • 無限シーケンス • take • 遅延シーケンス • ほとんどのシーケンス 関数は遅延シーケンス • lazy-seq (range) ;;=> (0 1 2 3 ... 無限に続く (repeat “a") ;;=> (“a" “a" ... 無限に続く (repeatedly #(rand-int 10)) ;;=> (4 5 8 8 6 2 0 ... 無限に続く (repeat [1 2 3]) ;;=> (1 2 3 1 2 3 ... 無限に続く (iterate inc 0) ;;=> (0 1 2 3 ... 無限に続く (take 10 (repeatedly #(rand-int 100))) ;;=>(73 52 24 63 30 64 87 23 34 32) (defn inc-mul[] (map #(* % %) (iterate inc 0))) (take 10 (inc-mul)) ;;=> (0 1 4 9 16 25 36 49 64 81) (defn lazy-seq-fibo ([] (concat [0 1] (lazy-seq-fibo 0N 1N))) ([a b] (let [n (+ a b)] (lazy-seq (cons n (lazy-seq-fibo b n))))))
  • 29. • STM(Software Transactional Memory) • 並列環境においてデータの整合 性を保持する仕組み • Protocol/Multimethod • オブジェクト指向より柔軟なポ リモフィズムの実現 • core/async • クイックソートの開発者でもあ るTony Hoareの CSP(Communicating Sequential Process)を実現した ライブラリ • Go言語の影響を多大に受けて いる • ブラウザでのイベント処理を簡 素化できる • Transceducers • 現在開発中であるclojure 1.7 の主要機能 • Transceduers(変換器)を用い ることで、関数合成をより柔 軟に行うことができる

×