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

news2025/5/10 16:32:26

前言

大家在学习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/468122.html

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

相关文章

USB 转 4 串口芯片 CH9104

CH9104 是一款USB总线的转接芯片,支持最高6M波特率与硬件流控,支持USB配置功能,提供RS485方向控制与GPIO等信号引脚,可实现PC等平台扩展多串口或多个串口设备升级成USB口。CH9104实现 USB 转四个异步串口 UART0/1/2/3 功能&#x…

Docker 在Linux-CentOS上的安装使用

Linux CentOS 虚拟机安装及与windows远程登录_XiaoGuaiSs的博客-CSDN博客 一、如果安装过程有兼容问题,执行更新 yum 包(生产环境中此步操作需慎重) 注意​ yum -y update:升级所有包同时也升级软件和系统内核;​ …

计讯物联智能虫情测报系统,保障粮食安全的守卫者

计讯物联农业虫情监测系统 夏天是粮食作物生长关键期,也是农作物病虫害高发期。因此,预防农作物病虫害在生产过程中是至关重要的环节。作为智慧农业的先行者,计讯物联以预防为主、综合防治为设计理念,利用先进的现代光、电、数控技…

Android、Android Studio 和 Gradle 是如何使用 Java 的

目录 Java平台JRE虚拟机JDKAndroid Studio 如何使用 JavaGradle 如何使用 JavaAndroid Gradle 插件从命令行执行 Gradle 构建Android 设备上是如何使用 Java 的 可以肯定地说,每个人都知道 Android 使用 Java。然而,“使用 Java ”的含义范围相当大。因此…

ROS学习8:ROS机器人平台设计

【Autolabor初级教程】ROS机器人入门 1. 电机与电机驱动板 1.1 直流减速电机 电机主体通过输入轴与减速箱相连接,通过减速箱的减速效果,最终外端的输出轴会按照比例 (取决于减速箱减速比) 降低电机输入轴的转速,当然速度降低之后&#xff0…

effective c++ item35-39

item35:考虑虚函数的替代方案 NVI----Non-Virtual Interface 不使用虚函数接口,子类也可以实现按需求更改实现: The Strategy Pattern via Function Pointers 也可以使用函数指针 或者使用stl::function The “Classic” Strategy Pattern item…

手术麻醉信息管理系统源码,生成规范麻醉文书,自动信息采集

C#手麻系统源码,C# .net 桌面软件 C/S版手术麻醉信息管理系统源码 手术麻醉信息管理系统源码是专门为麻醉科和手术室开发的围手术期临床信息管理系统,具备以下功能: 1.规范手术流程管理:系统整合了手术室、麻醉科的工作及管理流程&#xff…

一则“孔乙己文学”,刺痛了多少学子的心?

个人主页:【😊个人主页】 孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。 文章目录 前言对待…

【C++技能树】再也不怕没有对象了 --初识类

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 目录 0. 初识类1.类的引入**在一个结构体里可以定义函数了:**定义一个Struct的时候再也不用写Struct了. 2.类的定义类的两种定义方式:成员…

05 【Sass语法介绍-插值】

1.前言 在很多编程器语言中都有插值这个概念,在 Sass 样式表的任何地方几乎都可以使用插值,你可以将这些包裹在 #{} 中来使用,所以记住在 Sass 中使用插值的方式是 #{} ,本节我们一起来看一下插值在 Sass 中的使用场景以及它的语…

Authing 入选《2022年度中国高科技高成长企业》榜单

​ 近日,Authing 入选【2022 年度中国高科技高成长企业系列榜单 】- 【云原生高成长企业榜】,该榜单由【第一新声】联合【天眼查】发起的“数字中国”系列之 2022 年度中国高科技高成长企业系列榜单发布,该榜单旨在发现和挖掘被资本市场关注&…

Sentinel介绍及搭建

分布式流量防护 服务雪崩 服务提供者不可用导致服务调用者也跟着不可用,以此类推引起整个链路中的所有微服务都不可用 分布式流量防护 在分布式系统中,服务之间的相互调用会生成分布式流量。如何通过组件进行流量防护,并有效控制流量&…

如何在 Mac 和 Windows 上恢复未保存或删除的 PDF

Adobe Acrobat PDF 是一种常用格式。我们可能会在不同的 PDF 编辑器中编辑和保存 PDF 文件。但是,如果不保存 PDF 文件或不小心将其删除,那将是一种令人不安的体验。 保持冷静!首先,尽可能多地停止运行应用程序,这样它…

( 哈希表) 217. 存在重复元素 ——【Leetcode每日一题】

❓217. 存在重复元素 难度:简单 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true…

工作7年的程序员,明白了如何正确的“卷“

背景 近两年,出台和落地的反垄断法,明确指出要防止资本无序扩张。 这也就导致现在的各大互联网公司,不能再去染指其他已有的传统行业,只能专注自己目前存量的这些业务。或者通过技术创新,开辟出新的行业。 但创新这…

go-zore入门,可能看这一篇就行了

本文主要内容 微服务框架对比goctl的安装和使用go-zore的api服务go-zore的rpc服务一探负载均衡的实现方法服务发现使用consul代替etcd实现服务发现中间件的实现相关代码已传送至gitee点击获取代码文中相关连接无跳转请点击查看原文 go微服务框架对比 参考文档 在 Go 语言中&…

AI | 浅谈AI技术以及其今后发展

文章概要 近期AI成为热点话题, GPT, new bing, bard,AI 绘画等 AI 编程工具引发大量讨论。请结合自身学习与工作经历,一起来聊聊你对AI技术以及其今后发展的看法吧。 🌟🌟🌟个人简介…

【VSCode】1、VSCode 如何连接服务器

文章目录 一、安装 remote-ssh 插件二、直接连接三、配置 SSH 公匙,免密登录 一、安装 remote-ssh 插件 点击插件搜索框,搜 remote-ssh,点击安装 安装完成后就会出现下面的图标: 二、直接连接 点击加号,输入 ssh 连接…

Web前端(更新中)

文章目录 什么是WEB前端HTMLHTML的简介运行环境和开发环境标签的语法结构页面的分类 常用标签head中常用标签body中的常用标签,特殊符号,语义化标签 什么是WEB前端 简单来说就是网页,由多种技术参与制作的,向用户展示的页面 技术…

Java 20和IntelliJ IDEA,一起让开发变得更轻松!

IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 相…