一、什么是编译器?
• 什么是编译器?
编译器就是将一种计算机语言”翻译”成另一种语言的程序
• 编译器的工作流程
二、编译器预处理功能
1.将源程序(C/CPP)中所有#define删除并展开所有宏定义。
2.过滤左右注释“//”和”/* */”中的内容。
3.保留所有#pragma编译器指令。
4.添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息,及用于编译时产生编译错误或者警告信息显示行号。
5.处理所有的预处理命令,比如#if #endif等。
gcc test.c -E -o test.i
行标记:源文件名和行号通过格式为#linenum文件名标志的行来传递。代表下一行起源于文件filename中的linenum行。
行末数字标准含义:
‘1’表示新的文件开始;‘2’表示返回到一个文件;‘3’表示以下文件来自系统头文件;‘4’表示下面的文件应该被包装在extern “C”块中。
三、编译有哪些功能?
3.1 编译器功能:
⚫1、词法分析:分析关键字,标识符,立即数的合法性;
⚫2、语法分析:检查代码是否遵循C语言语法规则;
⚫3、语义分析:分析表达式是否合法;
编译过程就是对预处理完成的文件进行一系列词法分析,语法分析及优化后生成相应的汇编代码。
编译需要的指令:gcc test.i -S -o test.s
3.2 汇编:
汇编过程调用主要对汇编代码进行处理,生成处理器能识别的指令,保存在后缀名为.o的目标文件中。
•1、执行者:汇编器;
•2、操作:使用汇编器将汇编代码转化为机器可执行的机器码。