Java逆アセンブラ制作中

メソッド/フィールドディスクリプタを分析する機能をRuby版から移植した.面倒くさがって [:array "int"] とか使ってたせいで,(中途半端に)型にうるさいJavaに直すのにえらく苦労した.それに再帰関数の返り値で多値(というか多重代入)を使ってたせいもあり,さらに悩む.前者の問題は型ツリーを表すクラス群をきちんと定義して回避したが,後者については結局 Object[] tuple = argumentType(descriptorSuffix, accumlator); などと酷いことをしてしまった.せめてもの償いとしてメソッド定義に Object[]/*(String, Type)*/ argumentType(String descriptorSuffix, Type accumlator) { ... などと書いてみた.
Classファイルに対応するクラスClassFileをしだいに緻密なものにしていくと共に,サンプルドライバである自作javapもその内部情報を生かすように書き換えてゆく.とは言っても,全部ダラダラと表示してもしょうがないので情報の取捨選択をしないとよいツールとは言えないだろう.ここはいっそGUI版に取りかかってしまえばいいんだろうか? ツリーインタフェイスなんかを使えばユーザは自分で取捨選択ができるようになり,ぐっと便利になる(.NET SDKのMS-IL用逆アセンブラildasmはそういうGUIも備えている.) でもそれは手間取りそうなんで,とりあえず今はありったけの情報を垂れ流すもので我慢する.
Classファイル内部では定数テーブルがあり,そこに色んな情報が並んでいる.そのエントリの一種,「クラスの名前」を表すUTF-8文字列の分析に問題が出た.例えばjava.lang.Stringを表す定数テーブルのエントリは "java/lang/String" というUTF-8文字列エントリへのリンクを持っている.クラスの完全限定名でドットがスラッシュになっただけだ.しかし! java.lang.String[]を表すエントリがリンクしている文字列は, "[Ljava/lang/String;" すなわちディスクリプタ形式なのだ.何なんだこの非統一は? Java VMの仕様書を読んでもここがはっきりしない.とりあえずアドホックに,最初の1文字目を見て'['だったらディスクリプタ分析ルーチン(↑のもの)に渡すことにしたが,いっぺん既存の逆アセンブラや逆コンパイラがどうしてるかソースを読むべきかもしれない.誤解してるのかな?