刨析C语言的程序环境

1、程序的翻译环境和执行环境

在ANSI C的任何一种实现中,存在两个不同的环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。见下图:
在这里插入图片描述
在翻译环境又可分为编译和链接,在编译过程中又分为:预编译、编译、汇编过程,下面让我们来详细看一下编译+链接过程。

2、详解编译+链接

编译过程

我们将翻译环境分为两个小的过程,编译(依赖编译器,VS下的编译器为cl.exe)和链接(依赖链接器,VS下为link.exe),其中编译又分为预编译、编译、汇编。见下图:
在这里插入图片描述

链接过程

每一个源文件都会单独的经过编译器的处理,生成所对应的目标文件,最终通过链接器,把多个目标文件和链接库(包含库函数等)连接在一起,生成我们想要的可执行程序。见下图:
在这里插入图片描述

翻译过程详解

以下面代码最终如何关联运行起来的为例来讲:
在这里插入图片描述
代码大致要经过预编译、编译、汇编、链接到可执行程序,下面我们来详细刨析每一步的细节:

1、预编译:.c文件->.i文件。 进行的都是文本操作,对文本的删除、替换:1)完成头文件的包含2)预处理指令的处理,如#define的替换等。3)删除注释

2、编译:.i文件->.s文件。把C语言代码转换为汇编代码,在这个过程中要经过:1)语法分析: 2)词法分析 3)语义分析 4)符号汇总:汇总的都是全局的符号,将上面代码左侧的Add,右侧的Add、mian进行汇总。

3、汇编:.s文件->.o文件。把汇编代码转换成二进制指令(机器指令)。在这个过程中完成了:形成符号表
在这里插入图片描述
4、链接:1)合并段表:.o的二进制文件elf的格式来组织文件 2)符号表的合并和重定位:舍弃没有实际地址的函数

3、 运行环境

程序执行的过程:

1、程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须 由手工安排,也可能是通过可执行代码置入只读内存来完成。
2、程序的执行便开始。接着便调用main函数。
3、开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同 时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
4、终止程序。正常终止main函数;也有可能是意外终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen_captial

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值