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