深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

news2024/11/30 4:50:06

1.前言

从一个高级语言到可执行程序,要经过预处理、编译,汇编和链接四个过程。大家可以思考下,为什么要有这样的过程?
在这里插入图片描述

我们学习计算机之处,就应该了解到,计算机能够识别的只有二进制语言(这是本身硬件特点决定的)。计算机刚诞生时,程序员写的就是二进制语言(机器语言),也就是0101的代码串。但机器语言的缺点也是非常明显的(和人类自然语言相差过大,难以理解,难以编写,难以维护)。

后来就发展出易于理解和编写的汇编语言,汇编语言是使用使用助记符和符号来代替机器码中的复杂二进制指令,提高了程序的可读性和可维护性,也降低了编写程序时的复杂程度。但汇编语言依然有其面临的问题,它依赖于硬件(不同CPU指令集不同,寄存器结构也不同),难以跨平台使用。比如如何把0101的机器码翻译成指令,这就与指令集有关。计算机组成原理这门课会将如何设计一个指令系统,感兴趣的请大家自行查阅资料。

基于汇编语言的一些问题,进一步诞生了高级语言,高级语言的特点是可读性更好,移植性也更好,更利于编写和维护。当然,其缺点就是高级语言无法并计算机直接执行,必须翻译成机器码后,才能被计算机执行。基于程序在执行之初,是否就要全部翻译,有编译型语言和解释型语言之分。自然,如python这样的解释型语言,代码是边解释成机器语言边执行,那么其效率自然低一些。与此相对,编译型语言因为在执行之初,就一次性把高级语言代码翻译成了计算机可以识别的机器码。那么其在执行时,花费的时间相对于解释型语言就少(相同的硬件环境下)。

2.翻译过程

言归正传,我们继续讲高级语言翻译成机器码的过程。前面已经提到从高级语言到机器码要经过四步。下面,我们对每一步做详细讲解。
在这里插入图片描述

1.预处理:

预处理之后,代码仍然是高级语言。预处理做了哪些东西呢? 头文件展开(这个过程中会检查头文件循环依赖)
宏替换(宏的本质是文本替换,所以这也是大家看到为什么一些程序员会把定义的宏值用括号给括上)
条件宏(根据预先设定的条件,决定后续编译哪些代码) 版本宏(和条件宏本质一样,只不过常用于隔离不同版本的代码)

……
2.编译过程:.i -> .s

编译过程就是把高级语言程序翻译成汇编语言。 .s文件里面就是汇编指令。这个编译是要经过词法分析和语法分析,具体请看 编译原理相关书籍。
编译器会把每个源文件都编译生成对应的.s文件,也会生成相应的符号表,存储在.s文件中。比如,一个函数修饰成inline了,并且编译器也根据用户建议把该函数给内联了,那么在符号表中是找不到该函数名的。内联的本质不是函数调用,而是把对应的代码嵌入到程序中,是函数展开。

3.汇编过程:.s->.o

.o文件里面已经二进制文件了,它还需经链接才能最终生成可执行文件 o文件叫可重定位目标文件,它是以地址零为链接起始地址进行链接的。
编译器将函数编译成二进制指令后,是从地址零可以将函数的指令序列存放到代码段。每个函数的入口地址都是从地址零开始往后偏移。

4.链接:

链接器将各个目标文件组装到一起,需要重新修改 各个目标文件中的变量或函数的地址,这个过程就是重定位。 链接器怎么知道 .o 重定位目标文件中
哪些函数或变量需要重定位呢?.o文件中实际是把需要重定位的符号手机起来,以section的形式保存到每个可重定位目标文件中了。

3 程序加载过程

最后讲一下,一个可执行文件被装载到内存,待执行的过程。大体分为以下几步:

1.给进程分配虚拟内存空间
2.创建虚拟地址到物理地址的映射,创建页表
3.加载代码段和数据段等数据,即将磁盘中的文件拷贝到物理内存中,并在页表中写入映射关系。
4.将可执行文件的入口地址写入到CPU的指令寄存器PC(PC中存放的就是下一步要执行的指令的地址)

在这里插入图片描述
图引用自 CSDN @汐 风

在这里插入图片描述
图引用自 CSDN @ Rye

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

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

相关文章

Gitee markdown 使用方法(持续更新)

IPKISS 获取仿真器件的名称 引言正文标题换行第一种------在行末尾手动键入两个空格第二种------额外换行一次,即两行中间留一个空行 缩进与反缩进代码块行内代码添加图片添加超链接 加粗,倾斜,加粗倾斜 引言 有些保密性的文件或者教程&…

Element UI 打包探索【1】

目录 第一个命令 第二个命令 node build/bin/iconInit.js node build/bin/build-entry.js node build/bin/i18n.js node build/bin/version.js 总结 最近在接触组件库的项目,所以特意拿来Element UI借鉴学习一下,它算是做前端的同学们离不开的一…

关于IDE的相关知识之一【使用技巧】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide使用技巧的相关内容! 关于…

【C语言】字符串字面量的特殊性

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯字符串字面量的定义和存储位置💯字符串字面量的不可修改性💯字符数组与字符串字面量的区别字符数组的定义和可修改性指针与数组的区别 &#x1…

