nand2tetris 与 MIT6.828

nand2tetris 与 MIT6.828

原文链接:https://blog.csdn.net/q411020382/article/details/105165468

nand2tetris
难度:★★★★☆
推荐:★★★★★
nand2tetris 项目有一本书叫《计算机系统要素》,也有英语的视频教程。如果英语不好的可以看书,内容是一样的。

这本书主要讲解了计算机原理(1-6章)、编译原理(7-11章)、操作系统相关知识(12章)。不要看内容这么多,其实这本书的内容非常通俗易懂,翻译也很给力。每一章背后都有对应的练习,需要你手写代码去完成,堪称理论与实践结合的经典。

这里引用一下书里的内容简介,大家可以感受一下。

本书通过展现简单但功能强大的计算机系统之构建过程,为读者呈现了一幅完整、严格的计算机应用科学大图景。本书作者认为,理解计算机工作原理的最好方法就是亲自动手,从零开始构建计算机系统。
通过12个章节和项目来引领读者从头开始,本书逐步地构建一个基本的硬件平台和现代软件阶层体系。在这个过程中,读者能够获得关于硬件体系结构、操作系统、编程语言、编译器、数据结构、算法以及软件工程的详实知识。通过这种逐步构造的方法,本书揭示了计算机科学知识中的重要成分,并展示其它课程中所介绍的理论和应用技术如何融入这幅全局大图景当中去。

全书基于“先抽象再实现”的阐述模式,每一章都介绍一个关键的硬件或软件抽象,一种实现方式以及一个实际的项目。完成这些项目所必要的计算机科学知识在本书中都有涵盖,只要求读者具备程序设计经验。本书配套的支持网站提供了书中描述的用于构建所有硬件和软件系统所必需的工具和资料,以及用于12个项目的200个测试程序。

全书内容广泛、涉猎全面,适合计算机及相关专业本科生、研究生、技术开发人员、教师以及技术爱好者参考和学习。

而且,这本书的门槛非常低,只要你能熟练运用一门编程语言即可。

本书从与非门开始教你一步步构建一个完整的计算机(1-6章);从第 7 章开始一直到第 11 章,需要完成三个编译器(汇编编译器、VM 编译器、Jack 语言编译器);最后一章则需要完成操作系统部分功能。

如果你完成了本书所有的项目,则会获得以下成就:

构建出一台计算机(在模拟器上运行)
实现一门语言和相应的语言标准库
实现一个简单的编译器
我已经把这本书所有项目都完成了,耗时两个月(每天 3 小时)。答案放在 github 上,还建立了一个 QQ 交流群,如果有不懂的可以加群里探讨一下。

【高清-中字-公开课】依据基本原理构建现代计算机:从与非门到俄罗斯方块  (哔哩哔哩视频网站)

CS143 斯坦福大学编译原理【中文字幕】   (哔哩哔哩视频网站)

Nand2Tetris: From NAND to Tetris

依据基本原则构建现代计算机

MIT6.828 Operating System Engineering
难度:★★★★★
推荐:★★★★★
这个项目是 MIT 大学开源的一个操作系统课程,官网是 https://pdos.csail.mit.edu/6.828/2018/schedule.html。

【麻省理工学院】MIT 6.S081 操作系统工程 operating system engineering (中文字幕)   (哔哩哔哩视频网站)

【麻省理工学院】MIT 6.046J 算法设计和分析 | 附中文字幕    (哔哩哔哩视频网站)

该项目主要有以下几个优点:
循序渐进,从浅到深,让人更容易接受
理论与实践结合,每讲解一个知识点都有对应的练习需要完成
做这个项目的人很多,网上资料和答案非常多
只要你跟着项目走,从 Lab1 开始,一步一步的做到 Lab6,就能实现一个简单的操作系统内核。

以下是 6 个实验的内容简介:
引导PC,讲解 bootloader
内存管理
用户进程及中断
抢占式多任务处理
文件系统
网络驱动程序

不过这个项目比起 nand2tetris 要难,门槛较高。如果没什么基础的话,建议做这个项目之前先看看下列资料:

x86汇编语言:从实模式到保护模式
xv6-chinese
操作系统导论或任意一本操作系统书籍
git
这个项目也花了两个月才完成,不过只做了 Lab1-6 实验,挑战任务和家庭作业都没做。答案放在 github 上,有兴趣可以看看。

=================

主要先强推你说的这个底层知识科普。

计算机是怎样跑起来的

程序是怎样跑起来

作者 [日] 矢泽久雄 是个来自日本的可爱小哥哥。还有这个系列其他一些

