Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

渋谷JVM#1 Immutable時代のプログラミング言語 Clojure

7,914 views

Published on

Clojure

Published in: Software
  • Be the first to comment

渋谷JVM#1 Immutable時代のプログラミング言語 Clojure

  1. 1. ImmutableImmutable時代のプログラミング言語時代のプログラミング言語 ClojureClojure kawasima 渋谷JVM(言語)
  2. 2. 特長 ● Lisp ● 関数型プログラミングのためのもの ● 確固たるプラットフォームと共生する JVM, .NET, Javascript上でそれらの型,GC,例外機構を利用し ながら動作する ● Concurrencyのためにデザインされた http://clojure.org/rationale
  3. 3. Lispの話は特にしません
  4. 4. Conceptualなところが おもしろい https://github.com/matthiasn/talk-transcripts その中から特徴的なものをご紹介しますその中から特徴的なものをご紹介します
  5. 5. Simple made easy Clojureにおける (というよりRich Hickeyの?) シンプルさ、の考え方 http://www.infoq.com/presentations/Simple-Made-Easy
  6. 6. Simple ● ひとつの役割 ● ひとつのタスク ● ひとつの概念 ● ひとつの次元 ひとつといっても、 これはシンプルじゃない ● ひとつのインスタンス ● ひとつの操作 対義語: Complex
  7. 7. Easy ● 必要なことがすぐに実現できること ● IDE ● Apt-get, gem install ● 馴染みがあること 対義語: Hard
  8. 8. 複雑 シンプル 状態、オブジェクト状態、オブジェクト 値値 メソッドメソッド 関数、ネームスペース関数、ネームスペース varvar Managed refsManaged refs 継承、マッチング継承、マッチング ポリモーフィズムポリモーフィズム 文法文法 データデータ 命令的なループ命令的なループ 集合関数集合関数 アクターアクター キューキュー ORMORM 宣言的なデータ操作宣言的なデータ操作 条件条件 ルールルール Complex or Simple
  9. 9. 複雑 構成物 状態 触るものみな複雑 オブジェクト 状態、アイデンティティ、値 メソッド 関数、状態、ネームスペース 文法 意味と順序 命令的なループ 集合関数 アクター What / Who 条件 複数のルール 複雑さのもとは組み合わせ
  10. 10. シンプルなもの 実現方法 値 Final,永続的なコレクション 関数 ステートレスなメソッド ネームスーペース 言語のサポート データ Maps,Arrays,SetsやJSON,XML ポリモーフィズム プロトコル、型クラス Managed refs ClojureやHaskellのrefs ルール ライブラリ、Prolog シンプルさのツールボックス
  11. 11. 10のデータ構造それぞれに 10の関数操作があるよりも、 1つのデータ構造に 100の関数操作がある方がよい Alan J. Perils http://www.cs.yale.edu/homes/perlis-alan/quotes.html Abstraction
  12. 12. seq function http://clojure.org/sequences
  13. 13. seq http://www.slideshare.net/alexmiller/clojure-the-art-of-abstraction-7161663/40 ● String ● Java collection ● Java iterator ● ResultSet ● XML ● ファイルの行
  14. 14. Concurrency Clojureを使いたくなる本を ご紹介しておきます。 https://pragprog.com/book/pb7con/seven-concurrency-models-in-seven-weeks
  15. 15. Immutable すべてがイミュータブル user => (def a {:name "kawasima":age 39}) #'user/a user => (def b (assoc a :age 40)) #'user/b user => a {:name "kawasima" :age 39} つまりコレクションに対する破壊的操作はできない http://gotocon.com/dl/goto-cph-2012/slides/value-of-values.pdf
  16. 16. Sharing structure http://hypirion.com/musings/understanding-persistent-vector-pt-1 コレクションに対して変 更操作すると、新しい コレクションが返るが、 変更のないデータは共 有される。 ※実際は7階層の32bitキーモデル
  17. 17. Managed refs それでは実用的に使いにくいので、refsの仕組みがある。 :name "kawasima" :age 40 person person Immutableなコレクションが新たに作られ、参照先が切り替わる (def person (atom {:name "kawasima":age 39})) (swap! person update-in [:age] inc) @person :name "kawasima" :age 39 ×
  18. 18. Epochal time model person person :age 39 :name "kawasima" function このモデルは、Append-onlyデータベースのDatomicでも採用されています。 http://www.datomic.com/ Identity Pure functions :age 40 :name "kawasima" 加齢 Values state state
  19. 19. Identity/State/Value http://clojure.org/state 不変的で永続的なデータ構造 不変的に同一実体をさすもの ある時点でのIdentityと結びついた Valueの集合 Identity State Value
  20. 20. STM 複数のrefsを一貫性をもって更新したい http://www.atmarkit.co.jp/news/201008/11/lltiger.html ※ kawasimaはSTMあまり使わないので、@makingのスライドを拝借します。
  21. 21. core.async イミュータビリティを基礎として作られた、 CSP(Communicating Sequential Process)のライブラリ http://github.com/clojure/core.async
  22. 22. go CSP channel https://www.youtube.com/watch?v=msv8Fvtd6YQ go thread thread >! <! >!! <!!
  23. 23. core.async thread-based BlockedBlocked 一つの処理は一つのスレッドで。 チャネルの入出力でブロックされる。 並列性があがると多くのスレッドを要求する。
  24. 24. スレッドプールからスレッドをとりだし threadマクロに渡されたコードを実行する。 channelからの呼び出し <!! のところでブロックする (future#getの状態) core.async thread-based user => (def ch (chan)) #'user/ch user => (thread (println (<!! ch))) user => (>!! ch "hello") hello! nil Javaでよくある並行処理と同じですね
  25. 25. core.async coroutine-based ブロック地点でpark状態にし、スレッドをプールに戻す。 メリット: 少ないスレッドで並行処理ができる
  26. 26. core.async coroutine-based user => (def ch (chan)) #'user/ch user => (go (println (<! ch))) ;; (A) user => (go (>! ch "hello!")) hello! goマクロによって、(A)の部分は、 1. channelから値取り出す 2. 1の値をprintlnに書き出す という2つのコードブロックに分割される。
  27. 27. core.async on ClojureScript core.asyncはClojureScriptでも、Clojureと全く同 じように動く。 ただ、Javascriptはシングルスレッドモデルなの で、goのみ対応。
  28. 28. core.async のイケてるところ これらが言語仕様に手を入れることなく、 マクロだけで実装されていること。 go配下の構文を解析し ブロック呼び出しの箇所で分割し それぞれをステートとしたステートマシーンを構築し ブロック中のスレッド使用効率をあげる
  29. 29. マクロすげぇマクロすげぇ 世の中世の中LispLispで支配するのだ!で支配するのだ! LispLispは宇宙だは宇宙だ ((。∀ ゜。∀ ゜))
  30. 30. Clojureをはじめてみよう! すみません…取り乱しました… http://practical-scheme.net/trans/icadmore-j.html
  31. 31. Get started Clojure Java 依存性 leiningen Maven IDE Lighttable Emacs + cider Intellij IDEA NetBeans LightTable: http://www.lighttable.com leiningen: http://leiningen.org/
  32. 32. Self-study http://www.4clojure.com
  33. 33. Ring tomcat Rack thin puma Compojure Sinatra hiccup enlive jetty Web development Rubyと同じようなアーキテクチャスタック Haml Erb
  34. 34. Clojurescript Google Closure Compilerを使ってJavascriptに 変換される。 すでに実用段階 ● Circle CI ● MailOnline ● eBay
  35. 35. Grunt/Gulp layer leiningenに統合されている ● Aggregate/Minify -> lein cljsbuild auto ● ライブリロード -> lein figwheel https://github.com/bhauman/lein-figwheel
  36. 36. React ReactもClojurescriptから自在に扱える。(JSX不要) (defn container-view [{:keys [container non-parallel-actions]} owner {:keys [uses- parallelism?] :as opts}] (reify om/IRender (render [_] (let [container-id (container-model/id container) actions (remove :filler-action (map (fn [action] (get non-parallel-actions (:step action) action)) (:actions container)))] (html [:div.container-view {:style {:left (str (* 100 (:index container)) "%")} :id (str "container_" (:index container))} (om/build-all action actions {:key :step :opts opts})]))))) https://github.com/omcljs/om
  37. 37. Excel development http://github.com/kawasima/axebomber-clj HTMLライクな記述でExcel方眼紙が出力できる!
  38. 38. Evidence development clj-webdriverでブラウザ操作中(自動/手動対応) にスクリーンショットを取得し、Excel方眼紙のマス 目ぴったりに貼り付けるソリューション http://qiita.com/kawasima/items/41048cf3b998df4de37d
  39. 39. Job development http://github.com/kawasima/job-streamer
  40. 40. あなたと! Clojure! 今すぐ! イミュータブル!

×