当前位置: 首页 > news >正文

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

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

相关文章:

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

1.前言 从一个高级语言到可执行程序,要经过预处理、编译,汇编和链接四个过程。大家可以思考下,为什么要有这样的过程? 我们学习计算机之处,就应该了解到,计算机能够识别的只有二进制语言(这是…...

Linux开发者的CI/CD(11)jenkins变量

文章目录 1. **环境变量 (Environment Variables)**常见的环境变量:示例:2. **构建参数 (Build Parameters)**常见的构建参数类型:示例:3 **在 `stages` 块内定义局部变量**示例:使用 `script` 步骤定义局部变量4 变量引用陷阱在 Jenkins 中,变量是自动化流程中非常重要的…...

深度学习视频编解码开源项目介绍【持续更新】

DVC (Deep Video Compression) 介绍:DVC (Deep Video Compression) 是一个基于深度学习的视频压缩框架,它的目标是通过深度神经网络来提高视频编码的效率,并降低比特率,同时尽可能保持视频质量。DVC 是一个端到端的神经网络模型&…...

Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变

随着数字化设计的蓬勃发展,Canva作为一款备受欢迎的在线设计平台,面临着日益增长的用户生成内容挑战。每天,平台上新增的素材数量高达5000万,这对数据库系统提出了前所未有的要求。为了应对这一挑战,Canva决定对其数据…...

nacos常见面试题(2024)

nacos永久实例与临时实例区别 nacos实例有2种,分别为临时实例(一般业务服务是临时的)和永久实例(如mysql、redis这种运维服务需要实时看到状态的设置为永久实例)。 临时实例只会缓存到服务注册列表中,下线…...

68000汇编实战01-编程基础

文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…...

你的网站真的安全吗?如何防止网站被攻击?

你的网站被黑客攻击过,很可能不止一次! 这可不是危言耸听。微软最近发布了《2024 年微软数字防御报告》,报告中写到:“Windows 用户每天面临超过 6 亿次网络犯罪和国家级别的攻击,涵盖了从勒索软件到网络钓鱼再到身份…...

UE5 材质编辑器CheapContrast 节点

在 Unreal Engine 材质编辑器中,CheapContrast 节点是一个非常实用的节点,主要用于对图像或纹理的 对比度 进行调整,且执行效率较高,适合在性能要求较高的场景中使用。 CheapContrast 节点的作用 CheapContrast 节点通过调整输入…...

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材,也是一种社交方式,城市里门店不少,每家都有一定流量和老客,但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户,而消费者也对门…...

Java基础面试题08:Java中Exception和Error有什么区别?

在Java中,Exception 和 Error 是异常处理体系的两大核心概念。要理解它们的区别和应用,咱们可以逐步剖析。 Exception和Error的基础区别 共同点: 两者都继承自 Throwable 类,只有 Throwable 类型的实例才能被 throw 或 catch。 区…...

什么是axios?怎么使用axios封装Ajax?

学习目标 什么是axios怎么使用axios封装Ajax该如何使用Axios 封装 XHR 请求 什么是axios Axios 是一个基于 Promise 的 HTTP 客户端,它可以在浏览器和 Node.js 环境中使用。Axios 提供了简单易用的 API,用于执行各种 HTTP 请求操作,如 GET、P…...

Web前端学习_CSS盒子模型

content padding border margin <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS盒子模型</title><style></style> </head> <body> <div class"demo&quo…...

JAVA项目-------医院挂号系统

1&#xff0c;项目目的 1、科室管理&#xff1a;新增科室&#xff0c;删除科室&#xff08;如果有医生在&#xff0c;则不能删除该科室&#xff09;&#xff0c;修改科室。 2、医生管理&#xff1a;录入医生信息&#xff0c;以及科室信息。修改医生信息&#xff08;主要是修改…...

[工具分享] 根据Excel数据根据Word文档模板,批量创建生成Word文档并重命名,方便快速查找打印

前几天交楼的小姐姐要多份Word文档合同打印给客户&#xff0c;那么100份就需要修改100次 上面好多都是模板的制式文件&#xff0c;里面的部分数据都是要根据实际值来变动的&#xff0c; 那么有没有快速的方法来操作呢&#xff0c;还是只能一个个手动的改&#xff0c;又容易出…...

Redis的管道操作

在现代应用程序中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;被广泛用于缓存、消息队列、实时分析等场景。为了进一步提高Redis的性能&#xff0c;Redis提供了管道&#xff08;Pipeline&#xff09;操作&#xff0c;允许客户端将多个命令一次性发送到服务器&…...

IT监控 | Oracle云监控全解析

Oracle云(Oracle Cloud)是Oracle公司提供的云服务平台&#xff0c;涵盖了IaaS、PaaS、SaaS和DaaS&#xff0c;支持企业在云中构建、部署、集成和扩展应用&#xff0c;为企业提供了管理服务器、应用程序、存储、网络和数据中心的全面控制能力。 跟踪Oracle云基础设施的关键组件将…...

前端面试题-1(详解事件循环)

1.了解浏览器的进程模型 1.什么是进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 2.什么是线程&#xff1f…...

Redis(5):哨兵

一、作用和架构 1. 作用 在介绍哨兵之前&#xff0c;首先从宏观角度回顾一下Redis实现高可用相关的技术。它们包括&#xff1a;持久化、复制、哨兵和集群&#xff0c;其主要作用和解决的问题是&#xff1a; 1&#xff09;持久化&#xff1a;持久化是最简单的高可用方法(有时甚…...

【人工智能】Transformers之Pipeline(二十五):图片特征抽取(image-feature-extraction)

​​​​​​​ 目录 一、引言 二、图片特征抽取&#xff08;image-feature-extraction&#xff09; 2.1 概述 2.2 google/ViT 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pi…...

podman 源码 5.3.1编译

1. 构建环境 在麒麟V10服务器操作系统上构建&#xff1a;Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。由于只是编译 podman 源码&#xff0c;没必要特地在物理机或服务上安装一个这样的操作系统&#xff0c;故采用在虚拟机里验证。 2. 安装依赖 参考资料&#xf…...

矩阵重新排列——rot90函数

通过 r o t 90 rot90 rot90函数可以将矩阵进行旋转 用法&#xff1a; r o t 90 ( a , k ) rot90(a,k) rot90(a,k)将矩阵 a a a按逆时针方向旋转 k 9 0 ∘ k\times90^\circ k90∘...

Leetcode 51 N Queens Leetcode N Queens II

题意 给定一个数字 n n n&#xff0c;形成n*n的棋盘&#xff0c;棋盘上放n个皇后&#xff0c;确保皇后之间不会相互吃&#xff08;皇后可以直线吃&#xff0c;斜线吃&#xff09; 链接 https://leetcode.com/problems/n-queens/description/ 思考 这道题只能暴力枚举所有的…...

0.查找命令

目录 &#x1f349; find - 查找文件 &#x1f347; grep &#x1f353; which &#x1f348;locate 总结: &#x1f349; find - 查找文件 # 语法 # find [搜索范围] [选项] # 选项 # -name<查询方式> 按照指定的文件名查找模式查找文件 # …...

HarmonyOS-初级(一)

文章目录 初级核心技术理念函数的声明和使用类的声明和使用接口声明和使用声明式UI的特征 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月28日12点50分 初级 HAP可以分为静…...

Oracle 11gR2 坏块修复实例一则

背景 前段时间在 Oracle 11gR2 数据库中发现了坏块问题。环境是 64 位 Linux 平台。本文将详细介绍如何使用 DBMS_REPAIR 进行在线修复&#xff0c;当然也可以基于备份和 RMAN 的修复方法这里暂时不做介绍。 发现坏块 1. 从 alert.log 中发现错误 在 alert.log 文件中发现了…...

解决FinalShell 连接virtual box安装的Linux centos/7系统 一直让输入密码,输入什么密码都没用

问题描述&#xff1a; virtual box安装的Linux centos/7系统默认只允许ssh登录方式&#xff0c;需要配置允许账号密码登录 先登录root账号&#xff08;一定要是root&#xff09;&#xff1a;初始密码为vagrant su 修改ssh配置文件&#xff1a; vi /etc/ssh/sshd_config 修改…...

华为E9000刀箱(HWE9000V2)服务器硬件监控指标解读

随着数据中心规模的不断扩大&#xff0c;服务器的稳定性和可靠性变得尤为重要。华为E9000刀箱&#xff08;HWE9000V2&#xff09;作为一款高性能的服务器设备&#xff0c;其硬件状态的实时监控对于保障业务的连续性和系统的稳定运行至关重要。 监控易作为一款专业的IT基础设施监…...

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数&#xff1a; lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数&#xff1a; lambda 1&#xff09;语法&#xff1a; lambda arg1, arg2, …, argN : expression using arg 2&#xff09; lambda是一个表达式&#xff0c;而不是一个语…...

民安:助力提升城市安全水平

随着城市化进程的加速&#xff0c;平安城市的创建成为了社会治理的重要议题。为了解公众对平安城市创建的看法和评价&#xff0c;为提升城市安全水平提供参考&#xff0c;近期某市委托民安智库专业市场调查公司开展了一次安全感满意度调查。 本次调查围绕公共安全、个人安全、…...

Apache Zeppelin:一个基于Web的大数据可视化分析平台

今天给大家推荐一下 Apache Zeppelin&#xff0c;它是一个基于 Web 的交互式数据接入、数据分析、数据可视化以及协作文档 Notebook&#xff0c;类似于 Jupyter Notebook。 Apache Zeppelin 支持使用 SQL、Java、Scala、Python、R 等编程语言进行数据处理和分析&#xff0c;同时…...

东光有做网站的吗/网站百度关键词排名软件

Tomcat (1) —— Mac下配置Tomcat Https/SSL tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 参考来源: SSL/TLS Configuration HOW-TO 【高可用HA】Apache (2) —— Mac下安装多个Apache Tomcat实例 完美配置Tomcat的HTTPS 两步搞定 Tomcat 下启用 https:// 访问 tomcat下配…...

电子商务网站建设期末试题及答案/网站秒收录工具

设置192.168.67.232/231在21&#xff1a;30自动关机 1&#xff09;手动命令方式 &#xff03;shutdown -h 21:30 2&#xff09;计划任务方式&#xff0c;定时关机 1、 添加定时任务 [rootserver121 ~]#crontab -e 此时系统会打开一个vi编辑器。 点击i键进入编辑状态: 输入以下内…...

独立站怎么推广引流/农技推广

假设路径为/project/path/ 设定git仓库可以直接被远程推送(需要较新的git版本,比如2.7) cd /project/path git config receive.denyCurrentBranch updateInstead 设定本仓库被远程push之后的行为 cd .git/hooksecho -e #!/bin/bash\n/usr/local/openresty/nginx/sbin/nginx -p …...

村庄建设网站/体验营销理论

一、首先检查网页中的加载路径是否正确&#xff0c;如果和文件所在路径不一致&#xff0c;就把html改下路径 二、加载路径和文件实际路径一致&#xff0c;看下配置文件&#xff1a; STATIC_URL /static/STATIC_ROOT os.path.join(BASE_DIR, static) 如果还是无法加载&#xf…...

仙居做网站/seo零基础教学

0. PairRDD的意思PairRDD就是元素为键值对的List转化过来的RDD对象&#xff0c;例如rdd_1就是一般的非pairRDD&#xff0c;rdd_2为pairRDD对象&#xff0c;而有些SparkAPI操作是针对pairRDD对象的&#xff0c;例如后面将要介绍的mapValues()操作。1. partitionBy()函数 rdd.par…...

spring boot 网站开发/现在网络推广哪家好

​如今&#xff0c;大数据技术已渗透至电商、智慧城市、金融等社会各领域&#xff0c;审计行业也难以抵挡大数据时代的浪潮。 然而&#xff0c;在推动审计进行转型的过程中&#xff0c;“大数据审计”常常沦为“审计大数据”。许多审计部门在开发或运用审计信息系统时&#xf…...