深入理解计算机系统1--理解编译器编译的过程

news2024/12/29 22:11:59

前言

大家在学习C语言的时候,相信对编译器这个词并不会感到陌生。我们也会知道编译器编译的过程是:预处理-》编译-》汇编-》链接。这篇文章主要介绍这四个过程中,编译器究竟做了那些工作,它是如何让一份高级程序转换成机器语言的,这个过程我觉得还是很有意思的。
强烈建议大家看一看《深入理解计算机系统》这本书。
本文参考资料《深入理解计算机系统》


一、数据在存储器中以什么方式存在?

我们在敲代码的时候,可以在显示屏上很清楚的看到每一个字符,但是机器也跟我们人类一样,是通过识别不同的字符来获取信息的吗?可以说是也可以说不是。
之所以这样说,是因为机器它的确是通过不同的字符组合获取信息的。但是在它的世界里,它读取到的信息跟我们看到的字符是不一样的,他们读取的信息是二进制信息–一种只有高低电平的电平信息,我们使用0/1来表示,1代表高电平,0代表低电平。
他们之所以能将字符信息转换成电平信息,是因为我们每一个字符,都是通过ASCLL码表表示的,每一个数字都代表一个字符,如下图所示:
在这里插入图片描述
例如这段代码,使用二进制表示如下图:
在这里插入图片描述
在这里插入图片描述
而二进制通过0和1能表示各进制数字,所以从字符转换成二进制数就有了对应,能准确转换。那么字符要真正转换成二进制数据,就需要通过编译器转换。

二、编译的过程

编译器的概念我还没有去了解,目前我的理解编译器就是一个转换的工具,感兴趣的朋友可以自行去进行更深入的了解,我这里只是讲一下编译的过程。
编译的过程如下:
预处理–>编译–>汇编–>链接

1.预处理

在我们的程序代码中,有不少命令是以#开头的,例如#define等。预处理阶段就是对这些命令进行处理。例如我们使用#define 进行宏定义,在预处理阶段就是把代码中的宏进行替换。例如我们使用#include包含头文件,在预处理阶段就是把被包含的头文件信息读取,并插入当前的.c文件中。这样我们就得到了另一个c程序,这个c程序太长以.i为结尾的文件扩展名。所以在预处里阶段完成后,编译器会输出一个.i为后缀的文件。

2.编译

编译就是将上面说的.i文件翻译成汇编语言,即使是不同的高级程序语言(c/c++等),都会在这个阶段被翻译成汇编语言。并输出一个以.s为后缀的文件扩展名。

3.汇编

在这个阶段就是将.s为结尾的汇编语言文件转换成二进制文件,并以.o结尾。

4.链接

这个阶段就是将被调用到的标准库的函数链接到二进制文件中。例如我们在代码中使用到里printf这个标准C库中的函数,这个函数实际存在于一个名为printf.o单独的预编译目标文件中,编译器就是在这个阶段让连接器将这个目标文件并入.o文件中,最终输出一份可执行文件。

总结

有错误的地方请及时指出,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[EDA]AMP®-Parkinson‘s Disease Progression Prediction

