今天我在VS2008提供的工具之间找到了Disassembler IL。我试图反汇编一个程序并查看结果。操作码并不难理解,但有一件事让我感到惊讶:.NET 是基于堆栈的?!阅读“编写出色的代码,第二卷”时,我没有很好地了解基于堆栈的机器,因为它们非常慢。它们也很容易实现,但我不认为 MS 开发人员选择这种方法是因为它简单,毕竟代码必须被翻译成真正的机器代码,这样他们才能解决问题。
你们中的任何人都可以解释这个奇怪的选择吗?
PS:
我在这里发布我读到的关于这个主题的内容:
13.1.1 基于堆栈的机器 基于 堆栈的机器使用内存进行大多数计算,在内存中使用堆栈来保存所有操作数和结果。与其他架构相比,采用堆栈架构的计算机系统具有一些重要优势:
不幸的是,堆栈机器也有一些严重的缺点:
- 这些指令通常比其他体系结构中的指令更小(每条指令消耗更少的字节),因为指令通常不必指定任何操作数。
- 为堆栈架构编写编译器通常比为其他机器更容易,因为将算术表达式转换为一系列堆栈操作非常容易。
- 在堆栈架构中很少需要临时变量,因为堆栈本身就是为这个目的服务的。
堆栈是一种数据结构,它只允许对堆栈的少数有限元素(通常称为堆栈顶部和堆栈上的下一个)进行操作。对于堆栈,您通常会做以下三件事之一:将新数据压入堆栈,从堆栈中弹出数据,或对当前位于堆栈顶部的数据(可能还有紧接其下方的数据)进行操作。
- 几乎每条指令都引用内存(这在现代机器上很慢)。尽管缓存可以帮助缓解这个问题,但内存性能仍然是堆栈机器上的主要问题。
- 尽管从 HLL 到堆栈机器的转换非常容易,但与其他架构相比,优化的机会更少。
- 因为堆栈机器不断地访问相同的数据元素(即堆栈顶部的数据),所以很难实现流水线和指令并行(有关流水线和指令并行的详细信息,请参见编写出色的代码,第 1 卷)。
和
13.1.1.5 现实世界的堆栈机器
堆栈架构的一大优点是很容易为这样的机器编写编译器。为基于堆栈的机器编写模拟器也很容易。由于这些原因,堆栈架构在虚拟机 (VM) 中很流行,例如 Java 虚拟机和 Microsoft Visual Basic p-code 解释器。一些现实世界中基于堆栈的 CPU 确实存在,例如 Java VM 的硬件实现;但是,由于内存访问的性能限制,它们并不是很受欢迎。尽管如此,了解堆栈架构的基础知识还是很重要的,因为许多编译器在翻译成实际机器代码之前会将 HLL 源代码翻译成基于堆栈的形式。事实上,在最坏的情况下(虽然很少见),
编辑:我刚刚在@EricLippert 的博客中找到了一篇文章,回答了这个问题并确认了@Aaron 的回答