Compiler construction 编译器:转换为汇编

Compiler construction 编译器:转换为汇编,compiler-construction,assembly,Compiler Construction,Assembly,我已经为我的实验语言编写了一个解释器,我知道我想继续为它编写一个小型编译器。它可能需要源代码,执行与解释器(标记器、解析器)相同的步骤,然后将源代码转换为程序集 现在我的问题是: 我能期望我的语言中的每个命令都能以1:1的比例翻译成一组汇编指令吗?我的意思是,如果我必须完全放弃整个输入程序,或者如果它只是翻译成每行的汇编 我应该使用哪个汇编程序作为输出格式 我将您的问题理解为询问您的语言中的每个语句是否会在任何上下文中被翻译成相同的ASM行。答案是:这取决于您的语言,但通常不是。有一些复杂的

我已经为我的实验语言编写了一个解释器,我知道我想继续为它编写一个小型编译器。它可能需要源代码,执行与解释器(标记器、解析器)相同的步骤,然后将源代码转换为程序集

现在我的问题是:

  • 我能期望我的语言中的每个命令都能以1:1的比例翻译成一组汇编指令吗?我的意思是,如果我必须完全放弃整个输入程序,或者如果它只是翻译成每行的汇编

  • 我应该使用哪个汇编程序作为输出格式

  • 我将您的问题理解为询问您的语言中的每个语句是否会在任何上下文中被翻译成相同的ASM行。答案是:这取决于您的语言,但通常不是。有一些复杂的问题,例如寄存器分配,这可能导致输出不是1:1,具体取决于上下文。您的语句可能需要一些寄存器,这些寄存器在一个上下文中是空闲的,在另一个上下文中是被占用的(因此您将使用堆栈)
  • 取决于平台和您的计划。如果您想编译成Windows的本机程序集,那么x86汇编语言应该是您的目标

  • 除非您下定决心要“重新发明轮子”,否则您最好只发出C代码,然后将其传递给现有的C编译器,例如gcc。这比编写自己的后端要容易得多,而且您可以免费获得所有C编译器的优化等功能。

    不,这是不可能的。如果您的语言包含eval()之类的内容,它可能会变得很时髦


    作为后端汇编程序,nasm似乎最受欢迎。GAS是可能的,但我发现它有点不可原谅和不完整。

    至于你的第二个问题:你的目标平台是什么?为什么,你害怕他会为Windows提供一个像样的系统?因此,向GCC提供建议是破坏这一局面的好办法:-)