-3

私はCで作成している言語用のインタープリタを作成中です。現在、ソースコードをトークンにレキシングしてから、これらのトークンを解析してASTにすることができます。いくつかの読書をした後、私は結論に達すると、バイトコードを使うのは、木をたどるのに必要な再帰の量のせいでASTを歩いているよりも速いということです。バイトコードで値を保存する

ASTを指定すると、これをバイトコードに変換するにはどうすればよいですか?具体的には、実際に関数、変数、定数はどこに格納されていますか?それらはバイトコード自体に格納されているのですか、またはこれらを格納する専用のメモリ領域がありますか?私のプログラムは現在、

1 + 2 

として、いくつかのソースコードを受け取り、AST(これはCではない、ただ表現を生成

typedef enum { 
    AST_NODE_INT, 
    AST_NODE_FLOAT, 
    AST_NODE_ADD, 
    // many, many more of these 
}; 

typedef struct _ast_node { 
    ast_node_type type; 

    union { 
     int as_int; 
     float as_float; 

     struct as_add { 
      struct _ast_node *left; 
      struct _ast_node *right; 
     }; 

     //more structs, representing the different types in the enum 
    }; 
}; 

は私のASTの実装方法のビューを簡素化)

{ 
    type: AST_NODE_ADD, 
    as_add: { 
     left: { 
      type: AST_NODE_INT, 
      as_int: 1 
     }, 
     right: { 
      type: AST_NODE_INT, 
      as_int: 2 
     } 
    } 
} 
+2

あなた自身の言語を実装することの美しさは、あなたが決定することです! –

+2

バイトコードは通常、コードを実行できる仮想プロセッサの*命令*を意味します。この仮想プロセッサはありますか?そうでない場合は、最初に設計する必要があります。バイトコードはコンセプトであり、完全に本格的な仕様ではありません。 –

答えて

1

関数の変数と定数(少なくともその名前と参照情報これを値に変換するために必要です)は、通常、シンボルテーブルに格納されます。

関数呼び出しの場合、多くのargsを評価スタックにプッシュし、関数のバイトコードを呼び出す呼び出し命令があります。

「コンパイラ:原理、テクニック、ツール(第2版):Alfred V Aho(別名「ドラゴンブック」)は、 「コンパイラ」と命名されていますが、この資料は直接適用されます。

関連する問題