2009-03-27 12 views
18

私のコンパイラクラスは、Javaバイトコードにコンパイルする予定の言語を作成しています。我々は多くの進歩を遂げ、コード生成の時間が近づいています。Javaバイトコードにコンパイル(Javaを使用せず)

私たちのコンパイラから.classファイルを作成する方法に関する情報を見つけることに問題があります。何か助けてくれる資源がありますか?私たちはすでに命令セットに関する多くの文書を持っていますが、クラスファイルの直接記入方法や16進法の記述に関する情報が必要です。

.classファイルの逆コンパイルに関する情報や提案は必要ありません。

.classファイルをゼロから書き出すという単純な例でも優れています。

JVMの仕様は私たちの後ではありません。私たちが本当に必要とするのは、例またはウォークスルーです。

+0

私はちょうどクラスファイルパーサーを書いた...あなたはバイトコードを放出するために必要な情報を具体的にそれはあなたが第4章に欠けて見つけることは何第4章に含まれていますか? – TofuBeer

+0

チュートリアルや例を教えてください。 – Allyn

+0

私の更新を見てくださいが、私はあなたが理解していないクラスファイルを放出する部分についてより具体的にする必要があると思います。 – TofuBeer

答えて

8

VM仕様:The Class File FormatおよびThe Java Virtual Machine Instruction Setが必要です。

バイトコードエンジニアリングライブラリ(BCEL)をご覧ください。また、Findbugs(これはクラスファイルを読んで理解する必要があります)と同じです。

+2

私はBCELよりもむしろASMをお勧めしたいと思います。 –

+0

はどちらも使用していませんが、特定の問題が発生しない限り、クラスファイルがどのように書かれているかを見るための参考にしてください(私はまだ第4章と第6章が必要です)。 – TofuBeer

2

おそらくchapter 4 - the class file formatのように、JVM specificationがお探しのものです。

+2

誰かがこの答えを出し、太字の句にもかかわらずJVMの仕様を推奨することに否定的な投票をしますが、Jonは3つの票を得ます。彼は正しいですが、私はジョンの蓄積された狂った信じることなく誰かが侮辱されることを賭けるでしょう。あなたに小道具、ジョン。 – duffymo

+1

と言うのは難しいですが、Jonの回答と編集の両方が "1時間前に"発生しましたが、JVM仕様を望ましくないという太字の行が編集されているため、Jonの答えは編集前に発生していました。 – shsteimer

+0

Jonと私はVM仕様を提案します。投票が終了し、編集、編集、投票が停止しました。いずれにせよ、編集とダウン投票はほぼ同じ時期に起こった。 – TofuBeer

9

クラスファイルを自分で記述することなく、Javaクラスファイルを作成するための高度なインタフェースを提供するプロジェクトがいくつかあります。以下を見てみましょう:

すべてのクラスファイルを作成するためのAPIを提供しています。あなたは、これを行うために書いたコードを常に見て、あなたのコンパイラに似たコードを書くことができますが、それはかなりの量の作業だと思います。 BCELで

あなたが望む形式、単純な例では、クラスファイルを書き出すためにあなたを有効にする必要がありClassGenを見て、取るには、次のとおりです。

ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", 
          "<generated>", ACC_PUBLIC | ACC_SUPER, 
          null); 
6

私はあなたを失望させて申し訳ありませんが、the VM specsです正確にあなたが何をしています。仕様を扱えない場合は、結局コンパイラを書くべきではないでしょう。

4

既存のツールを使用して、結果のバイトコードの増分変更の影響を調べてみてください。

出典:

public class Hello { 
     public static void main(String[] args) { 
       System.out.println("H"); 
     } 
} 

javap出力:

Compiled from "Hello.java" 
public class Hello extends java.lang.Object{ 
public Hello(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: getstatic  #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    3: ldc  #3; //String H 
    5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    8: return 

} 

バイナリ:

CA FE BA BE 00 00 00 32 00 1D 0A 00 06 00 0F 09   _______2________ 
00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07   ________________ 
00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29   _____<init>___() 
56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E   V___Code___LineN 
75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69   umberTable___mai 
6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67   n___([Ljava/lang 
2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75   /String;)V___Sou 
72 63 65 46 69 6C 65 01 00 0A 48 65 6C 6C 6F 2E   rceFile___Hello. 
6A 61 76 61 0C 00 07 00 08 07 00 17 0C 00 18 00   java____________ 
19 01 00 01 48 07 00 1A 0C 00 1B 00 1C 01 00 05   ____H___________ 
48 65 6C 6C 6F 01 00 10 6A 61 76 61 2F 6C 61 6E   Hello___java/lan 
67 2F 4F 62 6A 65 63 74 01 00 10 6A 61 76 61 2F   g/Object___java/ 
6C 61 6E 67 2F 53 79 73 74 65 6D 01 00 03 6F 75   lang/System___ou 
74 01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69   t___Ljava/io/Pri 
6E 74 53 74 72 65 61 6D 3B 01 00 13 6A 61 76 61   ntStream;___java 
2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 01   /io/PrintStream_ 
00 07 70 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61   __println___(Lja 
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29   va/lang/String;) 
56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 00   V_!_____________ 
07 00 08 00 01 00 09 00 00 00 1D 00 01 00 01 00   ________________ 
00 00 05 2A B7 00 01 B1 00 00 00 01 00 0A 00 00   ___*____________ 
00 06 00 01 00 00 00 01 00 09 00 0B 00 0C 00 01   ________________ 
00 09 00 00 00 25 00 02 00 01 00 00 00 09 B2 00   _____%__________ 
02 12 03 B6 00 04 B1 00 00 00 01 00 0A 00 00 00   ________________ 
0A 00 02 00 00 00 03 00 08 00 04 00 01 00 0D 00   ________________ 
00 00 02 00 0E           _____ 
1

SmartEiffelは、オープンソースのJavaの.classファイルジェネレータが含まれています。

http://smarteiffel.loria.fr/

関連する問題