评估堆栈和线程堆栈的区别
评估堆栈和线程堆栈的区别
我目前正在尝试通过将C#翻译成MSIL指令来自学MSIL。
然而,我认为我犯了一个假设错误,即将值推入并弹出存储在本地变量列表中的“评估堆栈”只是在运行时分配给线程的堆栈的另一种方式。
阅读Eric Lippert在答案中对评估堆栈目的的解释明确表明它们不是相同的东西:
我假设你是指MSIL语言的评估堆栈,而不是运行时实际的线程堆栈。
我的问题是:这两个堆栈之间的确切区别是什么?它们之间有什么关系?
admin 更改状态以发布 2023年5月23日
不,只有一个堆栈。有些语言区分评估堆栈和返回堆栈。Forth语言是主要例子,它在微处理器的早期相当有影响力。Forth语言的语法也非常基于堆栈,对程序不太友好。但是实现很容易,只需要不到2千字节的代码,大致相当于您的Linq查询理解 🙂
但是,MSIL不是其中之一。虚拟机为每个方法定义了一个堆栈。它完全与类型无关,可以存储int值、double值、对象引用或方法返回地址。将值推入和弹出堆栈仅仅是逻辑操作,根本不涉及实际数据传输。
即时编译器的工作是将其转换为处理实际数据的机器代码。这并不是很难,处理器也有一个堆栈,就像虚拟机。它也可以存储各种不同的数据类型,但当然不能忽略数据大小。最重要的是,消除这种推入和弹出,并充分利用处理器的寄存器库,这在MSIL中并未建模。这也不是巧合,不同的处理器具有非常不同的寄存器库功能。让代码变得更快非常重要。
是的,每个线程都有自己的堆栈。这绝对是必要的,堆栈存储支持线程执行不同的代码时的方法返回地址。这适用于MSIL和机器代码。