评估堆栈和线程堆栈之间的区别
Posted
技术标签:
【中文标题】评估堆栈和线程堆栈之间的区别【英文标题】:Difference between Evaluation Stack and Thread Stack 【发布时间】:2014-08-22 22:29:59 【问题描述】:我目前正在尝试通过将 C# 转换为 MSIL 命令来自学 MSIL。
然而,我认为我偶然发现的地方是假设将值推送到其上然后弹出并存储在局部变量列表中的“评估堆栈”只是引用分配的堆栈的另一种方式在运行时到一个线程。
阅读 Eric Lippert 的 answer 以评估堆栈的目的可以清楚地表明它们不是相同的东西:
我假设您指的是 MSIL 语言的 评估堆栈,而不是运行时实际的每个线程堆栈。
我的问题是:这两个堆栈之间的确切区别是什么?它们之间有什么关系?
【问题讨论】:
【参考方案1】:不,只有一层。有一些语言可以区分评估堆栈和返回堆栈。 Forth language 是主要的例子,它在微处理器的早期具有相当大的影响力。而且语言语法非常基于堆栈,对编程非常不友好。然而,易于实现,它不需要超过 2 KB 的代码。大致是您的 Linq 查询理解所需要的:)
但不,MSIL 不是其中之一。 VM(虚拟机)只为一种方法定义一个堆栈。它完全与类型无关,它可以存储一个 int 或一个 double 或一个对象引用或一个方法返回地址。将值推送到堆栈或从堆栈弹出值只是一个逻辑操作,根本没有对实际数据传输进行建模。
抖动的工作是将其转化为处理真实数据的机器代码。实际上并不难,处理器也有一个堆栈,就像虚拟机一样。而且它还可以存储各种不同的数据类型,当然不能忽略数据大小。最重要的是,消除那种推送和弹出并利用处理器的注册表库,完全不是在 MSIL 中建模的。这也不是巧合,不同的处理器具有非常不同的注册表库功能。 对于快速编写代码非常重要。
是的,每个线程都有自己的堆栈。绝对必要的是,堆栈存储方法返回地址,线程可以执行不同代码。在 MSIL 和机器代码中。
【讨论】:
很清楚。谢谢你。当您说“向堆栈推入和弹出一个值只是一个逻辑操作,根本不是对实际数据传输进行建模”时,您能否扩展您的意思?【参考方案2】:基本上,CIL 的评估堆栈是您使用 CIL 指令操作的,实际的每线程运行时堆栈是您通过机器代码(汇编)指令操作的。
CIL 堆栈在运行时并不真正存在,因为它是 CLI 规范定义的虚拟机器的一部分。
CLR JIT 编译器所做的是获取使用 CIL 堆栈的 CIL 代码并将其转换为使用实际运行时堆栈的机器代码(特定于您的体系结构,例如 x86 或 ARM)。
【讨论】:
以上是关于评估堆栈和线程堆栈之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用堆栈评估中缀表达式:我找不到我的错误