Kink の宣伝

1,333 views

Published on

Kink というオレオレ JVM 言語の宣伝。
JJUG CCC 2013 Fall, JVM 言語 BOF での発表資料。

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

No Downloads
Views
Total views
1,333
On SlideShare
0
From Embeds
0
Number of Embeds
65
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Kink の宣伝

  1. 1. Kink の宣伝 宮川 拓 / @miyakawa_taku 2013-11-09 JVM Language BOF / JJUG CCC Fall
  2. 2. 1 自己紹介 • 宮川 拓 / @miyakawa_taku • Kink を作ってる人です
  3. 3. 2 Kink の概要 • クラスのないオブジェクト指向。プロトタイプ ベース – 型とかあるわけがない • 言語仕様におけるミニマリズム – なんでも関数呼び出し。代入も関数呼び出し • 末尾呼び出しの最適化 – 再帰でループが書ける • 簡潔、デンジャラス
  4. 4. 3 プロトタイプベース
  5. 5. 4 クラスなしで値を作る # bark 変数と howl 変数を持つ値を作って # Dog 変数にぶっこむ :Dog = value( 'bark' { 'わん' } 'howl' { 'わおーん' } ) # bark, howl 関数を呼び出す print_line(Dog.bark) # => わん print_line(Dog.howl) # => わおーん
  6. 6. 5 「親」から変数を継承する # Dog の変種を作る :Puppy_dog = Dog.child Puppy_dog.:bark = { 'きゃん' } # bark, howl 関数を呼び出す print_line(Puppy_dog.bark) # => きゃん print_line(Puppy_dog.howl) # => わおーん
  7. 7. 6 なんでも関数呼び出し
  8. 8. 7 代入も関数呼び出し :Line = 'example.org:8080' 変数への代入は 変数参照オブジェクトに対する関数呼び出し :Line.op_set('example.org:8080') つまり、「左辺値」を特別扱いしない
  9. 9. 8 多重代入も関数呼び出し [:Host_name :Port_number] = Line / ':' 多重代入は「変数参照を要素に持つリスト」に対する 関数呼び出し [:Host_name :Port_number].op_set(Line / ':')
  10. 10. 9 末尾呼び出しの最適化 Demo
  11. 11. 10 Kink の素敵なところ 単純な仕掛けの組み合わせで高次の機能を 実現するところ
  12. 12. 11 例: トレイト # Kink のトレイトは単に [名前 関数 名前 関数 ...] のリスト :Bark_twice_trait = [ 'bark_twice' { > :Self Self.bark + Self.bark } ] # リストを展開して set_vars 関数に渡す Dog.set_vars(*** Bark_twice_trait) # トレイトによって導入された bark_twice 関数を呼び出す print_line(Dog.bark_twice) # => わんわん
  13. 13. 12 例: トレイト • 専用の言語要素を導入することなく、できあい の仕掛けを用いてトレイトを実現している
  14. 14. 13 リンク • リポジトリ – https://bitbucket.org/kink/kink • マニュアル – http://doc.kink-lang.org/kink/manual-ja/
  15. 15. 14 個別の議論
  16. 16. 15 Java との組み合わせ
  17. 17. 16 Java との組み合わせ ○ Kink → Java △ Java → Kink • Java のクラスファイルにコンパイルすることはできな い(多分できてもあまり嬉しくない) • 実行時に Java クラスを作ってインスタンス化するこ とはできる
  18. 18. 17 Kink → Java (一部 Java → Kink) use('java.lang.Thread') use('java.util.concurrent.Executors') :Thread_pool = Executors.newSingleThreadExecutor # Runnable の動的プロキシを作って submit に渡す Thread_pool.submit { { true } .loop { print_line('Tick!') Thread.sleep(1000) } }
  19. 19. 18 Kink / Java のオブジェクトグラフ Kink のオブジェクト 関数群 Java のオブジェクト ThreadPoolExecutor の共有プロトタイプ parent Thread_pool ThreadPoolExecutor の Java インスタンス backed-by • ひとつの Java クラスのインスタンスを後ろに持つ Kink の値は ひとつのプロトタイプを共有する • 共有プロトタイプが機能を提供する
  20. 20. 19 処理系の実装
  21. 21. 20 抽象構文木のインタプリタ プログラム 抽象構文木 :Puppy_dog = Dog.child Puppy_dog.:bark = { 'きゃん' } 関数呼び出し print_line print_line(Puppy_dog.bark) print_line(Puppy_dog.howl) ローカル 環境 引数リスト 関数呼び出し bark … • プログラムを抽象構文木に変換して、これをグルグル回す • バイトコードへの変換はしない(今のところ)
  22. 22. 21 末尾呼び出し最適化の実装 Invoker foo 関数 bar 関数 呼び出し先 = bar 呼び出し先 = foo • いったん処理系に戻して、スタックが深くならないようにする • JVM は末尾呼び出しをサポートしていないので、自前で実装 • MLVM#TailCalls に期待していいのか?
  23. 23. 22 Invokedynamic • まだ使っていない • 変数参照の高速化のために使うかも(たぶん 来年以降)
  24. 24. 23 デバッグ・解析機能 REPL (対話シェル) はあります!
  25. 25. 24 事例 これから!

×