C语言——二周目——程序的翻译与执行环境

一、程序环境

对于一个C语言程序的实现,整个过程一般存在两个不同的环境,分别是翻译环境与执行环境。在翻译环境中,我们所写的源代码经过一系列处理被转换成为可执行的机器指令;在执行环境中,会实际执行代码。

整个程序在这两个环境中处理,由我们所写的.c文件最后变为.exe文件。

该图便是程序在翻译与运行过程中的流程,每一个源文件通过编译转换为单独的一份目标代码,这些生成的目标文件最后由链接器捆绑在一起,链接器同时引入标准库与个人库内容,从而形成一个单一而完整的可执行程序。

以下的内容,我们会一一介绍这些流程具体做了哪些事情。

二、程序的翻译环境

1.编译

1.1预编译(预处理)

在该过程中,源文件会从 .c文件 变为 .i文件 ,所进行的操作均为文本操作。具体的操作包括:

①注释的替换(删除)。在预编译阶段,代码中所写的注释信息会被用一个空格进行替换。

②头文件的包含。代码中通过#include所包含的头文件都会被引入,并且在此展开。

③#define 符号的替换。该阶段会将定义的常量、宏等进行替换。

1.2编译

在该过程中,源文件会从 .i文件 变为 .s文件,将c语言代码翻译成为了汇编代码。具体的操作包括:

①词法分析;

②语法分析;

③语义分析;

④符号汇总。符号汇总的符号都是是针对全局的。

在此处会生成语法树来构建整个语句,因其操作偏底层,所以挖个坑,等我们详细了解了编译原理之后再来把这个坑给填平。

1.3汇编

在该过程中,源文件会从 .s文件 变为 .o文件,将汇编代码翻译成为了二进制的指令,即目标文件。

在此时会生成符号表,所谓符号表即为编译时所汇总的符号的总和,其记录了符号名与指向的地址。以函数为例,对于在该源文件内声明并且定义的函数,会记录函数名与其地址;而对于只声明未定义的函数,会记录其函数名,地址则为一个随机指向的地址。

2.链接

在链接的过程中,链接器会链接该项目下所有通过编译所生成的.o目标文件,同时链接链接库生成可执行程序。

在该过程中会:①合并段表;②符号表的合并与重定义。具体则是将每一个目标文件中的符号表进行合并,相同的符号名会给予一个正确的地址,所以此时如果对于一个函数没有定义只有声明,便会报告链接错误。

三、程序的运行环境

程序运行必须载入内存中,程序开始执行后调用main函数,然后执行代码直至终止程序。终止程序可能是main函数正常终止,也有可能是意外终止。

相关推荐
水木流年追梦9 小时前
大模型入门-应用篇3-Agent智能体
开发语言·python·算法·leetcode·正则表达式
凯瑟琳.奥古斯特9 小时前
假脱机技术原理详解
开发语言·职场和发展
敲代码的瓦龙10 小时前
Java?枚举!!!
java·开发语言
NiceCloud喜云10 小时前
IntelliJ IDEA 保姆级安装 + ClaudeAPI 配置教程
java·开发语言·前端·ide·chrome·docker·intellij-idea
3D探路人11 小时前
模灵 大模型聚合API 转发流程技术实现
java·大数据·开发语言·前端·人工智能·计算机视觉
l1t11 小时前
JIT执行python脚本的工具codon安装和测试
开发语言·python
程似锦吖11 小时前
无中生有 之 从0开始写一个动态定时任务管理
java·开发语言
坚果派·白晓明12 小时前
【鸿蒙PC三方库移植适配框架解读系列】第五篇:完整流程图与角色职责
c语言·c++·华为·harmonyos·鸿蒙
Dxy123931021612 小时前
Python 去除 HTML 标签获取纯文本
开发语言·python·html
洛的地理研学12 小时前
Python下载并处理MOD13A3植被指数数据
开发语言·python