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

时间:2014-08-22 22:29:59

标签: .net clr cil

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

然而,我认为我已经跌跌撞撞地假设“推测值”被推送然后弹出并存储在局部变量列表中的“评估堆栈”只是引用分配的堆栈的另一种方式到运行时的线程。

阅读Eric Lippert的answer关于评估堆栈的目的,清楚地表明他们同样的事情:

  

我假设您的意思是MSIL语言的评估堆栈,而不是运行时的实际每线程堆栈。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:3)

基本上,CIL的评估堆栈是您使用CIL指令进行操作的,实际的每线程运行时堆栈是您通过机器代码(汇编)指令操作的。

CIL堆栈在运行时并不存在,因为它是CLI规范定义的虚拟机器的一部分。

CLR JIT编译器所做的是获取使用CIL堆栈的CIL代码,并将其转换为使用实际运行时堆栈的机器代码(特定于您的体系结构,如x86或ARM)。