分享

编译器与汇编语言

 quasiceo 2014-01-17

编译器与汇编语言

上一篇文章提到了汇编器,然而语言的发展都要求更强大的表达能力以及更高阶的表达形式。

上文从最底层倒退到了汇编器,汇编器是作用于汇编代码,那么汇编代码从哪来,那就继续倒退,就是本文中要说的编译器。

 

写编译器有难度,因为比起汇编器,更复杂的在于语法分析,因为高级语言都会提供各种语法来进行更高阶的程序思维表达。

首先语法分析得到AST,这个AST基本上表示了程序结构以及各种语句。接下来就是根据它生成汇编语句。

(上文说的每一次翻译都是为了接下来的步骤做准备,提高了运行代码的速度-相对于执行解释本步骤的中间代码而言)

if((((x > 3))))

{

s

}

else

{

s

}

 

比如上面这段代码,AST是:if语句 ->条件是(((x>3))),然后还有body以及else。

那么如果直接解释这个AST,我们可以调用node->execute()。每一种语法结构会有其自身的求值流程(规则)

class IfNode : public Node

{

void execute()

{

   if(condition->execute())

   {

   body_node->execute();

   }

   else

   {

    else_node->execute();

   }

}

}

 

光这些框框语句就耗用了多少汇编指令?

那如果我们进行一个翻译过程,将其转化为汇编代码呢?

mov eax [0]

je eax, 0

...

 

每一行代码直接对应其实际的效果。

代码生成的时候要考虑变量的分配以及标签的名字分配。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多