JasminSourceForgeのJasmin2.4のバージョンとSootプロジェクトのJasmin2.4のバージョン(sable.mcgill.caにあり、「jasminclasses」というラベルが付いています)の両方がありますが、Sootバージョン(必要なもの)はそうではないようです。正しく動作しています。
最初にJasminJVMアセンブリにコンパイルし、次にJasminを使用してJVMクラスファイルにアセンブルする単純なコンパイラを作成しました。以前は、JasminのSourceForgeサイトにある通常バージョンのJasminを使用していましたが、うまく機能していました。すべてが正しくコンパイルされ、実行されました。これで、Sootフレームワークを使用して最適化を開始しました。最適化されたコードをクラスファイルに変換し直そうとしない限り、すべてがうまく機能します。
現在Sootを使用しているので、Sootが使用するJasminOutputStreamをサポートするSootバージョンのJasminを使用する必要があります。SootのバージョンのJasminは、入力ストリームを取得する代わりに「.j」ファイルを読み取る「昔ながらの」方法でJasminファイルの処理を処理できるはずのように見えますが、(最初のアセンブルのために)最適化前)、Sootバージョンは失敗します。
私が行った場合
java -cp jasmin.jar jasmin.Main MyClass.j
期待どおりに「Generated:MyClass.class」という出力が得られます。
もしそうなら(jasminclassesはJasminのSootバージョンです)
java -cp jasminclasses-2.4.0.jar jasmin.Main MyClass.j
出力を取得します
MyClass.j:5: Warning - Syntax error.
.field public n
^
MyClass.j:5: Error - Couldn't repair and continue parse.
.field public n
^
MyClass.j: Found 2 errors`
5行目は.fieldpublicn Iについては何も間違っていません。上に示したように、通常のバージョンのJasminで正常にコンパイルされます。
完全を期すために、その点に関するコードをさらにいくつか示します。
.source MyClass.j
.class public MyClass
.super AnotherClass
.field public n I
.method public <init>()V
aload_0
invokenonvirtual AnotherClass/<init>()V
return
.end method
そこにあるものはすべてうまく、通常のジャスミンでうまく組み立てられます。
JasminのSootバージョンが異なる構文を期待しているかどうか誰かが知っていますか?スートとジャスミンに関するほとんどのものと同様に、そもそもWebにはほとんど何もありません。ましてや、私が探しているものはあまりないので、私のグーグルはあまり思いつきません。
よろしくお願いします。ここで本当にイライラしています。次のステップは、SootのJasminパッケージをデバッグし、そこで何が行われているのか、なぜ失敗するのかを確認することですが、これだけのために今のところそれほど遠くまで行く必要はないことを願っています。