在字节码中存储值
Storing values in bytecode
我正在为我在 C 中创建的语言编写解释器。目前它可以将源代码词法化为标记,然后将这些标记解析为 AST。阅读一些内容后,我得出结论,由于遍历树所需的递归量,使用字节码比仅遍历 AST 更快。
那么给定一个 AST,我该如何将其转换为字节码?更具体地说,函数、变量和常量实际存储在哪里?它们是存储在字节码本身中,还是有一个单独的内存区域专门用于存储它们?
我的 AST 实现方式的简化视图:
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
};
};
我的程序目前需要一些源代码,例如
1 + 2
并生成一个 AST(这不是 C,只是一种表示)
{
type: AST_NODE_ADD,
as_add: {
left: {
type: AST_NODE_INT,
as_int: 1
},
right: {
type: AST_NODE_INT,
as_int: 2
}
}
}
函数变量和常量(至少它们的名称以及将其转换为值所需的任何查找信息)通常存储在符号 table.
中
在函数调用的情况下,您可以将许多参数压入计算堆栈,然后有一条调用函数字节码的调用指令。
我建议获取编译器:原理、技术和工具(第 2 版):Alfred V Aho(又名 'the dragon book'),即使它被命名为
"compilers" material 直接适用
我正在为我在 C 中创建的语言编写解释器。目前它可以将源代码词法化为标记,然后将这些标记解析为 AST。阅读一些内容后,我得出结论,由于遍历树所需的递归量,使用字节码比仅遍历 AST 更快。
那么给定一个 AST,我该如何将其转换为字节码?更具体地说,函数、变量和常量实际存储在哪里?它们是存储在字节码本身中,还是有一个单独的内存区域专门用于存储它们?
我的 AST 实现方式的简化视图:
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
};
};
我的程序目前需要一些源代码,例如
1 + 2
并生成一个 AST(这不是 C,只是一种表示)
{
type: AST_NODE_ADD,
as_add: {
left: {
type: AST_NODE_INT,
as_int: 1
},
right: {
type: AST_NODE_INT,
as_int: 2
}
}
}
函数变量和常量(至少它们的名称以及将其转换为值所需的任何查找信息)通常存储在符号 table.
中在函数调用的情况下,您可以将许多参数压入计算堆栈,然后有一条调用函数字节码的调用指令。
我建议获取编译器:原理、技术和工具(第 2 版):Alfred V Aho(又名 'the dragon book'),即使它被命名为 "compilers" material 直接适用