计算机基础系列 —— 虚拟机代码翻译器(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 里还有分支和函数调用的概念,下篇文章,我们看如何把这些概念翻译成汇编语言。

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

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

相关文章

Linux基础 超详细!!!

一、Linux基础命令 (一)Linux的目录结构 1、盘符 Linux中无盘符的概念,只有一个根目录 “/” 也就是只有一棵树) 而windows里面有多棵树,每个盘符都是一棵树的根 在Linux系统中,路径之间的层级关系,使用…

Flutter 使用 AndroidStudio 给(Android 安卓)进行签名方法

一、使用 AndroidStudio 创建签名 使用 AndroidStudio 打开 Flutter项目中的 android 文件夹首次打开 AndroidStudio 会加载一会。菜单栏 : Build -> Generate Signed Bundle APK... 选中 APK -> Next点击Create new....下面按照需求填写即可- 文件夹选择 项…

容器二(List接口)

目录 List 特点和常用方法 List 的常用方法: 两个 List 之间的元素处理 List 中操作索引的常用方法 List是指“有顺序、可重复”的容器。 List接口是Collection接口的子接口,因此Collection 接口中的方法 List 接口都拥有;同时&#xff0…

论文笔记:TALK LIKE A GRAPH: ENCODING GRAPHS FORLARGE LANGUAGE MODELS

ICLR 2024,reviewer评分 6666 1 intro 1.1 背景 当下LLM的限制 限制1:对非结构化文本的依赖 ——>模型有时会错过明显的逻辑推理或产生错误的结论限制2:LLMs本质上受到它们训练时间的限制,将“最新”信息纳入到不断变化的世…

如何注册谷歌邮箱gmail

不知道大家在工作生活中有没有需要用到谷歌邮箱的地方,但是最近我就用到了它。因为注册ChatGPT的事,用了outlook,hotmail邮箱注册的gpt账号都被封了,然后通过各方面的了解,发现谷歌的邮箱是没有问题的,不会…

Portal Particle

Unity3D Portal Particle 2.2传送门粒子效果 链接:https://pan.baidu.com/s/1TCMXIif5d288lXHgixnDPw?pwd1234 下载:资源下载链接 效果图:

生态鱼缸智能养殖,系统架构与框图

功能:自动投食(推拉式电磁铁),温度显示的改进(传感器已经有了),控制灯光(白天亮晚上灭),自动补养/水循环(水氧监测太贵了,根据水温&am…

【前端面试3+1】05v-if和v-show的区别、v-if和v-for能同时使用吗、Vuex是什么?【合并两个有序链表】

一、v-if和v-show的区别 v-if 和 v-show 是 Vue.js 中用来控制元素显示与隐藏的指令。 1.v-if: v-if 是根据表达式的真假值来决定是否渲染元素。当表达式为真时,元素会被渲染到 DOM 中;当表达式为假时,元素不会被渲染到 DOM 中。每…

关于未来自我的发展和一些学习方法(嵌入式方向)

我是一名大二的学生,考研还是就业,到底是重视专业课还是重视数学英语,这些问题一直困扰了我很久,但如今已经有了一些浅显的认识,所以才会想写这样一篇文章来记录一下自己的状态和未来的规划 下面的看法都是个人的看法&…

报错:torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

错误: torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 这个主要是torch的gpu版本和cuda不适配 我的nvcc -V是11.8 torch使用的: pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pyt…

最长有效括号(C语言)

题目链接:. - 力扣(LeetCode) 这道题,我看了一种解法,觉得很好,来分享一下 这道题主要是 思考 当前 ) 与之匹配 ( 在哪里 ,记录下来,最后比较最大值 例子: 第…

听了中国电信关闭Wi-Fi双频合一功能之后,到底该连接2.4GHz还是5GHz频段?

前言 前段时间沸沸扬扬的关闭双频合一建议,小白也尝试关闭了一下,网络确实是好了不少。 有小伙伴还是有点疑虑,中国电信说的关闭Wi-Fi双频合一功能真的有用吗?点击下方蓝字一探究竟! 中国电信建议关闭路由器的双频合一…

Python-基础部署

机器没法直接读懂我们写的代码,需要解释解释器作为中间的翻译,把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目,每个项目里的文件夹…

Cisco ISR 1000 Series IOS XE Release IOSXE-17.13.1a ED

Cisco ISR 1000 Series IOS XE Release IOSXE-17.13.1a ED 思科 1000 系列集成多业务路由器系统软件 请访问原文链接:https://sysin.org/blog/cisco-isr-1000/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 思科…

ubuntu18.04 pycharm

一、下载pycharm (1)进入官网下载Download PyCharm: The Python IDE for data science and web development by JetBrains 选择专业版(professional)直接点击下载(download),我下载的是2023.3…

数字孪生|初识山海鲸可视化

哈喽,你好啊,我是雷工! 最近开始学习了解数字孪生的软件,看山海鲸可视化介绍的不错,便准备下载了试一下。 01 、概述 该软件是一套技术自主可控的、国产自研的、零代码数字孪生可视化工具集, 02、产品定…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了,既然低代码很好,为什么突然又自己架构起后端了呢?我有一句话叫低代码…

EasyRecovery2024中文版数据恢复软件功能全面介绍

EasyRecovery2024是世界著名数据恢复公司 Ontrack 的技术杰作,它是一个威力非常强大的硬盘数据恢复工具。能够帮你恢复丢失的数据以及重建文件系统。 EasyRecovery不会向你的原始驱动器写入任何东东,它主要是在内存中重建文件分区表使数据能够安全地传输…

nodejs下载安装以及npm、yarn安装及配置教程

1、nodejs下载安装 ​ 1.1、使用nodejs版本管理工具下载安装,可一键安装、切换不同nodejs版本, nvm-setup.zip:安装版,推荐使用 本次演示的是安装版。 1、双击安装文件 nvm-setup.exe 选择nvm安装路径 例如:E:\Soft…

ssm 科研奖励申报管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 科研奖励申报管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用…