Sunday 18 October 2015

编译原理

重新来预习一下C语言文件的编译过程:
文件后缀变化: .c ==> .i ==> .s ==> *

*CPP是 预编译 的缩写 preprocess。*AST抽象语法树 abstract syntax tree.*SSA是”静态单赋值” static single assignment form。
*RTL是寄存器传输语言的缩写 register-transfer level.
1)首先将文件进行语法分析,通过token的方式得到对应语言的AST。
2)根据得到的AST生成中间代码并且优化。
3)根据目标机器的汇编描述,生成对应机器架构的汇编语言。
4)汇编器根据生成的汇编文件生成二进制文件供机器理解。
5)连接器ld将源码中调用的库函数连接进来。(-Iinclude的作用?)


下图是一个将一行代码编译为AST的过程的例子:(怎么翻译器那的二叉树和右边分析语言的不一样?)

参考http://blog.csdn.net/rill_zhen/article/details/7703557


至此,是基础。接下来是更详细更复杂的流程:
介绍:
编译器的工作的开始,就是读入源码(预编译先不考虑),然后,去除一些空字符,然后经过词素匹配,并和其属性(可选),组成一个的词法单元,多个词法单元,连接成词法单元序列。自此,词法分析器的工作就算完成了。
下面是词法分析器工作的内在机制图:

1)确定词素,就是读到字符串和模式匹配。
2)模式由DFA来匹配,DFA就是图(binary tree)。
3)图又可以由正则表达式表示。
4)正则表达式是通过语言文法产生式转换而来。
5)文法产生式,又是由编程语言本身来定义的。

参考博客:http://blog.csdn.net/rill_zhen/article/details/7722882

No comments:

Post a Comment