关于 Nand2tetris 这门课程的总结和心得

之前没写的总结,现在也一并补上。✅

总结

关于这门课程,我想首先要说明的内容是我对这门课程的态度——没错,我很喜欢这门课程。喜欢的原因很多,比如这门课程很简单、直接,课程的资源丰富,学习进度合理等,但对我最重要的一点是:这门课程是真的在 make my hands dirty。计算机是一门实践性非常强的学科,如果不动手进行一定程度上的实践,是很难掌握那些枯燥的理论知识的(尤其有些知识需要多次实践)。
尽管,我知道这门课程所做的事情不过是将前辈们走过的路再走一遍,但当我真的实现了那些前辈们实现的内容时,我还是会觉得很有成就感。因为我知道,我现在面前这台我正在写下这些文字的电脑,它的工作原理也基于此(当然现代计算机有了很多更新奇的东西)。

回到课程本身,这门课程有两个部分:Part 1 和 Part 2。Part 1 部分的面向人群是所有人,不论你对计算机是否了解,是否已经掌握一门程序语言,只要你对计算机的工作原理感兴趣,你都可以去学习。而 Part 1 部分所讲解的内容,主要也是以计算机的体系结构为主,只有最后一个章节的内容与汇编语言相关。Part 2 部分的面向人群是对计算机有一定基础且已经掌握了一门面对对象程序语言的人,所讲解的内容主要以编译原理为主,介绍了一种类似 Java 的面向对象语言 Jack,并详细讨论的它的设计,还有就是与操作系统相关的一些知识,当然这方面并不是这门课程的重点。

对个人而言,Part 1 部分的难点在 CPU 的设计上,这也是整本书最难的硬件部分。Part 2 部分的难点相对而言要少一些,因为都是与编程相关的内容,特别是有了一定的开发经验后,这些问题都不是很难。但整体而言,Part 2 给自己的收获感觉更多一点,因为它间接的帮助我打通了很多以前知道但不理解,或者说理解的不深刻的一些知识。

另外,尽管这门课程的学习资源很丰富,配套的工具也很好用,但在实际编码过程中,仍然会碰到一些很难 debug 的场景,比如将 VM 语言翻译为汇编语言时,加载到 CPUEmulator 中执行出错了,那么想要具体定位出错的是哪一行代码还是十分麻烦的。不过,这对于聪明的学习者而言,应该也不是太大的问题,只需要有足够的耐心即可。

最后,还想说的是关于 Hack 计算机是如何执行程序的(也算是对这门课程介绍的体系结构的一个总结吧):Hack 执行的代码被保存在其指令内存上(就是那块 ROM32K 芯片),这些程序是由 Jack 语言编写,然后再用 JackCompiler 编译得到的(假设 JackCompiler 包括 VM Translator 和 Assembler)二进制文件。如果 Hack 是实际存在的电路板,那么程序会被烧录到对应的存储芯片上。在整个执行过程中,CPU 按照取址执行的方式,从 ROM32K 芯片的 0 地址处开始,逐条指令进行执行,而这期间产生的数据会被保存到数据内存上(就是那块 Memory 芯片),不同的数据会被存储在不同的区域。

以上就是 Hack 计算机的基本工作过程和原理,现在回过头看,确实很简单,但其中的细节真的很多。

好了,关于总结就说这些。

心得

心得方面主要介绍自己的一些学习经验:

  1. 千万不要过度参考别人的代码,尽可能尝试自己去解决问题,相信我,这些问题不会特别复杂。
  2. 在看老师的章节视频前,可以先看看对应的章节资料。
  3. 在决定写代码之前,先想清楚要怎么去做这件事。
  4. 学到最后,我逐渐意识到,对我而言这门课最难的不是理解计算机的相关知识,而是对英语的理解,或者说对计算机专业英语的理解。所以,有看不明白的地方,直接去读中文版书籍也是没问题的。
  5. 多一点耐心,多给自己一点时间去解决遇到的问题。
  6. 所有内容学完之后,一定要总结一下所有的内容。完成之后,你会对 Hack 的运行机制十分熟悉,会有一种 everythis is under my control 的感觉。😘

最后的最后,感谢 Noam Nisan 和 Shimon Schocken 这两位老师的无私奉献。🎉🎉🎉
PS:大胡子老师的口语真的听的太难受了,😂请原谅我的吐槽。


Buy me a coffee ? :)
0%