你是否怀念美好的旧时光,那时男人们像男子汉一样,自己制作咖啡机?
本章讲述如何组装一台智能的咖啡机!它将是一台基于冯·诺依曼架构设计的计算机,包含 CPU、ROM/RAM 和 I/O,并且也适用于通用用途,也就是通用的 图灵机。
与其他复杂但流行的系统(要么是 CISC 要么是 RISC)不同,我们的机器将是 MISC:单指令集计算机!
唉,我们的处理器只会理解一条指令,然而,如果有足够的内存和时间,它就能够执行你的 3GHz Pentium IV 可以做的任何操作,或者仅仅是完全模拟它;它可以通过运行像这样的简单代码来解决任何可计算的问题
SBN $mem1, $addr1
SBN $mem2, $addr2
SBN $mem3, $addr3
SBN $mem4, $addr4
SBN $mem5, $addr5
SBN $mem6, $addr6
[...]
这个神奇的指令叫做 SBN $mem, $addr (减法和负跳转),它会获取内存单元 $mem 的值,从累加器(A 是此架构中唯一可用的寄存器)中减去它,并将结果存回累加器和内存 $mem : [mem] <= A <= A-[mem]。如果结果为负数,且仅当结果为负数时,它才会跳转到指定的地址 $addr。如果 $addr 指向下一条指令,则不会发生条件跳转。现在,有了这个指令,你就可以进行减法、加法、内存地址清零、字节移动、乘法、比较等等。最棒的是,你可以轻松构建一个优化编译器。
瞧。这是一个非常适合任何图灵完备问题的系统,而且,它的编码甚至比原始的图灵机还要简单!
这种创新的 MISC 处理器的优点在于,你不需要任何位来存储指令的操作码。这使得你的 CPU 非常非常简单:每次你只需要读取几个操作数。你可能希望通过将 SBN 指令扩展到 3 或 4 个操作数来扩展处理器的功能,以便它可以直接从主内存加载和存储数据。这是一个留给读者的练习;感谢 google。
CPU 结构图如下
<========= ADDRESS BUS ==============>
= =
= +---------+ =
= | CONTROL | =
+---------+ +-----------------+
| ALU & A | | Program Counter |
+---------+ +-----------------+
= | LOGIC | =
= +---------+ =
= =
<=========== DATA BUS ===============>
现在,你所需要做的就是将一些内存芯片连接在一起,例如通过回收旧 386 PC 上的静态缓存 RAM,一个 ALU 和一些胶合组件。你可以选择 TTL 或 CMOS 作为逻辑门和锁存器;我个人是 CMOS 爱好者,但这真的取决于你的个人喜好。你可以构建一个 8 位、16 位、32 位、64 位或任何你需要的位宽的系统。以防万一,对于更大的字宽,我发现使用预编程的 27128 EPROMS 构建 ALU 比使用更难找到的 74x181s 更可取。也四处找找进位传播单元。
该系统的单片特性只允许内存映射 I/O,并且需要为双向接口提供特殊的设计,但没有什么比老一代系统中看到的更特殊的东西。AGC,驱动阿波罗 11 号登月任务的计算机就使用了这种技术,因此在这种情况下也应该足够了。
请注意,数据总线的宽度必须与地址总线完全相同,这意味着字节的概念仅适用于 8 位咖啡机,而你最终会发现这更多的是一个特性而不是一个缺陷。你会惊讶于 8 位或 16 位总线能做出什么样的咖啡!这真是一个通用的硬件,造价非常低廉。
如此纯粹的系统将非常适合与以嵌入式系统控制而闻名的 FORTH 编程语言一起使用。这样做的主要先决条件是拥有一个堆栈机制,在这种情况下,堆栈机制可以通过一个计数器与一个内存池组合构建而成。
如果你想声称拥有一个严肃的咖啡开发平台,那么 C 语言的可移植性在当今是绝对必要的。你可以选择破解 gcc、lcc 或 sdcc 中的一个,通过在后端进行适当的调整,它们将能够输出专门定制的 MISC 汇编代码。有一天你甚至可能想要重写另一种像 C 这样的语言,忘了 D 字母吧 - 它已经被占用了,所以请不要在你的编译器中再次犯同样的错误:https://gnu.ac.cn/software/gcc/projects/beginner.html
以防你想编写自己的编译器,请提前阅读关于 flex、yacc 和一点相关的理论。特别是你将很快体会到诺姆·乔姆斯基的语言分类学
由于图灵机的工作方式(请参阅 http://plato.stanford.edu/entries/turing-machine/ ),它是一种非常复杂的设备,难以编程,并且最终也很难调试。原因是,它的行为是一个顺序过程,完全由以下参数决定
图灵机(TM)主要的当代缺点是它的顺序性质,这意味着只有特定范围的问题可以以直接的方式映射到它。TM 适用于在串行存储介质(磁带)上描述良好且不使用索引进行数据引用的问题。这与咖啡机(CM)形成对比,咖啡机可以处理任何随机访问算法(且不牺牲简洁性)。
此外,TM 为了保持 (1) 和 (2) 的简单性,在 (3) 指令表上施加了非常高且不必要的复杂性。而且,如果你不同意所谓的指令表变得真正不堪重负,你有没有尝试过为图灵机编写编译器?一个不容易编程且难以调试的系统,应该被认为是一个非常值得怀疑的系统,至少就计算机工程(!= CS)而言是这样。例如,尝试用图灵机模拟咖啡机,反之亦然。嘿,如果你仍然不同意,那就把代码给我看看。
结论:咖啡机(CM)是冯·诺依曼架构的更好模型,并且与当前复杂性理论中算法加权的标准实践具有 O(1) 关系。