编译到底做了什么(***.c -> ***.o的过程)
(第一次写博客,好激动的说.......) 我们知道,一个程序由源代码到可执行文件往往由这几步构成: 预处理(Prepressing)-> 编译(Compilation)-> 汇编(Assembly)-> 链接(Linking)。 编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分。那么,这个核心部分究竟做了什么呢。 各位看官容我挽起袖子,且听我娓娓道来。 编译器做了什么? 从最直观的角度来说,编译器就是将高级语言翻译成机器语言的一个工具。 以 C语言为例,解释一下 ***.c -> ***.o 的过程。 假设test.c有下面一段代码 array[index] = (index + 4) * (2 + 6); 下面就来谈谈这个表达式是如何翻译成机器语言的过程。 这个过程主要有如下五步,看起来好长的样子,看官需静下心来慢慢看。。。。 1.词法分析 -- 将源代码字符序列分割成一系列的记号 源代码程序被输入到扫描器(Scanner)。 扫描器的任务就是:运用一种有限状态机(Finite State Machine)的算法,将源代码字符序列分割成一系列的记号(Token)。还有一些其他工作(将标识符放到符号表,将数字、字符串放到文字表中) 如下图(因为表格换页了,所以拍出来是这个样子,望海涵)