​ 翻译自:AMP - EDA Models 1.数据集观察 加载四个excel文件 import pandas as pd train_clinical_data pd.read_csv(input/train_clinical_data.csv) train_peptides pd.read_csv(input/train_peptides.csv) train_protiens pd.read_csv(input/train_prote…

蓝桥杯算法竞赛系列第四章——二分算法

欢迎回到:遇见蓝桥遇见你,不负代码不负卿! 目录 引入:二分查找 题目描述 题解 代码执行 复杂度分析 例题一:搜索插入位置 题目描述 题解 代码执行 复杂度分析 例题二:寻找峰值 题目描述 题解 …

【五一创作】python 基础系列篇:八、熟练掌握推导式

python 基础系列篇:八、熟练掌握推导式 推导式特殊的元组推导式 推导式机制玩转推导式小结 推导式 在python提供的各种语法糖中,老顾最青睐的就是这个推导式,他大大减少了代码的书写量。 比如一个正常的,生成长度为5的列表&…

红黑树的概念与实现

目录 ​一、红黑树的概念 1.什么是红黑树 2.红黑树满足的性质 3.红黑树存在的意义 二、红黑树的实现 1.类的构建 2.插入函数 (1)插入一个节点 (2)调整节点 (3)旋转 三、红黑树的检验 一、红黑树…

okio篇2-RealBufferedSource

上一篇讲过,okio只有两个概念,source和sink。source对应InputStream,即负责将数据读出,是一个输出方(所以只有source.read方法)。sink对应outputStream,负责获取数据写入,是一个写入…

RT-Thread Nano在keil Simulator中的仿真

目的:使用STM32CubeMX生成包含RT-Thread Nano内核和FinSH控制台的keil工程,在没有硬件开发板的情况下,通过keil Simulator来运行系统,并通过SHELL来与系统进行交互。 一、使用STM32CubeMX生成RT-Thread Nano工程 官方文档已经说…

C++标准库 -- 动态内存 (Primer C++ 第五版 · 阅读笔记)

C标准库 --动态内存 (Primer C 第五版 阅读笔记) 第12章 动态内存------(持续更新)12.1、动态内存与智能指针12.1.1、shared_ptr类12.1.2、直接管理内存12.1.3、shared_ptr和new结合使用12.1.4、智能指针和异常12.1.5、unique_ptr12.1.6、weak_ptr 12.2、动态数组1…

网络通信之网络层与数据链路层

文章目录 讲在前面网络层网络层概述IP协议格式网段划分公有IP、私有IP、特殊IP理解路由 数据链路层MAC地址以及MAC帧(以太网帧)MTU协议MTU对IP和TCP协议的影响ARP协议及其作用 涉及到的相关协议DNS协议(应用层)NAT与NAPT协议 总结…

BEV (0)---DETR

1 DETR 1.1 DETR处理流程 1.1.1 将图像输入给Backbone获得图像特征与位置编码 ①. 对给定的输入图像通过resnet进行特征提取,最终得到特征图C5∈RBx2048xhxw,其中h、w为输入图像尺寸得1/32。随后再用一层11卷积压缩一下通道,得到特征图P5∈RBx256xhxw。…

jvm调优策略

jvm调优主要是内存管理方面的调优,包括各个代的大小,GC策略等。 代大小调优 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物…

数据结构学习记录——什么是堆(优先队列、堆的概念、最大堆最小堆、优先队列的完全二叉树表示、堆的特性、堆的抽象数据类型描述)

目录 优先队列 若采用数组或链表实现优先队列 数组 链表 有序数组 有序链表 总结 若采用二叉搜索树来实现优先队列 最大堆 堆的概念 优先队列的完全二叉树表示 堆的两个特性 结构性 有序性 【例】最大堆和最小堆 【例】不是堆 堆的抽象数据类型描述 优先队列…

安排超市 -- BFS分割搜索

4.安排超市 给定一个n*n的地图。地图是上下左右四联通的,不能斜向行走: *代表障碍,不可通行。 .代表路,可以通行。 #代表房子。房子也是可以通行的。 小红现在需要在一些地方安排一些超市(不能安排在障碍物上&#xf…

山东专升本计算机第七章-计算机网络基础

计算机网络基础 计算机网络系统 考点 6 计算机网络硬件 主体设备 • 称为主机 • 一般可分为中心站(又称服务器)和工作站(客户机) 连接设备 • 网卡 • 工作在数据链路层 • 网卡又称网络适配器,是连接主机和网…

【C++初阶】引用

一.概念 引用就是取别名,在语法上它不会开空间,而是和它引用的变量共用同一块空间。对引用的操作也就是对原来变量的操作。就像现实生活中给人取外号一样,不管是喊外号还是本名,指的都是那个人。 二.引用特性 1.引用类型必须和引用…

Java8 新特性讲解

一、Lambda表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 二、函数式接口 &#…

【网课平台】Day15.Devops:持续集成与持续交付

文章目录 一、Devops1、什么是Devops2、什么是CI/CD3、Devops方案参考 二、人工部署1、项目打jar包2、生成镜像、创建容器 三、自动化部署1、代码提交到git2、修改pom.xml文件3、前端部署 一、Devops 1、什么是Devops 一个软件的生命周期包括:需求分析阶、设计、开…

SpringCloud:ElasticSearch之集群

单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点单点故障问题:将分片数据在不同节…

【原创】运维的终点是开发~chatGPT告诉你真相

文章目录 软件技术岗位鄙视链,你在哪层呢?让chatGPT告诉你运维工作好,还是开发工作好问它几个问题1. 一个三年运维成长的案例和薪资2. 一个三年开发成长的案例和薪资3. 一个五年运维成长的案例和薪资4. 一个五年开发成长的案例和薪资5. 一个十…

云分析迁移:顺应需求

云提供了对新分析功能、工具和生态系统的访问,可以快速利用这些功能、工具和生态系统来测试、试点和推出新产品。然而,尽管迫在眉睫,但企业在将分析迁移到云时仍感到担忧。组织正在寻找能够帮助他们分配资源和集成业务流程的服务提供商&#…

Linux 服务器上安装和使用 Redis,只需这 4 步!

一、使用 yum 安装 Redis 使用以下命令,直接将 redis 安装到 linux 服务器: yum -y install redis 二、配置远程连接 a)首先第一步,将 redis 配置文件下载到本地(如果你熟悉 vim 操作,直接用 vim 编辑即可…