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

34 浏览
0 Comments

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

我目前正在尝试通过将C#翻译成MSIL指令来自学MSIL。

然而,我认为我犯了一个假设错误,即将值推入并弹出存储在本地变量列表中的“评估堆栈”只是在运行时分配给线程的堆栈的另一种方式。

阅读Eric Lippert在答案中对评估堆栈目的的解释明确表明它们不是相同的东西:

我假设你是指MSIL语言的评估堆栈,而不是运行时实际的线程堆栈。

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

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

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

CLR JIT 编译器的作用是将使用 CIL 堆栈的 CIL 代码转换为使用实际运行时堆栈的机器代码(特定于您的架构,如 x86 或 ARM)。

0
0 Comments

不,只有一个堆栈。有些语言区分评估堆栈和返回堆栈。Forth语言是主要例子,它在微处理器的早期相当有影响力。Forth语言的语法也非常基于堆栈,对程序不太友好。但是实现很容易,只需要不到2千字节的代码,大致相当于您的Linq查询理解 🙂

但是,MSIL不是其中之一。虚拟机为每个方法定义了一个堆栈。它完全与类型无关,可以存储int值、double值、对象引用或方法返回地址。将值推入和弹出堆栈仅仅是逻辑操作,根本不涉及实际数据传输。

即时编译器的工作是将其转换为处理实际数据的机器代码。这并不是很难,处理器也有一个堆栈,就像虚拟机。它也可以存储各种不同的数据类型,但当然不能忽略数据大小。最重要的是,消除这种推入和弹出,并充分利用处理器的寄存器库,这在MSIL中并未建模。这也不是巧合,不同的处理器具有非常不同的寄存器库功能。让代码变得更快非常重要。

是的,每个线程都有自己的堆栈。这绝对是必要的,堆栈存储支持线程执行不同的代码时的方法返回地址。这适用于MSIL和机器代码。

0