Little Man Computer 还适用吗?

Is Little Man Computer still relevant?

我正在尝试了解计算机的实际工作原理,我找到了一些模拟器软件,但它们似乎非常复杂(我还是个初学者)。我看到 Little Man Computer (LMC) 很旧了。恐怕软件的工作方式与现在完全不同。

那么,Little Man Computer 对我了解计算机的工作原理是否仍然有意义?有更好的吗?

不完全现在发生的事情,但它确实展示了基本原则。

现在的 CPU 有多个内核和 executing multiple instructions at once, and usually arent 16 bit like the little man simulator. They also can have SIMD 指令的方法以及其他花里胡哨的东西。

要了解发生了什么,您需要阅读一些理论并使用模拟器实际查看每一步到底发生了什么,所以不要仅仅依靠模拟器来了解 cpu 的工作原理。

学习起来确实不错。在以后的问题中,你可能想 link 你正在谈论的事情而不是说 'this little man computer one'.

LMC 是一种类似于真实计算机的冯·诺依曼架构,但在其他重要方面,它从来都不像真实计算机,现在更不像了(例如 accumulator machine)。

它仍然被用作玩具架构,用于教授汇编语言的一些基础知识; SO 有一个带有 ~50 个问答的标签。

还有其他玩具 ISA,如 LC-3,它们很简单,但却是具有多个寄存器的二进制计算机。与为您的“局部变量”使用少量寄存器相比,累加器机器在汇编中手动编程是不必要的痛苦。 LC-3 is a 16-bit ISA with eight 16-bit registers。指令为 16 位宽,具有 4 位操作码。 与 LMC 不同,包括 LC-3 在内的大多数玩具 ISA 都基于二进制数,并且具有间接寻址,您可以在其中使用寄存器作为加载或存储的地址。

LMC 没有间接内存寻址:加载和存储指令必须将绝对地址硬编码到程序中。所以如果你想,例如遍历数组或使用查找 table,您需要编写自修改代码,将新地址存储到将作为代码执行的“邮箱”中。

被迫编写自修改代码来进行某些类型的计算与真正的现代计算机中的情况非常不同。大多数 ISA 都是图灵完备的(有限内存除外)and/or 可以成为 C 编译器的目标,无需自修改代码,即如果需要,指令可以保存在只读内存中。

了解 SMC 是可能的是很有用的,例如用于 JIT 编译,但不要了解这是取消引用指针的正常方法。


LMC 有一些 真实 CPU 的汇编语言原理(一次执行一条指令,这会对架构状态进行一些更改)。

但它特别避免提供任何 二进制 操作,如按位与、移位或类似的操作。这使得一些在真实计算机中很容易的事情在 LMC 中变得困难。

(Wikipedia): The LMC is generally used to teach students, because it models a simple von Neumann architecture computer—which has all of the basic features of a modern computer. It can be programmed in machine code (albeit in decimal rather than binary) or assembly code.

它仅通过 addsub 操作对数字进行操作,这不依赖于以二进制表示的数字。他们可以和房间里的一个小人一起使用纸上的十进制数字或弹珠集合来工作。它是 intentionally simplified to this point, but that makes it really annoying to program for when you know that real computers can do things like dividing by 2 very efficiently, while on LMC you need a stupid loop doing repeated subtraction, or fancy tricks,除数的 table 次幂。

LMC 有一些其他玩具机(如 LC3)所没有的奇怪限制:数字必须是正数。 How create an Little Mans Computer (LMC) code that will get a number. Display 1 if the number is odd, display 0 if the number is even 展示了这要求您如何小心避免这种情况,因为它在“ISA”中未定义,并且不同的模拟器对添加或子溢出的处理方式不同。

它还表明测试 odd/even(二进制或十进制的琐碎)在 LMC 中是一个很大的痛苦,您不能利用任何位值表示,二进制或其他方式。

相比之下,大多数其他玩具 ISA(如所有现代真正的 ISA)使用 2 的补码来表示有符号数。 IMO学习二进制整数是汇编语言的重要组成部分。


@trincot 写了一些其他不错的 LMC 答案,包括 What happens to instructions given to the Little man in the LMC that begin with 4?


超标量/乱序实现。

当然,大多数 ISA 都是按照顺序执行一条指令然后执行下一条指令来定义的。实际实现通常会并行执行多个(当指令级并行性允许时),同时保持这种错觉。

如果你愿意,你可以建造超标量乱序 LMC 或 LC-3;程序员不需要知道这一点,除非 ISA 使并行性 显式 ,例如Mill 或 IA-64 的显式推测,或 MIPS 上的加载/分支延迟槽。

参见http://www.lighterra.com/papers/modernmicroprocessors/ and also this answer on how real CPUs execute multiple instructions in parallel

请注意,自修改代码是超标量 CPU 的问题;例如当您修改管道中正在运行的代码附近的内存字节时,真正的 x86 CPU 会刷新管道。