Rubyにおけるコード補完の考察
実験的ではあるにせよ、現状ではRubyのコード補完はid:rubikitchさんのrcodetoolsでなんとか対応できています。が、次のような(大きな)問題をかかえています。ちなみにここでいうrcodetoolsの問題というのは補完機能のことで、xmpfilterとかは全然関係ないことを留意してください。
rcodetoolsの問題点
rcodetoolsは、補完を得るために裏で編集中のRubyコードを実行するようです。実際にRubyコードを実行するので、補完ポイントに処理が到達できる場合は補完精度は100%になります。しかしこの方法には二つの問題があります。
一つは、補完ポイントに処理が到達できない場合は補完精度が0%に等しくなるという問題です。もう一つの問題はRubyコードの実行に時間がかかる場合に、それと同等の時間をEmacsが待つことになるという問題です。後者の問題は特に深刻で、例えば次のコードでコメントのある位置で補完を実行するとEmacsが固まってしまいます。
def foo loop do end end foo.#<-ここで補完
VimのRubyコード補完機能もrcodetoolsと同じようなことをやっているのですが、こちらはタイムアウトをしかけているのか、固まるということはありません。補完精度はとんとんですが…
まあ仮に固まらないといても、requireなどのオーバーヘッドが補完毎にかかるようじゃちょっとしんどいです。
Typing Ruby
そういうわけで、Rubyコードを実際に実行せずにうまく補完できる方法がないか考えてみたところ、型推論をかなりがんばればなんとかなるんじゃないかという結論に至りました。
で、調べたところ、日本の学生(?)が静的チェックでプログラムの問題を診断する研究で型推論をがんばってることがわかりました。
http://truby.sourceforge.jp/index.j.html
しかしちゃんとした成果物に到達できないのと、まだ実用は無理なんスという雰囲気が漂っていたので、他のプロジェクトを探すことに。
Ruby Development Toolkit
するとこんどはGoogle Summer of Codeに採用されたプロジェクトが見つかりました。
こちらは(本当のところはわかりませんが)、静的チェックとかVMの最適化というよりはIDEのコード補完に使うのを目的に実装されたものみたいです。実際、AptanaというIDEにマージされています。
このIDEのコード補完は結構すごいです。例えば次のような関数定義があるとします。
def foo(n) n.#<-ここで補完 end
他にコードが何もない状態で、これを実行するとKernelのメソッド一覧しかでないのですが、この関数定義の下などに、
if false foo(1) foo("bar") end
と書いておくと、補完にはFixnumとStringのメソッドも一覧されるようになります。この挙動はあきらかに型推論です。
型推論による補完のよい点は実際に実行しなくてもよい点と、ほぼ一定の時間で補完が出せることでしょう。
ちなみにこのコード補完機能はRDT(Ruby Development Tools)として提供されています。