从最开始学C语言开始是否想过,这一段代码是如何运行的呢?
我们来了解一下。
编写完成以后我们给他取个名字叫做test.c
在Linux 下运行它其实只需要敲下:
gcc test.c
./a.out
就可以看到运行结果:
实际上在屏幕上打印hello world的过程非常的繁琐,我们来简单的了解一下
首先我们要知道的是程序的编译过程是分为4个步骤:
预处理->编译->汇编->链接
预处理:
- 展开所有的宏定义,将所有#define删除。
- 处理所有的条件预编译指令,如#if #ifdef #undef #ifndef #endif #elif
- 处理#include,将包含的文件插入改指令的位置,由于文件里面也会包含文件所以这是一个递归的过程会将所以的文件全部插入到源程序,
- 删除所有注释 如: // /* */
我们可以使用命令:
gcc -E test.c -o test.i
来生成 test.i 用vim查看效果:
编译
编译过程就是对源代码进行一系列的词法分析、语法分析、语义分析、程序优化,编译通过将会生成一个汇编代码。
- 词法分析
将源代码输入到扫描器中然后通过算法对源代码的词法进行分析,即,按照语言的词法规则识别各类单词,并产生相应单词的属性字
- 语法分析
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确。
- 语义分析
对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误。
如果其中出现错误也就是会遇到我们编写程序中的语法错误。
如果正确则会生成一段汇编代码
我们可以使用命令:
gcc -S test.i -o test.s
来生成 test.s查看汇编代码:
- 优化
优化过程比较复杂,我们这里只说到比较简单的优化
比如
int var = 2 + 6;
编译器会将这个代码优化成
int var = 8;
汇编
汇编是将汇编代码翻译成可以执行的指令,汇编过程比较简单,每一个汇编代码逗对应一条指令所以只需要按照表中的指令进行翻译即可。
我们可以用:
查看效果。