怎么将算法改成程序_大神程序员标配:花365天在《我的世界》打造一台能运行的计算机...

7e43fb958c9c3a8b1fb4c1c6062482a5.gif


一块小小的CPU里有多少个晶体管?几十亿个。
单枪匹马造出一个CPU乃至完整的电脑需要多长时间?有位大牛在《我的世界》游戏里用实际行动回答了这个问题:可能要花费一年多
这篇造计算机的教程一经转载就在知乎上火了。

3be58411db691d9b94d4a5d1148c0574.png

5e04aa51c0e199dafe8948fe1495e3b3.png


这并不是一篇游戏攻略,而是来自复旦大学的季文瀚,写的一篇课程论文。他在大二时就有了大胆的设想,经过一年的精心营造,建起了一个计算机雏形,取名Alpha21016
虽然它不能与现实中的计算机相比,只能实现一些简单的功能,但这台计算机体积惊人,光看它复杂的结构就已经能感受工程量的巨大。
有网友感叹,发课程论文可惜了,简直可以发学术论文啊。这台计算机能做什么
季文瀚计算机使用的是哈佛结构,而非更常见的冯·诺依曼结构。程序储存器和数据储存器分开放置。程序储存器1kb,数据储存器0.5kb。
它可以实现各种函数运算:加减乘除、三角函数还有矩阵运算。它包含一个16bit的CPU和一个32bit的浮点运算单元 (FPU) 。

858c7577a936e664722f778151e51143.gif


从硬件上看,它是个超大规模集成电路,逻辑门总数大概在5万-10万门之间。光是存储器堆叠起来就有8层。

858bb882b512d5da8dc1aed0d13018d9.png


要造出这样一台计算机,数字电路、微机原理、汇编语言、编译原理都不能少。想想你挂过哪几门课,从学会到熟练运用就更难了。

adacc9cc3b277b39375557a714fb6eaf.png


有了专业知识的支持,就能将计算机拆解成基本的部件。
我们都知道计算机的基础是数字电路,数字电路的基础是“门”,季文瀚用游戏里基本的“红石电路”搭建出了逻辑门。
从逻辑门出发,再搭建出组合电路、时序电路、触发器,有了这些就能组成CPU的一些基本单元,最终造出整个计算机。
现实世界中,晶体管是数字电路的基础;在《我的世界》中,红石电路是构成复杂电路的基本单元。

273f44422beb563a8ec82113ff65688d.png


红石电路玩家,只用火把和方块,就能造出基本的逻辑门:或门和非门。或门和非门的组合可以造出与门、异或门等任意逻辑门。
但仅仅知道怎么制造逻辑门离造出计算机还很远,可能大致相当于造出汉字笔画到写出《红楼梦》的距离。
季文瀚先给自己的CPU架构画了一个草图:

9d7d56326b695a3a442f85c4d16744c4.png


其中每一个方框都代表一个或若干个硬件单元,小一点的大约一两百个门电路,大的有几千个门电路。这个密密麻麻的部分,也只是架构的右半部分而已:

e12721b1fd5954ce0ca9089b1fc908b2.png


知道了CPU的基本架构,再按照架构图分别造出每个部分,比如CPU的重要模块“算数逻辑单元”(ALU)和“指令寄存器”(IR),工程量很大。
算数逻辑单元还能进一步拆解,它的加法器由数个全加器组成,上面基本的逻辑门可以组成加法器中最基本的全加器 (下图) 。

9c79c6e6e8c41c1245de72d0b3ee42a6.png


全加器也是计算机的一个核心部件。
同时,《我的世界》还提供的基于活塞机械的断路,用信号控制电路的通断,也就是继电器。利用继电器和逻辑门的组合可以造出存储器。

c4e25245d1260b13719218fa48a89cd3.gif

计算器→单片机→计算机
大概是因为太复杂,季文瀚一开始也没想直接搭个计算机。
最初,他的目标是造出一台16 bit的简单计算器。
但做到一半,他就觉得可以实现更复杂的东西,于是想改成单片机:这是具有“图灵完备性”,可以执行一切计算机程序的简单计算机。
他规划了指令集架构,储存器架构,以及指令发射方式等等。
后来,触发器、可读写储存器、缓冲队列等等重要电路,季文翰都设计成功了。

