前言:我们常常在程序中看到编译,链接,执行,但是你真的了解过它们吗?作为一名未来的合格的程序员,应当能够对它们有清晰的认知。本文就将对它们进行浓缩精炼的介绍,让你面对它们的时候不再感到迷惑。
想要深入了解的话,推荐朋友们看一看《程序员的自我修养》这本书。
程序的翻译环境和执行环境
在ANSI C的任何一种实现中,都存在着两个不同的环境
第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令
第二种是执行环境,它用于实际执行代码
而其中的翻译环境便是本章的重点内容,它还可以细分为好几个步骤。
翻译环境
上图是计算机程序设计语言的大致发展历程。而在翻译环境中,过程正与上图相反:
程序员输入易于理解的高级语言,转为汇编语言,再转为计算机能够识别的机器语言,这样不管对程序员,还是对计算机,都大大提高了工作效率,双方得利。
我们常常可以在文件中看到以.obj
.exe
结尾的文件,经过之前的学习,可能你会知道.obj
就是目标文件
,而.exe
文件就是可执行文件
,但是你知道它们是怎么产生的吗?请看下图翻译环境的细分图:
翻译环境分为编译
和链接
两部分,而编译又可以细分为预编译(预处理)
编译
汇编
三部分
预编译(预处理)
通过预编译,程序会产生一个
.i
文件,这个阶段完成了:1.头文件的包含 2.注释的删除 3.宏定义的转换等
编译
通过编译,生成一个
.s
文件,源代码被翻译成汇编代码 ,这个阶段完成了:1.语法分析 2.词法分析 3.语义分析 4.符号汇总
汇编
对汇编代码(.c)进行汇编操作生成一个目标文件(.obj),将汇编代码翻译成二进制的指令(目标文件中存储的是二进制的指令),在此阶段生成符号表
链接
1.合并段表
2.符号表的合并和重定位
经过上面两个步骤,生成可执行程序.exe
注:符号表的合并:每个.o
文件都有符号表,将几个.0
文件的符号表进行合并,进而生成一个新的符号表。
转载网图两张,方便理解:
总结:每个源文件都是单独编译的,最后各自生成一个.obj
目标文件,多个目标文件通过链接器处理生成一个.exe
可执行文件
执行环境
在这里执行环境不做过多的叙述
程序执行的过程:
1.程序必须载入内存中,在有操作系统的环境中:一般这个操作有操作系统完成。在独立的环境中,程序的子啊如必须由手工安排,也可以是通过可执行代码植入只读内存来完成
2.程序的执行开始,接着便调用main函数
3.开始执行程序代码,这个时候将使用一个运行时堆栈,存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序的整个执行过程一直保留它们的值。
4.终止程序。正常终止main函数,也有可能是意外终止。
文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给点点赞和关注.