问题1:什么是编译?
问题2:编译过程分为哪几个过程?
初识编译器
预编译:
1、处理所有的注释,以空格替代;
2、将所有的#define删除,并且展开所有的宏定义;
3、处理条件编译指令#if, #ifdef, #elif, #else, #endif;
4、处理#include,展开被包含的文件;
5、保存编译器需要使用的#pragma指令;
编译:
----对预处理文件进行词法分析、语法分析和语义分析;
词法分析:分析关键字、标识符、立即数等是否合法;
语法分析:分析表达式是否遵循语法规则;
语义分析:在语法分析的基础上进一步分析表达式是否合法;
----分析结束后进行代码优化生成相应的汇编代码文件。
编译指令示例: gcc -S file.i -0 file.s
汇编
----汇编器将汇编代码转变为机器的可执行指令;
----每条汇编语句几乎都对应一条机器指令
汇编指令示例:
gcc -c file.s -o file.o
例子:编译示例
#include "19-1.h"
// Begin to define macro
#define GREETING "Hello world!"
#define INC(x) x++
// End
int main()
{
p = GREETING;
INC(i);
return 0;
}
总结:
编译过程分为预处理、编译、汇编和链接四个阶段:
预处理:处理注释、宏以及已经以#开头的符号;
编译:进行词法分析、语法分析和语义分析等;
汇编:将汇编语言翻译为机器指令的目标文件;