1

Summary

1)编译器一般由以下4部分组成:预处理器、编译器、汇编器、链接器

2)点击Build之后,IDE会进行预编译(生成中间.i文件)、编译(生成汇编代码.s文件)、汇编(生成目标文件.o文件)、链接(生成可执行程序.out文件)。

3)预编译会做的事情:处理注释(使用空格代替);展开宏(删除'#define');处理#开头的符号(包括处理条件编译指令展开头文件#pragma指令等)

4)编译器所做工作

  • 对预处理.i文件进行词法分析、语法分析、语义分析

    • 词法分析:分析关键字、标识符、立即数等是否合法
    • 语法分析:分析表达式是否遵守语法规则
    • 语义分析:在语法分析的基础上进一步分析表达式是否合法
  • 分析结束后进行代码优化生成相应的汇编代码文件

5)汇编器所做工作

  • 汇编代码转变为机器的可执行指令
  • 每条汇编语句几乎都对应一条机器指令

编译过程简介

1、预编译

预编译做的是文本处理工作:

  • 注释用空格代替
  • 展开所有的宏定义,并将#define删除
  • 处理条件编译指令#if, #ifdef, #elif, #else, #endif
  • 处理#include,展开被包含的头文件
  • 保留编译器需要使用的#pragma指令

预处理指令示例:gcc - E test.c -o test.i
image.png

2、编译

编译器所做工作

  • 对预处理.i文件进行词法分析、语法分析、语义分析

    • 词法分析:分析关键字、标识符、立即数等是否合法
    • 语法分析:分析表达式是否遵守语法规则
    • 语义分析:在语法分析的基础上进一步分析表达式是否合法
  • 分析结束后进行代码优化生成相应的汇编代码文件

编译指令示例:gcc -S test.i -o test.s
image.png

3、汇编

汇编器所做工作

  • 汇编代码转变为机器的可执行指令
  • 每条汇编语句几乎都对应一条机器指令

汇编指令示例:gcc -c test.s -o test.o(.o文件被称为目标文件,并不是最终的可执行程序;一般一个.c文件就对应到一个.o目标文件
image.png

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。


bryson
169 声望12 粉丝