.net – 评估堆栈和线程堆栈之间的区别

我目前正试图通过将C#转换为MSIL命令来自学MSIL.

然而,在我认为我偶然发现的情况下,假设“推测值”被推送然后弹出并存储在局部变量列表中的“评估堆栈”只是引用分配给线程的堆栈的另一种方式在运行时.

根据评估堆栈的目的阅读Eric Lippert的answer,清楚地表明它们不是同一个东西:

I assume you mean the evaluation stack of the MSIL language, and not the actual per-thread stack at runtime.

我的问题是:这两个堆栈之间的确切区别是什么?它们如何相关?

最佳答案
不,只有一个堆栈.有些语言区分了eval堆栈和返回堆栈. Forth language作为主要的例子,在微处理器的早期阶段相当有影响力.而且非常基于堆栈的语言语法,对程序非常不友好.但是,易于实现,它不需要超过2千字节的代码.大致你的Linq查询理解需要:)

但不,MSIL不是其中之一. VM(虚拟机)仅为方法定义一个堆栈.它完全是类型无关的,它可以存储一个int或double或一个对象引用或一个具有相同aplomb的方法返回地址.向堆栈推送值或从堆栈弹出值只是一种逻辑操作,根本不对实际数据传输进行建模.

将抖动转换为处理实际数据的机器代码是抖动的工作.事实并非如此,处理器也有堆栈,就像VM一样.它还可以存储各种不同的数据类型,但当然不能忽略数据大小.最重要的是,消除了那种推送和弹出并利用处理器的注册表库,完全没有在MSIL中建模.也不是巧合,不同的处理器具有非常不同的注册银行功能.使代码快速非常重要.

是的,每个线程都有自己的堆栈.绝对必要,堆栈存储方法返回地址,线程可以执行不同的代码.在MSIL和机器代码中都有.

转载注明原文:.net – 评估堆栈和线程堆栈之间的区别 - 代码日志