如何在CIL中处理堆栈上的不同类型

Chr*_*vic 5 .net clr stack types cil

尝试使用ildasm深入研究CIL代码,很明显CIL本身就是基于堆栈来支持像这样的表达式

IL_0001:    ldc.i4.s 13     ; 1f 0d
IL_0003:    stloc.0         ; 0a
IL_0004:    ldc.i4.s 31     ; 1f 1f
IL_0006:    stloc.1         ; 0b
IL_0007:    ldloc.0         ; 06
IL_0008:    ldloc.1         ; 07
IL_0009:    add             ; 58
Run Code Online (Sandbox Code Playgroud)

做同样float32而不是int32使用ldc.r4 <num>它在调用方面没有区别add因此让我想知道是否存在针对不同类型的不同堆栈或者如果只有一个堆栈保存特定元素在堆栈上具有的类型的元数据.是否有关于ECMA-335或其他地方的具体实施的信息?

Dam*_*ver 8

这在第I部分第12部分(来自此pdf)中有详细说明,该部分讨论了虚拟执行系统(VES):

如下所述,CIL指令不指定其操作数类型.相反,CLI根据数据流跟踪操作数类型,并辅以下面描述的堆栈一致性要求.例如,单个add指令将从堆栈中添加两个整数或两个浮点数.

和:

处理数字的大多数CIL指令从评估堆栈中获取其操作数(参见§I.12.3.2.1),并且这些输入具有VES已知的关联类型.因此,单个操作add可以具有任何数字数据类型的输入,但并非所有指令都可以处理操作数类型的所有组合.

I.12.1.4的内容也更详细.


usr*_*usr 5

JIT推断出类型.无论如何,它必须这样做以打字检查你的程序.无需为其操作的类型参数化操作.堆栈的类型和大小可在IL指令序列中的任何位置计算.如果它们不可计算或模糊不清,则该程序无法验证.

我相信Java IL的做法有所不同,但我可能会弄错.