315016dbe354ce4114a0e2d647f46f17.png


有了这些,少年又做了更雄伟的计划:做个16 bit的CPU
CPU旁边,还有一个包含超越函数的单精度32 bit浮点处理器 (FPU) 。
这里,计算器作为片外系统,并没有被抛弃。季文翰把16 bit计算器,改成了完全时序逻辑电路控制、且有溢出判断的计算器——这在Minecraft红石电路玩家里,已是前所未有
它借用CPU的ALU部分进行运算,并经过总线传输数据。
CPU和计算器的大部分硬件,都在这张表格里:

1da41c66c54ef6692b5dfcea1f126cc5.png


表上的40个硬件,除了指令译码器、指令发射端、异常中断响应没有做完,其他都做好了。还有一些小的硬件单元没有列出来。
目前,CPU的ALU、主储存器、和寄存器等EU部分已经完工,内部环状总线已竣工,CU部分,也就是最繁琐的部分,还没有完工。

d8317265c318016077be68609c9772f7.gif

肉眼可见的威力
季文翰说,虽然还没完全竣工,但CPU已经可以执行许多种机器指令 (以MOV为主) :通用寄存器赋值,按字/字节+立即数/间接/直接寻址。
其中,最容易用肉眼感受到威力的,还是借用CPU的ALU完成运算的计算器
他在视频里展现了加减乘除正余弦,以及平方根的计算。

bd466598f81f467a9cbaf901bbbf7109.gif


从养着小猪的地方走楼梯下来,就是计算器的所在地了。这里有两排按钮,还有显示屏,如上图。

0bbf9c82005b4937e7ce25951c4b5ec4.gif


屏幕后面,可以看到运转的电路。
先做加减乘除。比如加法:
减法也是同理。只不过,负号和减号在这里分成了两个按钮。
乘法和除法的运算量比较大:三位数乘三位数,大概需要20秒;除法更慢一些,电脑还会卡。
下图就是除法,因为打了反除号 () ,所以被除数在右边。左下是商,右下是余数。

10d766399022e1b5e84cde6e7ef3e5fe.png


空间限制了算力,所以计算器要有溢出判断,超过±32627的范围就会报错,显示“E”。
不论是输入的数还是计算结果,超出范围都会报错:

9548ab578e35a13ea2a11b25ebbefd0d.gif


除以“0”,也会报错。
注意,计算机用二进制来计算,算好之后还要从二进制转成十进制,才是最终的答案。这里用到了BCD/BIN转换算法,把二进制BIN码,转成十进制BCD码。
四则运算做完了,还有正余弦,用的是Cordic旋转迭代算法:

dc896830dbb7c32a1f7f6f4326727633.png


需要多次迭代,所以运算比较慢,大概花了两分钟。
相比之下开根号就快许多,用的是快速平方根算法:

b1a8119400d4ee41a20360aa6f8f63e5.png


20秒 (就) 开好了。
计算能力就展示到这里。
而机智的你可能已经也感受到了,显示器对于一台计算机有多重要。那么:显示器怎么做?
游戏空间太狭窄,造显卡是不现实的:2×2个红石灯,就是游戏能控制的最小像素了。
所以,季文翰做了字符显示器
首先,用七段显示器来表示数字。

e48902cc0bc8d52302e75a2c8ebf1579.png

一个“日”字,是7根小棒组成的
比如,“4”就有左上、右上、中、右下,一共四根小棒。
每根小棒又由三个方块组成。把这些方块的活塞往回抽,就显示出凹陷的“4”了。
而每个十进制数,都可以对应二进制的四位数,比如3是0011,9是1001。输入二进制数,屏幕就能显示成十进制。
数字搞定了,还有其他字符。季文翰用了自己设计的缩减版ASCII码,只有不到64个字符:

3d544d7bc5f3a4bac5d37901a9141bb1.png


给每个字符编个号:0,1,2,…,63。每个号码,都可以转成二进制数00000-111111。
然后,显示出来长这样:

e71b0878809f77f1bc1968b742552515.png


打开夜视,萤火一般,美不胜收。
其实,这些字是“印”在了显示器的键盘上,白天长这样:

e20f369efbd2b87c31722c99600458ed.png


也就是说,计算机有了,显示器有了,键盘也有了。而这样的杰作,居然来自一位“业余选手”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值