【OS系列】程序是怎么一步步变成机器指令的?

news/2024/11/14 12:51:09/文章来源:https://www.cnblogs.com/o-O-oO/p/18373583

程序是怎么一步步变成机器指令的?
2024年08月22日 12:03 四川

以下文章来源于码农的荒岛求生 ,作者码农的荒岛求生

大家好,今天简单聊聊程序是怎么一步步变成机器指令的。
左边是我们写的代码,右边是CPU执行的机器指令:

想让CPU执行代码只需要简单的点击一下这个按钮:

可是你知道这个按钮的背后经历了哪些复杂的操作,你有没有想过代码是怎么一步步变成机器指令的❓
程序员编写的程序实际上就是一个字符串,必须得有个什么东西把字符串转变从机器指令,它的输入是字符串,输出是01二进制机器指令,这就是编译器。

编译器本身就是一个程序,把人类认识的程序转为CPU可以执行的机器指令。
假设有这样一段代码:

这实际上就是一个字符串,编译器要做的第一件事就是遍历字符串并把有意义的字符组合提取出来,忽略掉空格换行等字符。
这里每一个字符组合实际上都有类型,比如int 和main都是关键字,0和5都是数字等,因此还需要标注好类型,这一步就是所谓的提取token。

提取出token之后还需要知道这些token组合在一起的含义是什么。
接下来遍历所有token进行解析。
按照什么解析呢?答案是按照语法。

假设编译器接下来发现token是if,那么很显然,接下来会判定这是一个if语句,那么接下来就按照if语句的语法来解析。

编译器在按照语法解析时会生成一颗树,首先匹配的是if本身:

接下来是左括号:

括号之后是布尔表达式:

布尔表达式之后是右括号以及大的左括号。
接着是if内部的语句:

注意看,根据语法解析token后生成的这棵树就叫做抽象语法树:AST。
接下来,编译器遍历这颗抽象语法树并生成指令:

当然真正的编译器可能并不会在这里直接生成机器指令。
我们知道CPU只能执行一种类型的机器指令,x86处理器只能执行x86机器指令,arm处理器只能执行arm机器指令:

如果你发明了一种语言,为了适配不同的处理器自己需要针对每一种处理器编写相应的后端部分。

要是有一种工具能帮我们完成针对不同处理器的适配工作就好了,这就是LLVM,我们可以只生成针对LLVM的中间代码,由LLVM处理剩下的部分。

这就是生成中间代码的好处。
值得注意的是,编译器在生成指令时会进行优化,这个示例中变量a实际上没什么用处,编译器会注意到这一点并把针对变量a的赋值指令去掉。

得到汇编指令后编译器会最终将其转为CPU可以认知的二进制机器指令,每个源文件被编译后都会生成一个目标文件,目标文件中就是转换后的二进制机器指令。

最后,链接器会把目标文件打包成最终的可执行程序,

原创 涛哥聊Python

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米电视主页导航栏修改啦

小米电视导航栏可以修改啦,终于不再杂乱无章了。 步骤一:点击我的,拉到最下方,导航管理步骤二:进入导航管理后,按遥控器OK键,就可以移动了。OK 键 按遥控器菜单键,就可以删除或者添加了。菜单键 就是这么简单,赶紧去试试吧版权申明本文由:二萌生活发布,如需转载请注…

安装MySQL报错ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

今天要在本地装个mysql,发现mysql-5.7.19-winx64版总是报错由于找不到MSVCP120.dll,无法继续执行代码。重新安装程序可能会解决此问题。,去微软官网找到了最新的Visual C++ Redistributable for Visual Studio,下载后发现还是不停地报错。怀疑是系统不兼容,没办法只好安装m…

Centos scp 免密传输文件

mkdir -p ~/.ssh 1、在 A 服务器上,进入.ssh 目录; [root@iZam205rbu8s7yra2fop0nZ ~]# cd ~/.ssh/2、在 A 服务器上面的.ssh 目录下生成密钥; [root@iZam205rbu8s7yra2fop0nZ .ssh]# ssh-keygen -t rsa 生成两个密钥,一个是私钥,一个是公钥;3、在 B 服务器上创建.ssh 文…

mysql57小版本升级操作指南

1. 关停 注意要使用 慢速关闭mysql,这样InnoDB在关闭之前执行完整的清除和更改缓冲区合并。 登录到mysql中 执行 mysql> SET GLOBAL innodb_fast_shutdown=0; mysql> shutdown;2. 备份 注:备份数据目录和应用程序,注意mysql的属主属组 数据目录查找方式: MySQL 的数据…

MySQL 亿级数据平滑迁移实战

本文介绍了一次 MySQL 数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。作者:来自 vivo 互联网服务器团队- Li Gang本文介绍了一次 MySQL 数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。 一、背景 预约业务是 vivo…

星尘智能发布AI机器人助理Astribot S1

原文链接:https://mp.weixin.qq.com/s/P26zhHzmuqe0M2TDTLRlvg星尘智能很高兴正式发布 AI 机器人助理—— Astribot S1 我们精心打磨了 S1 背后的技术与产品细节, 希望它为你而生,为你而智(Naturally Yours)。星尘智能 S1 产品视频请看:https://www.bilibili.com/video/B…

再谈《Visual Studio中编写x64汇编的具体方法》

很久以前,写了一篇 《VS2010中编写x64汇编的具体方法》 当时也没有太深入研究,只是粗粗的实现了功能而已。后来看了微软官方文档,才发现有更简单更合理的设置方法。 微软原文如下: MASM for x64 (ml64.exe) | Microsoft Learn将汇编程序语言文件添加到 Visual Studio C++ 项…

Linux安装JDK两种方式详细教程(附图)

Linux安装JDK详细教程(图文教程)这里介绍两种方式:yum安装方式和手动安装1、yum安装1.1 查看JDK版本,找到你想要安装的JDK版本,这里以 JDK1.8 为例输入命令:yum -y list java*1.2 安装JDK1.8输入命令:yum install -y java-1.8.0-openjdk.x86_64出现Complete!安装完成。…

我的新项目又来咯!

这次的项目周期计划 1 个月左右,争取带大家快速搞定,能够作为秋招时简历上的亮眼项目~大家好,我是鱼皮,今天分享个我的新项目公开课预告~ 今晚(8 月 22 号)晚 20 点 ,我会继续在 B 站和抖音《程序员鱼皮》账号 直播新项目,依然是从 0 到 1 全程直播开发! 这次的项目周…

【日记】好想换电脑(634 字)

正文最近连着发了好多高温橙色预警,就算坐在行内都能感觉到明显的闷热。每次写日记想一想今天都做了些什么,总是觉得什么也没做。上班之后感觉生活十分枯燥。明明学生时代有那么多的事情可以写。昨天涩得太晚了,2 点钟才睡。今天有些睡眠不足。也因此中午睡了一个好觉。明明…

Java学习笔记2(数据库的三大范式)

什么是范式?范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。 最常用的三大范式第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列) ps:举个例子,地址列山东省青岛市市北区,可以这样存储,但是实际上不满足第一范式,…

Unity跳过闪屏页

github上一段代码,跳过Unity Logo启动屏: github链接: https://github.com/psygames/UnitySkipSplash/blob/main/SkipSplash.cs Unity API文档,Unity暴露了SplashScreen.Stop() 停止启动屏的API只需要写个静态方法,使用[RuntimeInitializeOnLoadMethod(RuntimeInitializeL…