
一、翻译环境和运行环境
在 ANSI C 的任何⼀种实现中,存在两个不同的环境,如下:
-
翻译环境:在翻译环境中,会通过编译和链接两个大步骤,其中编译又分为了预处理(预编译)、编译和汇编,将源代码转换为可执⾏的机器指令(⼆进制指令),生成可执行程序
-
运行环境:即执行环境,在运行环境中会执行可执行程序,并输出结果
如下图:

接下来我们就来学习在翻译环境和运行环境中具体会做些什么
二、翻译环境
上面讲到了,翻译环境是用来将源代码转换为可执⾏的机器指令(⼆进制指令),生成可执行程序的,那么它到底是怎么将源代码转换成可执行的机器指令,又是怎么把机器指令生成可执行程序呢?我们一起来学习一下
翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(有些书也叫预编译)、编译、汇编三个过程,接下来我们就来学习它们
1.编译
编译要完成的就是将我们的源代码转换成可执行的机器指令,如图:

编译器就可以实现编译的功能,也就包括了预处理,编译,汇编这三个操作,我们学习编译也就是学习这三个操作的过程
由于VS是一个高度集成的开发环境,它已经把编译这样的细节隐藏起来了,在VS中,我们只需要按下ctrl+f5,那么VS就会一下就帮我们把编译、链接和执行这三个动作一起完成了,瞬间就可以看到结果
所以在VS中我们无法看到.c的源文件编译和链接的完整过程,这个时候我们就可以借助其它的编译器,在下文中就是以gcc为例进行整个编译链接的讲解
预处理
预处理又称预编译,在预处理阶段,后缀为.c的文件将会被处理为.i的文件,如test.c经过预处理后就会变成test.i
预处理阶段要做的事主要有以下几点:
- 将所有的 #define 删除,并展开所有的宏定义,比如使用宏定义了一个常量,我们一般会这样写:
//使用宏定义了一个常量
#define N 100
//使用宏
int arr[N];
那么经过预处理之后,#define N 100这条语句就会被删除,并且这个宏定义将会被展开,在这里就是将所有N替换成100,如下:
//预处理后,宏定义语句被删除
//展开宏定义,在这里就是将N替换成100
int arr

最低0.47元/天 解锁文章
3089





