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

40
Immutable Immutable時代のプログラミング言語 時代のプログラミング言語 Clojure Clojure kawasima 渋谷JVM(言語)

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

ImmutableImmutable時代のプログラミング言語時代のプログラミング言語

ClojureClojure

kawasima

渋谷JVM(言語)

特長

● Lisp

● 関数型プログラミングのためのもの

● 確固たるプラットフォームと共生するJVM, .NET, Javascript上でそれらの型,GC,例外機構を利用しながら動作する

● Concurrencyのためにデザインされた

http://clojure.org/rationale

Lispの話は特にしません

Conceptualなところがおもしろい

https://github.com/matthiasn/talk-transcripts

その中から特徴的なものをご紹介しますその中から特徴的なものをご紹介します

Simple made easy

Clojureにおける(というよりRich Hickeyの?)

シンプルさ、の考え方

http://www.infoq.com/presentations/Simple-Made-Easy

Simple

● ひとつの役割

● ひとつのタスク

● ひとつの概念

● ひとつの次元

ひとつといっても、これはシンプルじゃない● ひとつのインスタンス● ひとつの操作

対義語: Complex

Easy

● 必要なことがすぐに実現できること

● IDE● Apt-get, gem install

● 馴染みがあること

対義語: Hard

複雑 シンプル

状態、オブジェクト状態、オブジェクト 値値メソッドメソッド 関数、ネームスペース関数、ネームスペースvarvar Managed refsManaged refs継承、マッチング継承、マッチング ポリモーフィズムポリモーフィズム文法文法 データデータ命令的なループ命令的なループ 集合関数集合関数アクターアクター キューキューORMORM 宣言的なデータ操作宣言的なデータ操作条件条件 ルールルール

Complex or Simple

複雑 構成物

状態 触るものみな複雑

オブジェクト 状態、アイデンティティ、値

メソッド 関数、状態、ネームスペース

文法 意味と順序

命令的なループ 集合関数

アクター What / Who条件 複数のルール

複雑さのもとは組み合わせ

シンプルなもの 実現方法値 Final,永続的なコレクション関数 ステートレスなメソッドネームスーペース 言語のサポートデータ Maps,Arrays,SetsやJSON,XMLポリモーフィズム プロトコル、型クラスManaged refs ClojureやHaskellのrefsルール ライブラリ、Prolog

シンプルさのツールボックス

10のデータ構造それぞれに10の関数操作があるよりも、1つのデータ構造に100の関数操作がある方がよい

Alan J. Perils

http://www.cs.yale.edu/homes/perlis-alan/quotes.html

Abstraction

seq function

http://clojure.org/sequences

seq

http://www.slideshare.net/alexmiller/clojure-the-art-of-abstraction-7161663/40

● String

● Java collection

● Java iterator

● ResultSet

● XML

● ファイルの行

Concurrency

Clojureを使いたくなる本をご紹介しておきます。

https://pragprog.com/book/pb7con/seven-concurrency-models-in-seven-weeks

Immutableすべてがイミュータブル

user => (def a {:name "kawasima":age 39})#'user/auser => (def b (assoc a :age 40))#'user/buser => a{:name "kawasima" :age 39}

つまりコレクションに対する破壊的操作はできない

http://gotocon.com/dl/goto-cph-2012/slides/value-of-values.pdf

Sharing structure

http://hypirion.com/musings/understanding-persistent-vector-pt-1

コレクションに対して変更操作すると、新しいコレクションが返るが、変更のないデータは共有される。

※実際は7階層の32bitキーモデル

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

×

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

Identity/State/Value

http://clojure.org/state

不変的で永続的なデータ構造

不変的に同一実体をさすもの

ある時点でのIdentityと結びついたValueの集合

Identity

State

Value

STM複数のrefsを一貫性をもって更新したい

http://www.atmarkit.co.jp/news/201008/11/lltiger.html

※ kawasimaはSTMあまり使わないので、@makingのスライドを拝借します。

core.async

イミュータビリティを基礎として作られた、CSP(Communicating Sequential Process)のライブラリ

http://github.com/clojure/core.async

go

CSP

channel

https://www.youtube.com/watch?v=msv8Fvtd6YQ

go

thread thread

>! <!

>!! <!!

core.async

thread-based

BlockedBlocked

一つの処理は一つのスレッドで。チャネルの入出力でブロックされる。並列性があがると多くのスレッドを要求する。

スレッドプールからスレッドをとりだしthreadマクロに渡されたコードを実行する。channelからの呼び出し <!! のところでブロックする(future#getの状態)

core.async

thread-baseduser => (def ch (chan))#'user/chuser => (thread (println (<!! ch)))user => (>!! ch "hello")hello!nil

Javaでよくある並行処理と同じですね

core.async

coroutine-based

ブロック地点でpark状態にし、スレッドをプールに戻す。メリット: 少ないスレッドで並行処理ができる

core.async

coroutine-baseduser => (def ch (chan))#'user/chuser => (go (println (<! ch))) ;; (A)user => (go (>! ch "hello!"))hello!

goマクロによって、(A)の部分は、1. channelから値取り出す2. 1の値をprintlnに書き出すという2つのコードブロックに分割される。

core.async on ClojureScript

core.asyncはClojureScriptでも、Clojureと全く同じように動く。

ただ、Javascriptはシングルスレッドモデルなので、goのみ対応。

core.async のイケてるところ

これらが言語仕様に手を入れることなく、マクロだけで実装されていること。

go配下の構文を解析しブロック呼び出しの箇所で分割しそれぞれをステートとしたステートマシーンを構築しブロック中のスレッド使用効率をあげる

マクロすげぇマクロすげぇ世の中世の中LispLispで支配するのだ!で支配するのだ!

LispLispは宇宙だは宇宙だ

((。∀ ゜。∀ ゜))

Clojureをはじめてみよう!

すみません…取り乱しました…http://practical-scheme.net/trans/icadmore-j.html

Get started

Clojure Java依存性 leiningen MavenIDE Lighttable

Emacs + ciderIntellij IDEANetBeans

LightTable: http://www.lighttable.comleiningen: http://leiningen.org/

Self-study

http://www.4clojure.com

Ring

tomcat

Rack

thin puma

Compojure Sinatra

hiccup enlive

jetty

Web developmentRubyと同じようなアーキテクチャスタック

Haml Erb

ClojurescriptGoogle Closure Compilerを使ってJavascriptに変換される。

すでに実用段階● Circle CI● MailOnline● eBay

Grunt/Gulp layer

leiningenに統合されている● Aggregate/Minify -> lein cljsbuild auto

● ライブリロード -> lein figwheel

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

ReactReactも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

Excel development

http://github.com/kawasima/axebomber-clj

HTMLライクな記述でExcel方眼紙が出力できる!

Evidence development

clj-webdriverでブラウザ操作中(自動/手動対応)にスクリーンショットを取得し、Excel方眼紙のマス目ぴったりに貼り付けるソリューション

http://qiita.com/kawasima/items/41048cf3b998df4de37d

Job development

http://github.com/kawasima/job-streamer

あなたと!

Clojure!今すぐ!

イミュータブル!