计算机基础系列 —— 虚拟机代码翻译器(1)

“Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.” ―Linus Torvalds

文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。

课程的 Part I:

被抽象成一块 Hack 器件,Part II 的重点在软件部分,包括高级语言(Jack)、操作系统、编译器(Jack Compiler)和 虚拟机翻译器(VM translator)。

One tier VS Two tier

我们这篇文章来看 VM Code 和 VM Translator 的实现,后面的文章会看 Two tier 的高级语言 Jack 和 Jack 编译器。

VM Code

编译器把高级语言编译成 vmcode,而 vmcode 被设计成在堆栈结构机器(abstract stack machine)运行。

对于上面的数学计算,Stack 都可以通过 pop x y 然后 command x y (实现上不同的 command 用不同汇编语言实现,然后硬编码在 VM translator 里) 最后 push x y 的计算结果回到 stack,如下图:

Segments

我们现在知道了 vmcode 是如何计算的,但是高级语言里的计算结果是存储在不同的变量里的,所以我们还需要让 vmcode 也知道这些变量的种类。

所以 vmcode 有了 segment 的概念,不同的变量放在不同的 segment 里面,比如函数的参数放在 argument 段里,static 变量放在 static 段里,所以汇编器里的一些与定义符号其实对应的就是 vmcode 里不同的段,这些段都是虚拟的,实际上都在一块 RAM 里。

constant

比如程序里有一段 const int x = 17 17 就放在 constant segment 里,我们来看看 vmcode 如何把 17 放进 constant segment 里,以及对应的汇编代码,因为我们这节课实现的是 VM translator,生成 VM code 是后面我们要实现的 compiler 要做的事情。

上面的图展示了,push constant 17 (把 17 放到 stack machine 的 constant segment 里)的过程。但是注意,这里实际上没有一个 constant segment,因为 constant 的语义就是把一个常数放进 stack 里。

local | argument | this | that

这几个段虽然功能不同,但都可以用同样的方式操作,只是段的位置不一样,所以语义不同,但都可以用相同的伪代码表示(下面是 local 的图,其他不同之处把 LCL 替换成 ARG THIS THAT 即可,这些预定义符号代表段在 RAM 里的开始地址),pop segment i 的语义是:把最新 push 到 stack 里的值 pop 到对应 segment 里的 segment start address + i 位置供程序使用。push segment i 的语义是:把 segment 里的 segment start address + i 位置的值 push 到 stack 的 SP 位置供程序使用。

static

RAM[16] - RAM[255] 用来存放 static 变量

每个 filename.vm 文件的静态变量,存放在 RAM 里,相当于每个 vm 文件有一个虚拟的 segment,每个 segment 的名字是汇编语言里的标签 filename.i。

temp

temp 变量放在 RAM[5] - RAM[12],这里编译器生成 VM code 会用来存一些临时信息,后面的文章会介绍。

pointer

push/pop pointer 0 等于 push/pop THIS

push/pop pointer 1 等于 push/pop THAT

有了上面的这些信息,我们就可以编写代码,把这些 VM Code 翻译成汇编语言。

VM code 里还有分支和函数调用的概念,下篇文章,我们看如何把这些概念翻译成汇编语言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序中使用less

在vscode中安装插件 找到左下角齿轮的设置,点击右边图标,进入“settings.json” 加上以下代码配置 "less.compile":{"outExt": ".wxss"}

Charles抓包配置代理手机连接

Charles下载地址: Charles_100519.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Charles_100519.zip最新版正式版官方版绿色版下载,Charles_100519.zip安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com…

js用鼠标控制图片旋转任意角度-luckySheet

需求描述 最近有用户在使用luckySheet时,希望能够任意角度旋转图片,就像wps那样,wps如下图 wps的图片旋转 在网上只找到在canvas中进行旋转的库,没找到直接操作图片dom的库,决定直接写。 实现思路 1、点击时记录图片坐…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机(server) 路由匹配(location) 代理(proxy_pass) 正向代理 反向代理 负载均衡(upstream) 负载均衡策略 动静分…