网络是怎样连接的

图解TCP/IP(第5版)

图解HTTP (豆瓣)

图解网络硬件 (豆瓣)

这些书看起来非常有趣,而且没什么特别难懂的。如果有!那就先跳过,这类基础读物嘛,知道个大概就可以了。

 

然后我看题主像软硬件结合?那我还推荐你实操很强的“自制”系列

图灵程序设计丛书·自制系列

这里面包含了 我最喜欢的

30天自制操作系统 (豆瓣)

当然其他自制CPU,自制脚本语言,自制编译器,自制搜索引擎也都是很好的。

 

因为考虑到题主不是计算机专业的,所以没有推教科书中的经典书籍。那些书不是一般人愿意看下来的,或者说深入看一本大概就是半年没了...我推荐的这些除了实操,其他只要耐心看完就可以了 。

----------------------------

The Elements of Computing Systems (a.k.a. From Nand to Tetris)

《计算机系统要素一一从零开始构建现代计算机》

何止是电路,这本书带着你从NAND与非门开始,构造出CPU和整台电脑,然后在这台电脑上开发操作系统、编译器,最后写出一个俄罗斯方块(Tetris)游戏。

更关键的是,这本书的两位作者亲自开设了一门MOOC网课,全套视频免费看!

Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course)

里面还有他们的lab,以及他们研发的几乎所有配套软件,包括CPU模拟器、汇编器、虚拟机,等等等等。只要有足够的耐心和时间,你完全可以一步一步,从一块砖头开始搭建起整个计算机科学的宏伟大厦。


UPDATE1:评论里提到了nandgame这个网站,一并推荐给大家。about页面有指出,灵感其实就来自于上面推荐的这本书。网站的优点是可以直接在浏览器里使用,缺点嘛,是只覆盖了本书的一小部分。

UPDATE2:看来大家对手撕计算机很感兴趣嘛。再推荐一个youtube博主Ben Eater给大家。这货最广为人知的作品,就是在一个只提供电路连接的面包板上,从逻辑门开始造出了一台8bit可编程计算机。在这个过程中,你需要自己捣鼓Latch、Flip-flop等各种电子元器件。看着他的成品,我不禁默默按了下收…啊!是点赞按钮!

----------------------------------------

其他回答说的挺好的,很多是动手操作层面的书籍,或者是嵌入式的硬件环境,或者是虚拟机之类的。

但是我仔细一看,楼主是数学系大三,抽象和推理能力应该很强。可以”高举高打“啊!毕竟数学是科学和工程的普适语言,计算机专业的很多东西估计在数学大神看来只是“应用数学”或者“工程数学”之一。

如果楼主不是想换专业,不忙着找计算机方面的工作,数学书看累了,作为放松不妨可以看看这几本(可能太“阳春白雪”了),即可以摸清计算机底层的逻辑本质,而且不用花钱买开发板之类的。

由于我是Lisp粉丝,因此稍微夹带私货:)

1.《计算机科学的逻辑基础》,国内刚翻译出版。

这本书使用了基于Lisp语言的逻辑证明工具ACL2(官网如下)

ACL2 Version 8.3

作为数学系的楼主,对形式证明应该得心应手。这本书利用ACL2这个工具,对计算机算术、数字电路(加法器和乘法器之类)的设计及其性质,进行了严格的逻辑验证。

如果楼主嫌这个太low,到ACL2官网,还有更多硬件验证的例子。

比如X86的指令集分析

X86ISA - Introduction

还有在ACL2中形式化jvm虚拟机的课程

COSC5010: Formalizing the JVM in ACL2

2. 《计算机程序的构造和解释》,大名鼎鼎的SICP

计算机程序的构造和解释(原书第2版)

这本书大部分人觉得就是讲Lisp/Scheme编程,或者利用Lisp/Scheme讲编程思想。但是别忘了这本书曾经是MIT的电子和计算机工程系的一年级教材,好多电子工程和计算机底层模型作为例子,作者写着写着,就写成了一本自底向上“搭积木”式的计算机系统构造指南。

摘录一些特别精彩的章节例子:

3.3.4 数字电路的模拟器 (以这个为基础,你可以实现一个计算机体系结构的仿真模型)

3.5.3 流计算模式的使用 (这里居然用模拟电路和信号处理系统的仿真做例子)

第4章实现了Lisp的元解释器。

第5章 寄存器机器里的计算 (这章的节奏绝对是“疯狂”的,5.1先实现了玩具性质的“高层次”硬件描述语言,5.4用这个语言搞出一个Lisp机器, 5.5为这个机器提供编译程序)

