深入理解 代码的翻译阶段——C

简介: 深入理解 代码的翻译阶段——C

“了解一门语言的最基础知识,不如敲代码有趣,但是,不知道语言的基础知识会使你在敲代码时缺少乐趣”

这里是目录

前言

本章介绍程序的翻译和执行,也就是代码在执行前做了些什么。是学习C和C++的基础。

环境

ANSIC:ANSIC是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。


在ANSIC的任何一种实现中,存在两种不同的环境:


本篇主要大的方面主要介绍C语言的 翻译 和 执行 环境

1.翻译环境 :在这个环境中,C源代码被转换为可执行的机器指令(指令也就是一串二进制数字)。

2.执行环境:它用于实际执行代码。

一、翻译环境

翻译环境做了什么事?

一句话可以概括为:由多个源文件组成的.C程序,经过预编译、编译、汇编、链接等阶段会生成最终的 (.exe)可执行程序

具体做了什么事如下。


1.编译

编译阶段做了什么事?

一句话概括:由多个源文件组成的.C程序 各自经过 编译器生成.obj为后缀的目标文件

具体如下。(是不是感觉这话很在哪见过,这句话和递归似的哈哈)

(1).预编译

预编译也叫做预处理,预处理阶段做了什么事情?

一句话概括:预处理阶段只会处理以#开头的语句。例如#include,#define

具体如下


1.展开头文件。比如展开#include的800多行代码

2.处理条件编译指令。把该屏蔽代码的都屏蔽掉了

3.宏定义的替换。比如替换#define定义的宏。

4.删除注释。因为注释是给程序员看的,机器不需要看。


这样就会产生一个和 只是在内容上和之前有所不同的文件。功能上实际不变。


(2).编译

什么是编译?

一句话概括:将预处理完的文件经过一系列处理产生相应的汇编代码文件

具体如下

1.语法分析。

2.词法分析。

3.语义分析。

4.符号汇总(重点):符号汇总,符号指的是已经声明的函数的名字,例如Add,main等函数名。编译器将这些符号汇总下来记录下来,以便于后面链接时根据函数名符号找函数的定义。


总结:编译是针对单个文件编译的,只校验本文件的语法是否有问题和 汇总符号,不负责寻找函数的定义。


编译完成后生成了 汇编代码。


(3).汇编

汇编发生了什么事情?


一句话概括:就是把汇编代码转化为由0和1组成的二进制指令并 生成了符号表


符号表:就是将上一个编译阶段 汇总的 符号形成一个符号表格

符号表中显示的 是: 函数名 和 函数的地址的一一对应的关系。


此阶段结束后生成了以.obj为后缀的目标文件。就此编译阶段到此结束。


2.链接

链接阶段发生了什么事?

一句话概括:通过链接器将一个个**目标文件(或许还会有库文件)**链接在一起生成一个完整的可执行程序。


所以链接程序的主要工作就是将有关的目标文件彼此相连接。

解释:就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。


结论: 所以在链接阶段会发现被调用的函数未被定义。


注意:链接阶段只会链接调用了的函数/全局变量,如果存在一个不存在实体的声明(函数声明、全局变量的外部声明),但没有被调用,依然是可以正常编译执行的。

总结

再回过头来看看翻译阶段做了什么事情?

翻译阶段

1.就是将一个程序的每个源文件(有可能有多个源文件)通过编译器分别转为**.obj的目标代码**。

2.然后各个目标文件C函数库中和程序员的个人程序库链接器(linker) 捆绑在一起,形成一个单一而完整的 以.exe为后缀的的可执行程序

相关文章
|
5月前
|
Java 关系型数据库 MySQL
Java项目实战(图书管理系统)
本项目为简易图书管理系统,实现图书增删改查、用户借阅归还及基础用户管理功能。采用Java语言,结合MySQL数据库与MVC架构,涵盖JDBC、Servlet、JSP等技术,适合初学者学习Java Web开发流程与项目结构设计。
313 2
|
传感器 算法
基于波特图的控制系统设计算法
波特图(Bode Plot)是一种用于描述线性控制系统频率响应的图形表示方法,通常用于分析和设计控制系统。它以控制系统的传递函数(或频域传递函数)为基础,将系统的幅频特性(振幅-频率响应)和相频特性(相位-频率响应)以图形的方式展示出来。可以根据波特图理解和评估系统的稳定性、性能和鲁棒性。 波特图可以指导控制器的设计。通过调整控制器的参数,可以改变系统的频率响应,以满足特定的性能要求。波特图提供了反馈信息,帮助选择合适的控制器类型和参数,以达到期望的控制效果。本文使用串联超前校正、串联滞后校正、滞后-超前校正及PID校正,进行控制器的设计。 三频段理论: 频率法串联校正 控制系统串联校
224 4
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
609 1
|
编解码 前端开发 容器
CSS Flex布局实战案例:构建响应式卡片组件
【7月更文挑战第17天】通过上述步骤,我们成功地使用CSS Flex布局构建了一个响应式的卡片组件。Flexbox不仅简化了布局代码,还让我们能够轻松实现复杂的布局效果,如响应式设计。在实战中,掌握Flexbox将大大提高前端开发的效率和网页布局的质量。希望这个案例能够帮助你更好地理解和应用Flexbox布局。
|
机器学习/深度学习 人工智能 算法
人工智能(AI)中的数学基础
人工智能(AI)是一个多学科交叉的领域,它涉及到计算机科学、数学、逻辑学、心理学和工程学等多个学科。数学是人工智能发展的重要基础之一,为AI提供了理论支持和工具。
589 1
|
数据采集 人工智能 安全
ISO关于AI的监管政策
【1月更文挑战第20天】ISO关于AI的监管政策
534 2
ISO关于AI的监管政策
|
存储 安全 Java
Synchronized锁工作原理
Synchronized锁工作原理
|
网络安全
ssh 避免首次登录输入yes
ssh初次登录某个主机时,出现如下提示 Are you sure you want to continue connecting (yes/no)? 1 如何去掉? 打开/etc/ssh/ssh_config,修改以下配置项 StrictHostKey...
3056 0
|
前端开发 Java 应用服务中间件
Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)
Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)
268 0