我正在开发一个将中间表示(IR)转换为程序集的解释器。但是,我怀疑是否有必要将每条指令单独转换为汇编,如下例所示。此外,我希望收到基于所提供代码的建议和优化建议。有关如何改进装配转换流程并使其更加高效的任何指导或见解。
#include <stdio.h>
#include <stdlib.h>
typedef enum {
OP_ADD,
OP_SUB,
OP_DIV,
OP_MUL,
NUM_OPCODES
} bytecode_opcode;
void convert_add() { printf("add rax, rbx\n"); }
void convert_sub() { printf("sub rax, rbx\n"); }
void convert_div() { printf("div rbx\n"); }
void convert_mul() { printf("mul rbx\n"); }
typedef void (*conversion_func)();
conversion_func conversion_table[NUM_OPCODES] = {
convert_add,
convert_sub,
convert_div,
convert_mul
};
void convert_to_x64(bytecode_opcode instr) {
if (instr >= 0 && instr < NUM_OPCODES) {
conversion_func func = conversion_table[instr];
func();
} else {
printf("Opcode inválido\n");
}
}
int main() {
convert_to_x64(OP_ADD);
convert_to_x64(OP_MUL);
convert_to_x64(10);
return 0;
}
解释器不一定需要关心机器代码或汇编语言——他们只需要完成输入语言所说的事情即可。例如,在加法的情况下,解释器需要添加,例如
return a+b;
——不一定要生成机器代码然后运行它。
生成机器代码(或汇编代码)将是 JIT(即时)编译器的一部分,这是一种非常不同形式的解释器。
JIT 是一个内存编译器以及一个管理已编译代码以供重用的运行时。 JIT 可以有不同程度的优化。它可以将输入语言指令一对一地翻译成汇编语言,而优化 JIT 将考虑输入语言的较大部分,并像真正的编译器后端一样翻译它们,按照输入块的步骤,使用有利于优化的中间形式.