Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Prochain SlideShare
Matrix Multiplication in Strassen Algorithm
Suivant
Télécharger pour lire hors ligne et voir en mode plein écran

2

Partager

Télécharger pour lire hors ligne

Kink の宣伝

Télécharger pour lire hors ligne

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

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 事例 これから!
  • TakeshiWatanabe2

    Nov. 25, 2013
  • bitter_fox

    Nov. 16, 2013

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

Vues

Nombre de vues

2 512

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

65

Actions

Téléchargements

5

Partages

0

Commentaires

0

Mentions J'aime

2

×