私は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
}
}
}
あなた自身の言語を実装することの美しさは、あなたが決定することです! –
バイトコードは通常、コードを実行できる仮想プロセッサの*命令*を意味します。この仮想プロセッサはありますか?そうでない場合は、最初に設計する必要があります。バイトコードはコンセプトであり、完全に本格的な仕様ではありません。 –