【C语言14】 程序的翻译环境和运行环境

目录

一、程序的翻译环境和运行环境

二、翻译环境

1、编译的几个阶段

1.预处理阶段

2.编译阶段

3.汇编阶段

4.符号汇总与生成符号表

2、链接

三、运行环境

1、程序必须载入内存中

2、程序的执行开始

3、开始执行程序代码

4、终止程序


一、程序的翻译环境和运行环境

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

1、翻译环境,在这个环境中源代码被转换为可执行的机器指令。

2、执行环境,它用于实际执行代码。


二、翻译环境

1.组成一个程序的每个源文件(.c文件)通过编译过程分别转换成目标代码(.obj文件)。

2.每个目标文件(.c文件)由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序(.exe文件)。

3.链接器同时也会引入标准C函数库(Libraries,即链接库)中任何被该程序所用到的函数,而且它可以搜索程序员个人 的程序库,将其需要的函数也链接到程序(.exe文件)中。

翻译环境(从.c到.exe) = 编译(编译器,即cl.exe) + 链接(链接器,即link.exe)

VS 2019这种叫集成开发环境,包含了这些小的编译器、链接器等等。


1、编译的几个阶段

编译(从.c到.obj) = 预处理(也叫预编译,.i文件) + 编译(.s文件) + 汇编(.o文件)

1.预处理阶段

gcc test.c -E > test.i --- 预处理之后就停止,并且写在test.i文件中。

1)完成了头文件的包含,比如说#include。

2)完成#define定义的符号和宏的替换。

3)注释的删除

预处理阶段完成的都是文本的操作。

2.编译阶段

gcc test.i -S > test.s

作用是:把C语言代码转换成汇编代码。

1)语法分析

2)词法分析

3)语义分析

4)符号汇总

3.汇编阶段

gcc test.s -c > test.o ( test.obj )

作用是:

1)把汇编代码转换成机械指令(二进制指令)。

2)生成符号表

test.o文件是elf格式的,工具readelf是可以看懂test.o文件的。

命令:readelf test.o -s ---- 能看见全局变量

4.符号汇总与生成符号表

不同的.c文件各自进行符号汇总,然后将所有.c文件的符号汇总生成符号表。


2、链接

把多个目标文件和链接库进行链接。

1.合并段表 --- 也是elf格式

2.符号表的合并和重定位 --- 保留有效的符号地址

推荐图书《程序员的自我修养》


三、运行环境

程序执行的过程:

1、程序必须载入内存中

在有操作系统的环境中:一般这个由操作系统完成。

在独立的环境中,程序的载入必须由手工安排(比如说嵌入式);

也可能是通过可执行代码置入只读内存来完成。

2、程序的执行开始

调用main函数。

3、开始执行程序代码

这个时候程序将使用一个运行时堆栈,存储函数的局部变量和返回地址。

程序同时也可以使用静态内存,存储于静态内存中的变量,在程序的整个执行过程 一直保留他们的值(在静态区)。

4、终止程序

正常终止main函数;也有可能是意外终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值