代码改变世界

程序员的自我修养—2014-10-10

2014-10-10 12:53  想打架的蜜蜂  阅读(140)  评论(0)    收藏  举报

1、被隐藏了的过程:

LInux下,用命令gcc编译c源程序,有四个步骤:预处理、编译、汇编、链接

首先是源文件hello.c和相关的头文件,如stdio.h等被预编译器cpp预编译成一个.i文件。对于c++程序员来说,他的源代码文件的扩展名可能是.cpp或者.cxx,头文件的扩展名可能是.hpp。而预编译后的文件扩展名是.ii。这一步预编译的过程相当于如下命令(-E表示只进行预编译)

gcc -E hello.c -o hello.i  或者cpp hello.c>hello.i

预编译过程主要处理那些源代码文件中的以“#"开始的预编译指令,比如“#include”、“#define”等,主要处理规则如下:

编译完的.i文件不包含任何宏定义,因为所有宏定义已经被展开,并且包含的文件也已经被插入到.i文件中。

2、编译

编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。编译过程相当于下面命令:

gcc -s hello.i -o hello.s

或者使用gcc -s hello.c -o hello.s

3、汇编

汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。代码

as hello.s -o hello.o

或者:gcc -c hello.s -o hello.o

或者 gcc -c hello.c -o hello.o

4、链接

将关联的文件链接起来才能得到"a.out"

5、编译器做了什么?

编译过程一般可以分为6步,扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。

词法分析

首先源代码程序被输入到扫描器,扫描器简单的进行词法分析,运用类似于有限状态机的算法将源代码的字符序列分割成一系列的记号。词法分析产生的记号分为以下几类:关键字、标识符、字面量(包含数字、字符串)和特殊符号(加法、等号)。在识别记号的同时,扫描器也完成了其他工作。如将标识符存放到符号表,将数字、字符串常量存放到文字表。

 

语法分析

语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树。整个分析过程采用上下文无关语法的分析手段,语法树就是以表达式为节点的树

 

语义分析

语义分析器完成了对表达式的语法层面的分析