linux(redhat8)如何安装mysql8.0之rpmtar双版本(最新版)(内网)(离线)

一.环境 系统版本:Red Hat 8.5.0-20 Java环境:build 1.8.0_181-b13 MYSQL:8.x版本 二、查看内核版本 #查看内核版本,根据内核版本下载对应的安装包 cat /proc/version 三、安装方式 一、rpm包方式 一、下载安装包 1. 登录网…

Python 中 if __name__ == ‘__main__‘ 有什么作用 ?

Python 以其简单性和可读性而闻名,但是它包含了一小段代码 :if name ‘main’: 经常让新手感到困惑。 理解 name 属性 为了理解 if name ‘main’: 的重要性,我们首先需要理解 name 在 Python 中的含义。Python 中的每个模块都有一个名为…

djinn:1 靶场学习小记

一、测试环境: kail攻击机:Get Kali | Kali Linux 靶场镜像:https://download.vulnhub.com/djinn/djinn.ova 描述: 该机器与 VirtualBox 和 VMWare 兼容。DHCP 将自动分配一个 IP。您将在登录屏幕上看到 IP。您必须找到并读取分…

外卖点餐系统小程序

目录 开发前准备 项目展示项目分析项目初始化封装网络请求 任务1 商家首页 任务分析焦点图切换中间区域单击跳转到菜单列表底部商品展示 任务2 菜单列表 任务分析折扣信息区设计菜单列表布局请求数据实现菜单栏联动单品列表功能 任务3 购物车 任务分析设计底部购物车区域添加商…

内网不出网上线cs

一:本地正向代理目标 如下,本地(10.211.55.2)挂好了基于 reGeorg 的 http 正向代理。代理为: Socks5 10.211.55.2 1080python2 reGeorgSocksProxy.py -l 0.0.0.0 -p 1080 -u http://10.211.55.3:8080/shiro/tunnel.jsp 二:虚拟机配置proxifer 我们是…

ThinkPHP Nginx 重写配置

目录 NGINX 重写 Admin项目隐藏入口文件,且禁用Admin模块&Admin.php 1️⃣配置仅用模块 2️⃣新增admin_xyz.php文件(自定义入口文件名),并绑定admin模块 3️⃣配置nginx 重写规则 NGINX 重写 在Nginx低版本中&#xff0…

宠物电商对接美团闪购:实现快速配送与用户增值

随着宠物行业的快速发展,宠物电商市场也在不断扩张。消费者的需求不再局限于传统的线上购物模式,越来越多的人开始追求更快捷的配送服务和更优质的购物体验。为了适应这一趋势,许多宠物电商平台开始寻求与本地配送平台合作,以提供…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

Vue使用Mockjs插件实现模拟数据

官方文档:Mock.js 一.引言 在前端开发过程中,我们经常会遇到后端接口尚未完成,但前端需要进行页面构建和功能测试的情况。这时候,Mockjs就如同救星一般出现了。Mockjs 是一款能够模拟生成随机数据,拦截 Ajax 请求并返…

Liinux——进程间通信之共享内存与信号量

进程间通信之共享内存与信号量 System V进程间通信 system V 进程通信是一组在 Unix 和类 Unix 系统中用于进程间通信的机制,主要三种方式:共享内存、消息队列与信号量 今天我们一起来对共享内存进行详细的学习,并了解信号量的基本概念 1.…

阿里发布 EchoMimicV2 :从数字脸扩展到数字人 可以通过图片+音频生成半身动画视频

EchoMimicV2 是由阿里蚂蚁集团推出的开源数字人项目,旨在生成高质量的数字人半身动画视频。以下是该项目的简介: 主要功能: 音频驱动的动画生成:EchoMimicV2 能够使用音频剪辑驱动人物的面部表情和身体动作,实现音频与…

node.js nvm 安装和使用

个人笔记记录。 参考文档:https://blog.csdn.net/weixin_45811256/article/details/130860444 1、下载nvm-setup.exe 安装程序 2、将本地的node卸载,然后点击进行安装。 3、安装 node.js 方法一: 去nodejs官网搜索历史版本,找…

js:函数

函数 函数:实现抽取封装,执行特定任务的代码块,方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词,如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参,实际上写的数据叫实…

【大模型】基于LLaMA-Factory的模型高效微调

LLaMA-Factory项目介绍 LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调,框架特性包…

论文笔记 SliceGPT: Compress Large Language Models By Deleting Rows And Columns

欲买桂花同载酒,终不似,少年游。 数学知识 秩: 矩阵中最大线性无关的行/列向量数。行秩与列秩相等。 线性无关:对于N个向量而言,如果任取一个向量 v \textbf{v} v,不能被剩下的N-1个向量通过线性组合的方式…

hadoop_zookeeper详解

Zookeeper秒懂 工作机制特点数据结构应用场景安装选举机制初始化启动无法和Leader保持连接 节点类型监听器原理写数据流程Paxos算法算法流程 客户端命令 Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。 工作机制 Zookeeper是一个基于观察…