这本书具有国内教材难以企及的大局观和磅礴气势,有一种高屋建瓴之美! 让你从理论上搞清楚了计算机是从底层一步步怎么来的,软件/硬件如何协同,确实不愧是一本“神作”。

3.《汇编语言与计算机体系结构》,一本默默无闻的老教科书,从来没火过

汇编语言与计算机体系结构

为什么推荐这本? 因为看到楼主想学C++,这本书会告诉你C++的语法构造如何在底层机器上实现。采取的也是很诡异的手法,软硬件协同”试错“的方法。

先设计一个虚拟机,搞一个指令集,可以支持一些语法构造了。但是有些语法构造支持比较难,那就持续的扩充指令集,改造虚拟机,设计逐步迭代,直到最终可以支持所有核心构造。

虚拟机模拟的是”微程序“的体系结构,严重怀疑作者是上个世纪70-80年代设计计算机的,颇有那个年代之气质。

----------------------------------------

从电路开始讲然后汇编再到C语言。

俺依稀记得, 古老的 MULTISIM 11~12 版里面都可以仿真单片机的。

《STC单片机原理及应用 从器件、汇编、C到操作系统》

单片机是电子产品的“大脑”

生活中许多电器用了单片机。

例如:电视、冰箱、洗衣机、电饭锅、儿童玩具等等。

单片机是这些电器动作的总指挥,号令硬件运行。接收用户通过按键的输入信号,按照编好的程序,指挥继电器、马达和外围功能电路动作。

单片机是由CPU、内存、外围功能等部分组成的。

单片机的CPU从存储器读取程序,但是一次只能读取一条指令,然后解释每条指令,并执行。

存储器中保存的内容,不管是程序还是数据,都是二进制代码“0”和“1”组成的字符串。

指令二进制代码告诉CPU要做什么,

而数据二进制代码则是CPU操作或处理指令时要使用的值。

CPU的操作包含加、减运算等指令。

这些像密码一样排列的“0”和“1”字符串就是机器语言。

CPU总是按存储器地址的顺序读取指令代码,除非遇到跳跃指令。

例如,如果复位后的地址是0000,则从0000开始按0001、0002、0003的顺序读取并执行指令。

也可以说,一个程序就是按处理要求排列一系列的机器语言。

CPU只能理解机器语言。

因此,为了使CPU运行,就必须使用机器语言的程序。

但机器语言不易为人们识别和读写。

因此人们用了更简单易懂的字符串来代替机器语言,这就是汇编语言。

例如,在“给寄存器A赋值2”这样的处理时,如果用汇编语言来表示,就很简单,

汇编语言中,用MOV字符串表示赋值,所以“给寄存器A赋值2”的处理就可用

“MOV A,#02”

表示。

虽然汇编语言比机器语言更加简单易懂了,但是人们读起来还是挺难理解的。

而且,汇编语言还存在另一个问题,就是不同的CPU,机器语言的描述方式也不同。

因此,如果更换了CPU,就必须改写与机器语言有着密不可分关系的汇编语言

,每更换一次CPU都必须对程序进行改编,不但造成生产性低下,还加重了编程人员的负担。

《基于汇编与C语言的单片机原理及应用》
《单片机原理与应用:基于汇编C51及混合编程/高等学校计》
《单片机原理、应用与PROTEUS仿真:汇编+C51编程及其多模块混合编程》

人性化的C语言

能够解决上述问题的编程语言就是C语言。

----------------------------------------

我觉得从实际的角度出发,你迫切需要解决的问题是先学会一门编程语言,尽量搞熟练,达到可以开发出软件的程度,不要去管底层的东西,毕竟大三了,先通过掌握编程语言和软件开发知识跨到程序员这个行业,工作后在慢慢补充哪些知识。况且从应用软件开发的角度,电路知识并不重要,微机原理、操作系统、编译原理都已经算底层知识了,数据库系统、数据结构和算法、还有数学才是真正关键常用的知识。你想在短短两年把《模拟电路》《数字电路》《微机原理与汇编》《操作系统》《编译原理》《C++》这么多门计算机系学生的核心课程学完,还要融会贯通串联起来,对自己的要求着实不低。

电路和编程真的没关系,不管是数字电路还是模拟电路。
和编程有关的硬件知识是计算机体系结构,学这个不需要学电路。

不要看或者沉迷于这种书,过于泛泛,没有可实践性。

============== End

原文地址:https://www.cnblogs.com/lsgxeva/p/14998685.html