Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么微软';s的开发人员选择使.NET成为基于堆栈的机器?_.net_Stack Based - Fatal编程技术网

为什么微软';s的开发人员选择使.NET成为基于堆栈的机器?

为什么微软';s的开发人员选择使.NET成为基于堆栈的机器?,.net,stack-based,.net,Stack Based,今天,我在VS2008提供的工具之间找到了反汇编程序IL。我试图反汇编一个程序并查看结果。操作码并不难理解,但有一件事让我感到惊讶:.NET是基于堆栈的?!在阅读“编写很棒的代码,第二卷”时,我没有很好地了解基于堆栈的机器,因为它们非常慢。它们也很容易实现,但我不认为微软开发人员选择这种方法是因为它简单,毕竟这些代码必须翻译成真正的机器代码,这样他们就可以解决问题。 你们谁能解释这个奇怪的选择 PS: 我在这里发布我读到的关于这个主题的内容: 13.1.1基于堆栈的机器 基于堆栈的机器将内存用于

今天,我在VS2008提供的工具之间找到了反汇编程序IL。我试图反汇编一个程序并查看结果。操作码并不难理解,但有一件事让我感到惊讶:.NET是基于堆栈的?!在阅读“编写很棒的代码,第二卷”时,我没有很好地了解基于堆栈的机器,因为它们非常慢。它们也很容易实现,但我不认为微软开发人员选择这种方法是因为它简单,毕竟这些代码必须翻译成真正的机器代码,这样他们就可以解决问题。
你们谁能解释这个奇怪的选择

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

13.1.1基于堆栈的机器 基于堆栈的机器将内存用于 大多数计算都使用堆栈 在内存中保存所有操作数和 结果。使用 堆栈结构提供了一些 与其他公司相比的重要优势 体系结构:
  • 指令通常较小(每个) 消耗的字节数)比那些 在其他体系结构中发现,因为 这些说明通常没有 指定任何操作数。
  • 编写编译器通常更容易 对于堆栈体系结构,而不是其他体系结构 机器因为转换算法 表达式到堆栈序列 操作非常简单
  • 很少使用临时变量 在堆栈架构中需要, 因为堆栈本身就是为这个服务的 目的。
不幸的是,stack 机器也遭受一些严重的问题 缺点:
  • 几乎所有 指令引用内存(其中 在现代机器上速度很慢)。虽然 缓存可以帮助缓解此问题, 内存性能仍然是一个主要问题 堆栈计算机上的问题
  • 即使从HLL转换 有一个堆叠机是很容易的 优化的机会更少 比其他人更重要 架构<因为堆栈 机器不断地访问网络 相同的数据元素(即 堆栈顶部)、管道和 指令并行是困难的 要实现(请参见编写伟大的代码, 第1卷详细介绍了管道和 指令并行性)。
A 堆栈是一种数据结构,允许 仅对少数有限的 堆栈的元素(通常称为 堆栈顶部和堆栈上的下一个)。 对于堆栈,您通常执行以下操作之一: 三件事:将新数据推送到 堆栈,从堆栈中弹出数据,或 对当前正在使用的数据进行操作 坐在堆栈顶部(和 可能是下面的数据 它)

13.1.1.5真实世界的堆栈计算机
堆栈的一大优势 架构是一种易于实现的架构 为这种机器编写编译器。 写一篇文章也很容易 基于堆栈的计算机的仿真器。 由于这些原因,堆栈体系结构 在虚拟机(VM)中很流行 例如Java虚拟机和 Microsoft Visual Basic p代码 口译译员现实世界中的一些 确实存在基于堆栈的CPU,例如 Java语言的硬件实现 虚拟机;然而,他们不是很受欢迎 由于性能限制 对内存访问的限制。尽管如此, 了解堆栈的基本知识 架构很重要,因为很多 编译器翻译HLL源代码 转换为之前基于堆栈的表单 翻译成实际的机器代码。 事实上,在最坏的情况下(尽管如此) 很少),编译器被迫发出 模拟基于堆栈的对象的代码 编译复杂文件时使用计算机 算术表达式


编辑:我刚刚在@EricLippert的博客中找到了回答问题并确认@Aaron回答的内容

你必须询问微软开发者。但我猜性能问题不是他们最关心的。大多数Windows应用程序都没有CPU限制,甚至没有真正的I/O限制,因为它们大部分时间都在等待用户单击按钮。然而,拥有一个允许他们轻松实现新语言的体系结构可能是一个优先事项。

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

使用基于堆栈的中间表示法的一个好处是,您不受任何特定体系结构的约束

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

即使在当前的CPU上,编译到x86和x64也有很大的不同——更不用说替代体系结构(ARM)或未来的体系结构了


对于这样的事情,最好是他们将其保持在最简单的形式,然后在最终代码生成过程中依靠优化将其与实际硬件相匹配。

CIL基于堆栈的原因是因为它不是设计为针对VM的指令集。这是汇编的中间阶段


CLR更像是编译器+运行时,而不是JVM那样的VM。CLR设计并不试图提供解释字节码的良好性能。相反,它试图在运行时检查并将高级字节码编译成机器码。

但是xna基于.net,关于游戏,速度越快better@BlackBear我怀疑xna对微软或商业游戏的发展非常重要