引入:
在ANSI C在任何实现中,都有两种不同的环境。
第一种是翻译环境,在这种环境下,源代码被转换为可执行的机器指令。
第二种是执行环境,用于实际执行代码。
<1>翻译环境
通过编译过程将构成程序的每个源文件转换为目标代码。(object code)。
(Windows文件后缀在环境中.obj,Linux后缀为环境.o)
每个目标文件由链接器链接(linker)捆绑在一起,形成单一完整的可执行程序。
链接器还将在标准C函数库中引入任何程序使用的函数,它可以搜索程序员的个人程序库,并将所需的函数链接到程序中。
简而言之,翻译环境是:源文件->编译、链接->可执行文件过程中的环境。
<2>执行环境
可执行程序运行的环境。
<1>预编译:
预编译:gcc test.c -E(Linux)
1.包含头文件。
#inlcude是预处理指令
2、#define替换符号。
#define也是预处理指令
3.删除注释。
<2>编译:
编译:gcc test.i -S(test.i是预处理生成的文件)(生成test.s)(Linux环境下)
包含了:
1、语法分析
2、词法分析
3、语义分析
(错误编不过去,报错)
<3>汇编:
汇编:gcc test.s -c(会生成test.o)(Linux环境下)
windows环境下的目标文件是.obj
Linux环境下的目标文件是.o
目标文件为二进制
形成符号表(形成编译过程中汇总的符号表,一个 一 对应)。
<4>链接:
将前几个文件和链接库放在一起
1、合并段表
程序执行过程:
<1>程序必须包含在内存中。在有操作系统的环境中,该操作通常由操作系统完成。在一个独立的环境中,程序的载入由手动安排,或者可以通过将可执行代码放入可执行内存来完成。
<2>操作环境是程序一旦执行就开始,然后调用main主函数。
<3>开始执行程序代码。此时将使用堆栈(stack),存储函数的局部变量和返回地址。(创建和销毁函数栈帧)程序也可以使用静态内存(static)在程序的整个执行过程中,存储在静态内存中的变量始终保留其值。
<4>终止程序。正常终止main函数,也可能异常终止。
欢迎指正水平有限。