首页 > 编程语言 >【OS系列】程序是怎么一步步变成机器指令的?

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

时间:2024-08-22 13:26:33浏览次数:10  
标签:一步步 token 生成 语法 编译器 OS CPU 机器指令

程序是怎么一步步变成机器指令的?
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

标签:一步步,token,生成,语法,编译器,OS,CPU,机器指令
From: https://www.cnblogs.com/o-O-oO/p/18373583

相关文章

  • 安装MySQL报错ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3
    今天要在本地装个mysql,发现mysql-5.7.19-winx64版总是报错由于找不到MSVCP120.dll,无法继续执行代码。重新安装程序可能会解决此问题。,去微软官网找到了最新的VisualC++RedistributableforVisualStudio,下载后发现还是不停地报错。怀疑是系统不兼容,没办法只好安装mysql-8.0.37......
  • Centos scp 免密传输文件
    mkdir-p~/.ssh1、在A服务器上,进入.ssh目录;[root@iZam205rbu8s7yra2fop0nZ~]#cd~/.ssh/2、在A服务器上面的.ssh目录下生成密钥;[[email protected]]#ssh-keygen-trsa生成两个密钥,一个是私钥,一个是公钥;3、在B服务器上创建.ssh文件夹mkd......
  • UCOSII移植
    1.准备一个裸机基础工程2.新建UCOSII文件夹CFG文件CORE文件PORT文件添加工程    SYS文件.c#include"sys.h"// //本程序只供学习使用,未经作者许可,不得用于其它任何用途//ALIENTEKMiniSTM32开发板//系统中断分组设置化 //正点原子@ALIENTEK/......
  • SQL_Postgresql-一些扩展和应用
    数据库数据库上托应用,下连基础设施,是整个IT系统中,承上启下最为关键的一环PostgresqlPG以C语言写成,因此其内部公开的接口(无论是FDW的回调函数接口还是供FDW使用的内部接口)都是面向C语言设计的,时空地理分布式,时序文档超融合PostgreSQL把锁分为三类,table-leve......
  • Postman断言写法以及脚本pm对象
    pm对象pm对象包含与正在执行的脚本有关的所有信息,并允许访问正在发送的请求的副本或接受到的响应,它还允许获取和设置环境变量和全局变量pm.info对象pm.info对象包含与正在执行的脚本有关的信息,如请求名称、请求ID和迭计数等有用信息储存在该对象中方法描述pm.info.e......
  • 简单的mail发送邮件里面的更多东西-postfix-exim MTA试验以及linux下使用mail发送邮件
    一、简单的mail发送邮件里面的更多东西-postfix-eximMTA试验   publish:September27,2018-Thursdaymail发送邮件应该是一个常用的东西,但是从简单的东西切入,也许你会有更多的收获。今天再看了看mail发邮件的东西,真的一个很小的知识点但要弄透不下功夫真的是不行的。......
  • centos7安装Kafka单节点环境部署一-ZooKeeper安装与配置
    由于Kafka运行需要zookeeper配合,zookeeper需要运行在JVM上,所以需要安装JDK,zookeeper。Kafka从2.0.0版本开始就不再支持JDK7及以下版本,就以CentOS764位JDK8为例1、下载ZooKeeperwgethttps://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.ta......
  • FreeRTOS 快速入门(五)之信号量
    目录一、信号量的特性1、信号量跟队列的对比2、两种信号量的对比二、信号量1、二值信号量1.1二值信号量用于同步1.2二值信号量用于互斥2、计数信号量三、信号量函数1、创建2、删除3、give/take一、信号量的特性信号量(Semaphore)是一种实现任务间通信的机制,可以......
  • 常见Dos命令
    快捷键任务管理器ctr+shift+esc切换窗口win+tab复制ctr+c粘贴ctr+v剪切ctr+x前进ctr+y回退ctr+z保存ctr+s打开CMD开始菜单(可使用管理员权限运行)ctr+Rcmd任意文件夹打开命令行(powershell==命令行)在文件夹上方的地址栏前加cmd......
  • 【原创软件】第10期:PDFCrossMergeV1.0-实现两个PDF交叉合并,适用于PDF扫描件合并,单文件
    解决问题:扫描件合并,由于大部分扫描件是正面一个pdf,反面一个pdf,尤其是正面顺序,反面逆序的pdf,需要交叉合并,也就是说适合单面扫描文件合并。即解决【正面顺序,反面逆序】文件A,扫描文件页码顺序:1、3、5、7、9。文件B,扫描文件页码顺序:10、8、6、4、2。这种合并问题。合并结果是1、2、3......