数据分析之POWER Piovt的KPI设置

内容总结: 1.两个表格关联不上:需要添加辅助列,建立关联 2.添加辅助列后还关联不上:将虚线变为实线 3.根据需求要增加一些度量值 4.设置KPI后,绝对值选1后设定百分比 5.在透视表里面加入KPI状态 导入所关联的数据后建立…

关于Linux中的history命令

前言:本文内容为实操学习记录,不具有调研价值,仅供参考! 正文: 接触过Linux操作系统的朋友一般都知道history命令,直接输入history命令,会显示当前用户的历史输入记录。这个原理是linux会记录我…

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

深入理解指针(7)函数指针变量及函数数组(文章最后放置本文所有原码)

一、函数指针变量 什么是函数指针变量呢? 既然是指针变量,那么它指向的一定是地址,而且我们可以通过地址来调用函数的。 函数是否有地址呢?地址是什么? 经过上面的测试可以看到函数也是有地址的,而且其地…

如何准备科学海报

科学会议上的海报展示可以为早期职业研究人员提供宝贵的机会来练习他们的沟通技巧,获得有关他们研究的反馈,并扩大他们的网络。“通过与其他研究人员一对一地讨论我的工作,[我发现]我可以确定哪些工作做得好,哪些需要改进&#xf…

dnf手游:如何利用副本和任务快速积累泰拉财富?

DNF手游中,搬砖赚钱的方式多种多样,其中利用副本和任务是一种快速赚取泰拉的有效途径。本攻略将介绍如何通过参与副本和任务来获取泰拉,帮助玩家在游戏中获得更多的经济收益。 一、认识游戏中的泰拉 在DNF手游中,泰拉是一种主要的…

HarmonyOS 开发之应用/组件级配置

在开发应用时,需要配置应用的一些标签,例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的 app.json5配置文件 中配置bundleName标签,该标签用于标识应用…

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么?2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

每天五分钟深度学习:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

Oracle-MNIST代码学习

一、网络结构 二、代码学习 2.1、x = F.relu(self.conv1(x)) # self.conv1 = nn.Conv2d(1, 20, 5, 1) ​​​​​ 1)Conv2d 详解参考:PyTorch nn.Conv2d - 知乎 2) relu pytorch学习线性回归与非线性回归,以及理解nn.linear()和ReLU激活函数_pytorch 非线性函数作用-C…

访学博后须知|携带手机等电子产品入境美国注意事项

美国对携带手机等电子产品入境有着严格的规定,因此知识人网小编提醒拟出国做访问学者、博士后或联合培养的博士生了解以下注意事项,尽量减少不必要的麻烦。 随着互联网的普及,手机等电子产品在人民生活中占有不可或缺的地位。因为研究和工作需…

AcWing刷题-空调

空调 差分: N int(input()) p list(map(int, input().split())) t list(map(int, input().split())) d,s[0]*100010,[0]*100010 for i in range(N):d[i] p[i]-t[i]for i in range(N):s[i] d[i]s[i1] - d[i] ans 0 for i in range(N1):if s[i]>0:ans s[i]…

大话设计模式之代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介,客户端通过代理对象间接访问实际对象,从而可以在访问控制、缓存、延迟加载等方面提…

二维随机变量的条件分布-已知X概率密度,X条件下的Y概率密度求解y的概率密度

问题&#xff1a;设数X在区间(0,1)上随机地取值,当观察到Xx(0<x<1)时,数Y在区间(x,1)上随机地取值.求Y的概率密度f(y)&#xff1f; 求解&#xff1a; 首先&#xff0c;数X在区间(0,1)上均匀分布&#xff0c;因此其概率密度函数fX​(x)为&#xff1a; fX​(x)1 0<…

PLC_博图系列☞N:扫描操作数的信号下降沿

PLC_博图系列☞N&#xff1a;扫描操作数的信号下降沿 文章目录 PLC_博图系列☞N&#xff1a;扫描操作数的信号下降沿背景介绍N&#xff1a;扫描操作数的信号下降沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 N 背景介绍 这是一篇关于PLC编程的文章…