深入理解 代码的翻译阶段——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为后缀的的可执行程序

相关文章
|
编译器 C++ 开发者
【C/ C++链接】深入C/C++链接:从基础到高级应用(一)
【C/ C++链接】深入C/C++链接:从基础到高级应用
325 0
|
Java 测试技术 Android开发
Junit - 期望异常测试(Expected Test)
Junit - 期望异常测试(Expected Test)
1493 0
|
传感器 网络协议 物联网
华为鸿蒙OS尖刀武器之分布式软总线技术
华为鸿蒙OS尖刀武器之分布式软总线技术
华为鸿蒙OS尖刀武器之分布式软总线技术
|
消息中间件 存储 算法
深入了解Kafka的数据持久化机制
深入了解Kafka的数据持久化机制
879 0
|
10月前
|
传感器 算法
基于波特图的控制系统设计算法
波特图(Bode Plot)是一种用于描述线性控制系统频率响应的图形表示方法,通常用于分析和设计控制系统。它以控制系统的传递函数(或频域传递函数)为基础,将系统的幅频特性(振幅-频率响应)和相频特性(相位-频率响应)以图形的方式展示出来。可以根据波特图理解和评估系统的稳定性、性能和鲁棒性。 波特图可以指导控制器的设计。通过调整控制器的参数,可以改变系统的频率响应,以满足特定的性能要求。波特图提供了反馈信息,帮助选择合适的控制器类型和参数,以达到期望的控制效果。本文使用串联超前校正、串联滞后校正、滞后-超前校正及PID校正,进行控制器的设计。 三频段理论: 频率法串联校正 控制系统串联校
176 4
|
11月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
425 1
|
10月前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下文件数量是常见的需求。本文介绍了四种方法:使用 `ls` 和 `wc` 组合、`find` 命令、`tree` 命令以及编程实现(如 Python)。每种方法都附有详细说明和示例,适合不同水平的用户学习和使用。掌握这些技巧,可以有效提升系统管理和日常使用的效率。
3524 6
|
算法 安全 UED
深入理解操作系统的虚拟内存管理机制
【7月更文挑战第2天】在现代计算机系统设计中,虚拟内存是实现内存管理高效、安全和可扩展的关键技术。本文将深入探讨虚拟内存的管理机制,包括分页技术、内存分配策略以及页面替换算法等核心概念。通过分析虚拟内存如何优化物理内存的使用,提高系统的运行效率,并讨论其在实际操作系统中的应用和面临的挑战,旨在为读者提供对虚拟内存管理机制的全面理解。
|
网络架构
【专栏】网络拓扑是现代通信系统设计的关键,影响网络结构、性能和可扩展性
【4月更文挑战第28天】网络拓扑是现代通信系统设计的关键,影响网络结构、性能和可扩展性。本文探讨了网络拓扑概念及主要类型,包括星形(易于配置,中心节点故障可能导致瘫痪)、总线形(简单低成本,但信号衰减和冲突)、环形(高流量处理,单点故障致网络中断)、网状(高冗余和可靠性,适用于高性能环境)和树形(层次结构,适合大型网络)。选择拓扑需考虑网络规模、成本、性能和实际环境。了解各种拓扑有助于构建高效稳定的网络。
630 1
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
1365 1