Kink:
プロトタイプベースの俺々 JVM 言語
@miyakawa_taku
2012-04-04
Java One Tokyo / JVM Language BOF
1



要旨
• Kink という JVM 言語を作ってます
• クラスのないオブジェクト指向言語です
  (Lua や JavaScript みたいに)
• 寝ながら安易にコードが書けることを目指し
  ています
2



No クラス but 値
• クラスはなくて値だけがある
• データやメソッドは値のスロットに直接突っ込む


&DOG = value                DOG
DOG.&bark = { 'ワン!' }
                            &bark { 'ワン!' }
DOG.&howl = { 'ワオー' }
                            &howl { 'ワオー' }

printline(DOG.bark) # ワン!
3



親のスロットを継承
• 自分自身がスロットを持っていなければ親か
  ら取ってくる
                               DOG (親)
&PUPPY = DOG.child             &bark { 'ワン!' }
PUPPY.&bark = { 'キャン!' }       &howl { 'ワオー' }

printline(PUPPY.bark) # キャン!
printline(PUPPY.howl) # ワオー    PUPPY (子)
                               &bark     { 'キャン!' }
4



Java 呼び出し
• Java のメソッドも呼び出せる
• オブジェクトシステムが全然違うので、
  methodmissing からリフレクションで富豪的に
    useclass('java.util.ArrayList')
    &AL = ArrayList.new

    AL.add('Flip!')
    AL.add('Flap!')

    AL.list.loop($printline) # Flip! Flap!
5



Kink の特徴
• ミニマリズム!
  – クラスの無いオブジェクトシステム
  – 分岐もパターンマッチも代入もメソッド呼び出し
• Lisp 好き!
  – セミコロンとカンマの無い文法
  – 末尾再帰がスタックオーバーフローしない
• Java のメソッドが叩けるよ!
• なにかと富豪的。性能は……
6



性能は?
• tarai(13 6 0) (竹内関数) でベンチマーク
   #!/usr/bin/env kink -J-server
   &tarai = { (&X &Y &Z)
     (X <= Y).then {
        Y
     }{
        tarai(tarai(X - 1 Y Z) tarai(Y - 1 Z X) tarai(Z - 1 X Y))
     }
   }
   [&X &Y &Z] = _argv.map { ¥0.int }
   printline(tarai(X Y Z))
7



計測結果 (dash の8倍速い!)

   dash 0.5.5.1


GNU bc 1.06.95


Kink 2012-03-31
                                         dash = /bin/sh
   C Ruby 1.8.7


 GNU awk 3.1.7

                  0   100   200   300   400   500   600   700   800
8



計測結果 (JVM 言語)

Kink 2012-03-31



   Rhino 1.7R3



   Groovy 1.7.0



    JRuby 1.6.6


                  0   10   20   30   40   50   60   70   80   90
9



総括
• Kink は半分寝ながらコードが書ける気楽な言
  語です
• 性能はまだまだです
 – もうちょっと何とか絞り出せるはず
• 公開リポジトリ
 – http://code.google.com/p/kink-lang/

Kink: プロトタイプベースの俺々 JVM 言語

  • 1.
  • 2.
    1 要旨 • Kink というJVM 言語を作ってます • クラスのないオブジェクト指向言語です (Lua や JavaScript みたいに) • 寝ながら安易にコードが書けることを目指し ています
  • 3.
    2 No クラス but値 • クラスはなくて値だけがある • データやメソッドは値のスロットに直接突っ込む &DOG = value DOG DOG.&bark = { 'ワン!' } &bark { 'ワン!' } DOG.&howl = { 'ワオー' } &howl { 'ワオー' } printline(DOG.bark) # ワン!
  • 4.
    3 親のスロットを継承 • 自分自身がスロットを持っていなければ親か ら取ってくる DOG (親) &PUPPY = DOG.child &bark { 'ワン!' } PUPPY.&bark = { 'キャン!' } &howl { 'ワオー' } printline(PUPPY.bark) # キャン! printline(PUPPY.howl) # ワオー PUPPY (子) &bark { 'キャン!' }
  • 5.
    4 Java 呼び出し • Javaのメソッドも呼び出せる • オブジェクトシステムが全然違うので、 methodmissing からリフレクションで富豪的に useclass('java.util.ArrayList') &AL = ArrayList.new AL.add('Flip!') AL.add('Flap!') AL.list.loop($printline) # Flip! Flap!
  • 6.
    5 Kink の特徴 • ミニマリズム! – クラスの無いオブジェクトシステム – 分岐もパターンマッチも代入もメソッド呼び出し • Lisp 好き! – セミコロンとカンマの無い文法 – 末尾再帰がスタックオーバーフローしない • Java のメソッドが叩けるよ! • なにかと富豪的。性能は……
  • 7.
    6 性能は? • tarai(13 60) (竹内関数) でベンチマーク #!/usr/bin/env kink -J-server &tarai = { (&X &Y &Z) (X <= Y).then { Y }{ tarai(tarai(X - 1 Y Z) tarai(Y - 1 Z X) tarai(Z - 1 X Y)) } } [&X &Y &Z] = _argv.map { ¥0.int } printline(tarai(X Y Z))
  • 8.
    7 計測結果 (dash の8倍速い!) dash 0.5.5.1 GNU bc 1.06.95 Kink 2012-03-31 dash = /bin/sh C Ruby 1.8.7 GNU awk 3.1.7 0 100 200 300 400 500 600 700 800
  • 9.
    8 計測結果 (JVM 言語) Kink2012-03-31 Rhino 1.7R3 Groovy 1.7.0 JRuby 1.6.6 0 10 20 30 40 50 60 70 80 90
  • 10.
    9 総括 • Kink は半分寝ながらコードが書ける気楽な言 語です • 性能はまだまだです – もうちょっと何とか絞り出せるはず • 公開リポジトリ – http://code.google.com/p/kink-lang/