JVM オペコードのリファレンスビューアが便利

vim-ref-jvmis

使い方

" Vundle の場合
" vimrc に追記&再読込して :BundleInstall
Bundle 'ebc-2in2crc/vim-ref-jvmis'

" NeoBundle の場合
" vimrc に追記&再読込して :NeoBundleInstall
NeoBundle 'ebc-2in2crc/vim-ref-jvmis'

Jvmis というコマンドが勝手に定義されるので、調べたいオペコードの上にカーソルを置いて :Jvmis を実行すると ref.vim インタフェースでリファレンスを閲覧出来ます。
リファレンスは The Java Virtual Machine Instruction Set から引いて来るので環境によっては一瞬もたつきますが、デフォルトでキャッシュを有効にしているので2回目以降は素早く引くことが出来ます *1

これでバイトコードリーディングがはかどりますね。

動機

Java を書いていると「このクラス / メソッドは中で何やってるんだろ」みたいなことが良くあります。
そんな時に限ってソースコードが同梱されていなかったりするため *2 javap コマンドで逆アセンブルすることになります。
バイトコードというだけあって覚えなければいけない数は非常に少ないのですが、時々「あれ、このオペコードのスタックどうだっけ」ということがあり、その度にリファレンスを引くのが非常に面倒でした *3

そんな時に TokyoVim#18 に参加することになり、何かテーマを決めなくては…ということでリファレンスを素早く引けるようにしました。

実装

当初、リファレンスビューアのコアに @ さんの vim-ref を使わせてもらい、ソースを自分で作ろうと思っていました。
が、やはり @ さん作の webdict ソースで概ね目的が達成されることが分かったので、取得したデータを見やすくフォーマットするところを作れば良いだけでした。
おかげで大変ラクが出来ました。@ さん、ありがとうございます!

課題

aload_0, aload_1 といったオペコードはリファレンス上は aload_ のように記載されていて、vim-ref-jvmis ではこのあたりの読み替えもしています。
そのためかビューア上でのハイライトが効かず少し寂しいので、いずれ手を入れたいです。
後はドキュメントも書かないといけませんね…

*1:vimrc 等で let g:ref_source_webdict_jvmis_cache = 0 とするとキャッシュしなくなり、毎回ネットからリファレンスを引いてきます。

*2:社内の誰かが書いたものが多い。

*3:良く使われるオペコードは限られていますし、組合せで使われるオペコードのパターンがあるので、覚えなくてはいけないのはごくごくわずかではあるのですが。