是否需要在解释器中将每个中间表示指令单独转换为汇编?

问题描述 投票:0回答:1

我正在开发一个将中间表示(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;
}
assembly interpreter intermediate-language
1个回答
0
投票

解释器不一定需要关心机器代码或汇编语言——他们只需要完成输入语言所说的事情即可。例如,在加法的情况下,解释器需要添加,例如

return a+b;
——不一定要生成机器代码然后运行它。

生成机器代码(或汇编代码)将是 JIT(即时)编译器的一部分,这是一种非常不同形式的解释器。

JIT 是一个内存编译器以及一个管理已编译代码以供重用的运行时。 JIT 可以有不同程度的优化。它可以将输入语言指令一对一地翻译成汇编语言,而优化 JIT 将考虑输入语言的较大部分,并像真正的编译器后端一样翻译它们,按照输入块的步骤,使用有利于优化的中间形式.

© www.soinside.com 2019 - 2024. All rights reserved.