2

マンゴーというおもちゃのプログラミング言語を作ろうとしています。私は最初にそれをJavaにコンパイルし、Javaとしてコンパイルして実行したかったのです。しかし、私はそれが非常に遅いアプローチであることに気づきました。そこで、Javaバイトコードにコンパイルして実行することにしました。私はマンゴーコードと同等のJavaコードを与えました。マンゴーコードをバイトコード付きの同等の.classファイルにコンパイルするのを手伝ってくれませんか。

test.mangoで

println("Hello World!")

等しいだろう

public class test 
{
   public static void main(String[] args){
       System.out.println("Hello World!")
   }
}

test.javaでjavapを使用して、次のバイトコードを生成しました

Compiled from "test.java" 
public class test extends java.lang.Object{
public test();   
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 Hello World!    
5:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V    
8:  return
}

しかし、これをtest.classとして保存して実行すると、コマンドプロンプトで次のエラーが発生します

java.lang.ClassFormatError: Incompatible magic value number 1131375984

私はJavaプログラミングの2学期しか取っていません。私の教授は、Javaバイトコードを使用してJVM上にプログラミング言語を書くことができると私に言いました。だから私だけが試してみたかったのです。私はプログラミング言語の設計の経験がありません。ですから、どんな助けでも本当に役に立ちます。手がかりを得るためにJava仕様を調べましたが、何も得られませんでした。

4

2 に答える 2

3

次のようなバイトコードライブラリの使用を検討します。

あなたはほぼ間違いなくバイナリレベルで働きたくないでしょう。

JVM仕様に精通する必要があります。

雑草に深く入り込む前に、他の単純なJVM言語を調べることを強くお勧めします。物事はかなり複雑になり、かなり早くなります。JVM言語を開発するためにJavaの経験自体は必要ありませんが、それは簡単ではなく、非常に遠くまで到達するにはかなりの量の知識が必要です。

于 2012-09-08T20:21:34.127 に答える
3

Javaクラスファイルは、 ASCIIテキストではなくバイナリ形式のバイトコードを表します。これは、命令がコンパイルされた形式で実際に人間が読める形式ではないことを意味します。クラスファイルは単なる生データの集まりです。作成したクラスファイルを開いて、出力がどのようになるかを確認してください。クラスファイルのバイナリ形式の詳細については、Javaクラスファイルに関する関連するウィキペディアの記事を参照してください。javac

バイナリバイトコードを直接出力するのではなく、コンパイラチェーンの中間ツールとしてSootを使用してクラスファイルを作成できる場合があります。

于 2012-09-08T20:16:57.013 に答える