两大环境要做的大致内容如下
我们自己写的C语言源代码是.c文件。翻译环境有两大工序, 一个是编译, 一个是链接。 然后就生成了我们的可执行程序, 也就是.exe文件,注意, 这些都是编译器帮我们做的。然后,我们打开.exe文件, 程序输出到屏幕上, 这个过程, 就用到了执行环境,注意, 它是操作系统帮我们做的。
现在来讲翻译环境
翻译环境
翻译环境主要分为两大部分, 编译和链接。 编译用到的是我们的编译器:vs之中是cl.exe; 链接用到的是我们的链接器:vs之中是link.exe。(vs是集成开发环境, 包括编辑器, 编译器, 连接器, 调试器)
那么为什么会叫作翻译环境呢?那是因为翻译环境目的是将我们人能看懂的c语言代码, 逐步翻译为机器能够看懂的二进制指令。
其中, 我们的.c文件经过编译器编译之中生成机器能够认识的二进制指令, 这个时候的文件是以.obj为后缀, 叫做目标文件。然后,目标文件之间再进行链接就生成了我们的.exe可执行程序。
编译阶段
编译阶段分为:预编译(预处理), 编译, 汇编。
预处理就是对我们的源代码.c文件进行预先的处理, 主要的作用就是:消除我们写的注释, 宏的替换,头文件展开等等操作。
预处理之后我们的文件名就变成了.i文件。
.i文件进行编译, 编译后就是.s文件, 这个时候我们的.s文件之中就是一些汇编代码。
.s文件经过汇编操作之后文件之中就是一些机器能够读懂的二进制指令, 也就是.obj文件。
编译
编译这个阶段分为词法分析, 语法分析和语义分析。
词法分析就是我们的代码在编译期间被扫描器进行扫描, 将我们的表达式分成一个一个的类型名, 比如 int a = 10;
这里的int 就被识别成类型名
a被识别为标识符,
=被识别为赋值,
10就是一个数字。
这就是词法分析。
然后语法分析就是我们的编译器将我们的代码划分为一个语法树, 一个语法树。
比如这么一个式子:k = a + b + 6 + 7;
这就是一棵语法树,以表达式为节点。
然后语义分析就是对语法分析生成的语法树进行静态的分析, 包括一些声明问题, 类型转换问题。 这一个过程就会进行编译的报错。
那么怎么进行分析呢?以上面的语法树为例。
链接
链接就是将一堆文件连接起来, 生成一个可执行程序。
链接解决的是一个项目中,多模块, 多文件之间互相调用的细节。
如图:
看这个文件中的Add
再看这个文件中的Add
运行环境
当我们运行一个程序, 程序必须要载入内存之中,操作系统会帮助我们完成。如果没有操作系统, 那么程序载入必须我们手动载入, 比如单片机的烧录。
程序载入成功后, 便开始调用main函数。
这个时候会生成一个运行时堆栈,也就是函数栈帧。 每一个函数的调用都会创建一个函数栈帧。每一个栈帧销毁时, 局部栈内存的空间编译器自动释放, 但是堆区的空间要我们自己释放。
然后程序结束, 这个时候main函数结束, 可能是正常结束, 也可能是异常结束。 这取决与这个程序的设计。