トップ «前の日記(2008-08-29) 最新 次の日記(2008-08-31)» 編集

Route 477



2008-08-30

[unbabel] LLにLLを埋め込むためのライブラリ、Unbabelについて発表しました

LL FutureのLTで、Unbabelというプロジェクトについて発表させていただきました。

右上のボタンを使うか、j/kでスライド間を移動できます。oとかaとかzを押すと何かが起きます。

Unbabelって何ですか

LLにLLを埋め込むためのフレームワークです。例えば

 require 'unbabel'

 fib = Unbabel::Scheme.new(<<EOD)
 ;; fib :: Int -> Int
 (define (fib x)
   (case x
     ((0) 0)
     ((1) 1)
     (else (+ (fib (- x 2)) (fib (- x 1))))))
 EOD

 p fib[2]  #=> 1
 p fib[3]  #=> 2
 p fib[10] #=> 55

のように、RubyスクリプトからSchemeの関数を呼んだり、PythonからRubyの関数を呼んだり、HaskellからPerlの関数を呼んだりなどできます。 まるで魔法のような話ですが、実際にはfib関数を呼ぶたびにSchemeのインタプリタが走ります。富豪的プログラミング(笑)です。

より詳しい仕様については SPEC.ja を参照してください。

名前はUnlambda へのリスペクトを込めて命名されました。あとバベルの塔のごとくバラバラな言語を 使ってる俺たちも通訳さえいれば話が通じたりするよね、みたいなそういう。

効用・効能

「欲しいライブラリがCPANにはあるんだけど、Rubyにはないんだ」
それUnbabelで (RubyスクリプトにPerlのコードを埋め込みましょう)
「アルゴリズムはHaskellで書きたいんだけど、GUIとか大変そうだし…」
それUnbabelで (GUI部分はRuby等で書いて、Haskellのコードを埋め込みましょう)
「仕事でRuby 1.9が使いたいけど上司が許してくれません」
それUnbabelで (Ruby 1.8にRuby 1.9を埋め込みましょう)
「Ruby 1.9に移行したいけど、1.8のスクリプトの移植が面倒で…」
それUnbabelで (Ruby 1.9にRuby 1.8を埋め込みましょう)
「Schemeはまだまだライブラリの数が少ないよねえ」
それUnbabelで (CPANとrubygemsの全てのライブラリが使い放題です、もうライブラリがないなんて言わせません)
「Rubyにもパターンマッチが欲しいですよね」
それUnbabelで (Haskellを埋め込むとRubyスクリプトなのにパターンマッチが使えます)
「なんでPythonにはswitchがないの!」
それUnbabelで (Javaを埋め込むとPythonスクリプトなのにswitch文が使えます)*1

えっと、あまり本気にしないように…。

インタプリタ起動のオーバーヘッドは確かにあるので埋め込む関数を何百回も呼ぶような使い方には向いてないと思いますが、 そうでなくて、小規模なスクリプトや、大きなデータを一度だけ別言語に渡すような使い方なら意外と実用に耐えるんじゃないかと考えています。 例えばオセロゲームの思考ルーチンだけHaskellで書いて、CPUの番が来るごとにRubyからそれを呼び出すとか。

ダウンロード

ソースコードはCodeReposに置かせてもらいました。

チェックアウトは

svn co http://svn.coderepos.org/share/platform/unbabel/trunk unbabel

でどうぞ。

どうぞご自由に書き換えたり、言語を追加したり、添削したりしてくれると嬉しいですm(__)m

*1 現状、Javaの埋め込みはRuby版しか対応できていませんが、PythonにRubyを埋め込むことはできるので、Java in Ruby in Python という構成にすれば実現可能です。

本日のツッコミ(全2件) [ツッコミを入れる]
otn (2008-09-04 18:02)

スライドの最後のページで、検索ボタンを押すと何かが起こって欲しかった

yhara (2008-09-04 20:13)

ですよね(><)<br>次回からは気をつけます。