Coursera: Nand2Tetris
Nand2Tetris
Coursera: Nand2Tetris
Start
这个项目的开始,也是源自对底层的探索和理解,总认为仅仅理解上层的东西,对我来说是无趣的,上层的东西依赖基础设施构建,而基础设施的构建,源自简单的语言,无论多繁杂的东西,都可以用简单的东西与天才般的思路构建。
这也是我完成的第二个系统性的项目了,第一个是xv6。这个项目学完后,对我而言受益匪浅,他不和第一个xv6项目如此的难,虽然每个lab的代码几乎不会超过100行,但是xv6需要对系统的理解较高,完成一个lab,我总是会问自己,这几个小时到底学到了什么?调试了11个小时的COW?是我效率低还是我的方法有问题?两个小时学会一个return而不是panic到底值不值?是不是要花这么多的时间去学算法更快更好更有成就感?
在学xv6的时候,总是会给我上面这些感受。
但是,nand2tetris是一个非常适合想要接触一下底层的人,他的难度没有xv6那么难, 难度也是循序渐进,通过一步一步的构建,来带领读者构建起整个计算机体系。
当我开始了部分nand2tetris的时候我就知道,nand2tetris绝对是顶尖的课程,当然是于我而言,他是我真正见过的,最好的,没有之一的课程,他比c prime plus好的多多的,也比王爽的汇编更易懂,更易学,把整个计算机的从与非门到最后系统的实现,从简拆分,步步串联,让读者最终完成整个项目。
在此致敬nand2tetris的作者: Noam Nisan 和 Shimon Schocken
以及书籍的译者: 李清安和龚奕利
Statistics
Coding : 80+h reading : 15+h
toatl: 95+h
Done
nand2tetris的课程,我也是通过书籍的提示来逐渐实现的
- 布尔逻辑, 布尔运算
- 存储实现
- 机器语言
- CPU设计及实现
- 汇编器
- 虚拟机
- Jack语言
- 编译器
- 操作系统
我也没想到,自己竟然可以跟着书籍实现这么多的实验。
在这里面,CPU的设计及实现,汇编器和编译器的实现难度最高,但是,实现也是成就最高,实现完最爽的几个实验。 在这次的项目,自己并没有依赖太多的AI,都是自己在思考,手写出来的,感觉也很舒服,喜欢这种感觉
在这几个实验中,CPU的设计是对我而言最有意思的,还记得当时大一数电的学习并不好,没想到,到最后,我连简单的16位CPU都可以设计出来,太爽了。
Harvest
-
在布尔逻辑和布尔运算中, 满满补齐了自己缺失的数电部分的理解,上课光顾着玩手机了,上课还搞不懂半加器,全加器,选择器和分配器,ALU,但是自己手写了后,自己设置后,自己了解了他们实现的原理。在CPU设计中,还以为设置错A锁存器,也搞懂了时序问题。
-
存储实现中,了解了存储实现的原理,通过简单的寄存器来实现锁存器等
-
CPU的设计,从指令的设计出发开始设计CPU,设置A锁存器和D锁存器,及多路选择器和分配器。尽管当时自己在设计出第一版CPU时,将D锁存器的输出放到了A锁存器,而不是ALU的输出直连A锁存器,导致在CPU运行的时候出现了CPU运行慢一拍的问题,所以这个问题运行时就排查出来解决了。
-
汇编器的实现,这部分的实现,就是对汇编的翻译,这个部分前面掌握了他给的机器语言的规范,基本就没有什么问题,后面当你的汇编器翻译一个汇编代码,生成1W行代码的时候,你会感觉到非常大的成就感
-
虚拟机的实现,这个部分就是将虚拟机代码翻译成汇编语言,和前面那个难度差不多
6.编译器的实现,这个部分是整个篇章中最为难的部分,你需要实现前端和后端的两个部分,在实现编译器前端的时候,你会学会简单的语法分析,递归下降解析的方法,这个前端就是将文本文件把数据抽离出来,然后再去实现后端,后端,通过掌握前面学会的虚拟机代码,将语言翻译成虚拟机代码,这个时候,整个编译器就是一个小型项目了,对我而言,最难的就不再是语法的使用,而是规则的设定,应该用全局变量记录什么?计数应该放在哪里?要不要把这个设置为通用的?通用后好像还有其他的不会用这个通用的。总之,这个时候,你就会遇到项目上的问题
- 操作系统的实现上,需要自己实现加法,除法,直线的绘制,输入,输出等,会接触到他们除法的天才思路,也就是除数乘2的思路,而对于平方根的计算,使用二叉搜索,也是我没有想到的。在绘制中,会接触简单的,斜线的绘制,也就是比例误差算法,都是蛮有意思的。
对于整个《计算机系统要素》,最大的收获,是对计算机体系的总括和理解,还有一次小型项目的实现也就是编译器,也补齐了数电的知识,很是不错。
TODO
这几天在做nand2tetris的操作系统实现的部分也有一些操之过急,我这个越到后面越耐不住性子的问题还是需要锻炼一下的。
剩下的这几天,倒是可以继续照顾一下我的FrostVista了,这个寒假一直想写,但是一直没空,因为nand2tetris的一直没有结尾,然后,OS的实现又很麻烦,需要耐下心来,所以一直没做,因为下半年还打算参加操作系统开发大赛的内核实现赛道,所以,接下来的时间可能大部分都要用来写OS了,也是正合我意吧。
在寒假,也看了一部分的games101的内容和MIT6.042J的内容,我看看这个学期,把MIT6.042J的剩下的我没有看完的内容看完,然后简单看点games101的图形学的内容,学习一下。
后面的路还挺长的,还打算学FPGA,verilog,CAD,EDA什么的,挺繁杂了,反正路还很长,慢慢来就行了。
在xv6中,想要一直看的性能分析工具并没有看,也是需要延到后面去了。
Summary
在寒假,终于是把这个项目完结了,底层的路也开始慢慢走了,这个寒假也不是说什么都没学,编译器和操作系统部分,看了一半的MIT6.042J的内容,了解了一下games101,还打了个~~国服剑姬~~,哈哈哈。反正想法也很简单,就是想往下看看。
nand2tetris确实是顶尖的CS课程,很推荐,有点语言基础就可以来学,可以来见识一下CS的底层部分