翻译环境和运行环境
编译和链接的实现需要两个不同的环境。
第一种是翻译环境,在这个环境中源代码被翻译成可执行的机器指令。
第二种是执行环境,用于执行代码。
如果学习过编译原理,就会知道编译程序的过程,即源程序转换成逻辑上等价的目标程序的过程。
编译过程也分为前端和后端
前端:词法,语法, 语义。
后端:中间代码, 中间代码优化, 目标代码生成。
翻译程序也可分为三类:1.编译程序,2.解释程序,3.汇编程序。
翻译环境
翻译环境是由编译和链接两个大的过程组成,编译又可分为:预处理,编译,汇编三个过程。
总的来说就是是四个步骤,1.预处理,2.编译,3.汇编,4.链接。
这个过程是被隐藏起来的,现在的开发环境都是集成开发环境(IDE),用下图来直观的表达编译与链接的实现。
.c文件经过编译处理后产生对应的目标文件,在windows环境下的目标文件后缀是.obj,Linux环境下目标文件的后缀是.o。
一个项目可能由多个.c文件构建,多个.c文件经过编译处理后生成可执行文件。
预编译
源文件的扩展名可能是.cpp或.cxx或.c,头文件可能是.h,而预处理后的文件扩展名是.ii。
第一部编译命令(-E表示只进行预编译):
gcc -E hello.c -o hello.i
或者:
cpp hello.c > hello.i
预处理过程主要处理那些源代码文件的以“#”开始的预编译指令。比如经常使用的#include #define。
处理规则如下:
编译
1 gcc -S test.i -o test.s
汇编
1 gcc -c test.s -o test.o
链接
运行环境
1.程序必须载入内存中。
2.程序的执行便开始调用mian函数。
3.开始执行程序代码。程序运行时堆栈,储存函数的局部变量和返回地址。
详细可参考 函数栈帧的创建和销毁-CSDN博客
4.终止程序。