为什么微软的开发人员选择将.NET作为基于堆栈的机器?

Bla*_*ear 21 .net stack-based

今天我在VS2008提供的工具之间找到了Disassembler IL.我试图反汇编程序并查看结果.操作码不是很难理解,但有一件事让我感到惊讶:.NET是基于堆栈的吗?!阅读"写出优秀的代码,第二卷"我没有得到基于堆栈的机器的良好画面,因为它们非常慢.它们也很容易实现,但我不认为MS开发人员因为它的简单性而选择了这种方法,毕竟代码必须转换成真正的机器代码才能解决问题.
谁能解释这个奇怪的选择吗?

PS:
我在这里发布了关于这个主题的内容:

13.1.1基于 堆栈的机器基于堆栈的机器使用内存进行大多数计算,在内存中使用堆栈来保存所有操作数和结果.采用堆栈架构的计算机系统提供了一些优于其他架构的重要优势:

  • 这些指令通常比其他架构中的指令更小(每个消耗更少的字节),因为指令通常不必指定任何操作数.
  • 编写堆栈体系结构的编译器通常比编写其他机器更容易,因为将算术表达式转换为一系列堆栈操作非常容易.
  • 堆栈体系结构中很少需要临时变量,因为堆栈本身就是为此目的服务的.
不幸的是,堆栈计算机也存在一些严重的缺点:
  • 几乎每个指令都引用内存(现代机器上的内存很慢).虽然缓存有助于缓解此问题,但内存性能仍然是堆栈计算机上的主要问题.
  • 即使从HLL到堆栈计算机的转换非常容易,优化的机会也比其他架构少.
  • 由于堆栈计算机不断访问相同的数据元素(即堆栈顶部的数据),因此很难实现流水线操作和指令并行性(有关流水线操作和指令并行性的详细信息,请参阅写入优秀代码,第1卷).
堆栈是一种数据结构,它只允许在堆栈的一些有限元素上进行操作(通常称为堆栈顶部,堆栈旁边).使用堆栈,您通常可以执行以下三种操作之一:将新数据推送到堆栈,从堆栈弹出数据,或对当前位于堆栈顶部的数据(以及可能紧接在堆栈下方的数据)进行操作.

13.1.1.5真实堆栈机器
堆栈架构的一大优点是可以很容易地为这样的机器编写编译器.为基于堆栈的机器编写仿真器也非常容易.由于这些原因,堆栈体系结构在诸如Java虚拟机和Microsoft Visual Basic p代码解释器之类的虚拟机(VM)中很流行.确实存在一些基于堆栈的真实CPU,例如Java VM的硬件实现; 但是,由于内存访问的性能限制,它们并不是很受欢迎.尽管如此,了解堆栈体系结构的基础知识非常重要,因为许多编译器在转换为实际机器代码之前将HLL源代码转换为基于堆栈的形式.实际上,在最坏的情况下(尽管很少见),编译器在编译复杂的算术表达式时会被迫发出模拟基于堆栈的机器的代码.

编辑:我刚刚在@ EricLippert的博客中发现了一篇文章,回答了这个问题并确认了@Aaron的答案

Aar*_*ron 16

请记住,仅仅因为中间表示是基于堆栈的,并不意味着生成的机器代码是基于堆栈的.当代码从中间形式转换为机器代码时,它基本上被重新编译 - 允许本地优化.

使用基于堆栈的中间表示的好处是,您不依赖于任何特定的体系结构.

想象一下,如果他们决定使用基于理论寄存器的系统作为他们的中间形式.他们应该选择多少个寄存器?8?16?64?如果您的目标处理器具有比中间形式更多的实际寄存器,那么您已经失去了可能的优化.如果您的目标实际寄存器少于中间寄存器,则优化会适得其反,因为无论如何这些寄存器都会刷新到内存中.

即使在当前的CPU上,你也有很大的不同,可以归结为x86和x64 - 更不用说备用架构(ARM)或未来的架构.

对于这样的事情,他们保持最简单的形式,然后在最终代码生成期间依赖优化以使其与实际硬件相匹配是件好事.

  • 基于寄存器的 VM,如 Lua-VM 或 Parrot,拥有无限数量的(虚拟)寄存器。 (2认同)