Java逆アセンブラ制作中

Jadを始めとする逆コンパイラではないので注意. Javaで言えば,逆コンパイラとはclassファイルを分析してその元となったjavaソース(に近いもの)を生成するソフトウェア.完全な逆コンパイラを作るには巧妙なデータフロー解析が必要で *1,そのスキルはまだ私にはない.それに対し逆アセンブラとはclassファイルを分析して内部構造やVMマシン語を人に読める形で出力するもの.こちらはclassファイルの構造さえ知っていれば機械的な作業で作れる(めんどいけど).
Java Virtual Machine Specification 2nd ed.: http://java.sun.com/docs/books/vmspec/index.html

実は,JDKには標準でjavapという逆アセンブラが含まれている.というわけで車輪の再発明なわけだが,単にclassファイルをテキストとして読みたいだけでなく,構造を自由にいじるためのラッピングクラスを含めてモジュール化したいのだ *2

以前Rubyで書いたものをJavaに移植し(何しろJavaのクラスファイルを分析する人なんだからJava処理系が必ずあるだろう)あわよくばAWTか何かでGUI(ツリー表示とか)も付け,さらにはエディタ機能も付けたいと思っている.そうなるとある種のアセンブラだな.いずれJavaのclassファイルを吐くコンパイラを作りたいと思っているんだけど,そのときに役立つツールになるとうれしい.

Ruby版: http://www.komaba.utmc.or.jp/~flatline/show_class.rb
これは別プログラムから利用できるようなモジュール化は一切していないし,それどころか分析した情報を(きれいな表示方法が思い付かなかったので)一部捨ててしまっているが,それでも直に書き換えればRubyistのどなたかには役立つかもしれない.いや駄目かも

*1:Java VMマシン語にはジャンプ命令があるが,プログラミング言語Javaにはそれに対応するgoto構文がない. whileやforはclassファイル内ではみなジャンプ命令になっているが,そこでデータフロー解析を行って適当な範囲を括り出し,whileやforに戻さないといけない.もちろんgotoを持つC言語の逆アセンブラだって,元々whileで書かれていた部分はwhileに直せればその方がよい.

*2:実は^2,手製逆アセンブラも世に溢れている.Googleで検索してみよう.まぁこれは自習課題だからね...