
























.NET CLR 和 Java VM 都是堆栈式虚拟机(Stack-Based VM)。Java VM有约200个指令,每个指令都是1byte的opcode,后面接不等的参数;.NET CLR 有超过220条指令,但有些是使用相同的opcode,大部分是1byte,但也有2byte的。
下面是一個簡單的 C# 原始碼:
using System;
public class Test {
public static void Main(String[] args) {
int i=1;
int j=2;
int k=3;
int answer = i+j+k;
Console.WriteLine("i+j+k="+answer);
}
}
將此原始碼編譯之後,可以得到一個 EXE 檔案。我們可以透過 ILDASM.EXE 來反組譯 EXE 以觀察 IL。我將 Main() 的 IL 反組譯條列如下,這裡共有十八道 IL 指令,有的指令(例如 ldstr 與 box)後面需要接參數,有的指令(例如 ldc.i4.1 與 add)後面不需要接參數。
ldc.i4.1 stloc.0 ldc.i4.2 stloc.1 ldc.i4.3 stloc.2 ldloc.0 ldloc.1 add ldloc.2 add stloc.3 ldstr "i+j+k=" ldloc.3 box [mscorlib]System.Int32 call string [mscorlib]System.String::Concat(object, object) call void [mscorlib]System.Console::WriteLine(string) ret
此程式執行時,關鍵的記憶體有三種,分別是:
指令ldc是将参数存储至堆栈Evaluation Stack;zhi
指令stloc是将变量存储至堆栈Call Stack;後面有一連串的示意圖,用來解說在執行時此三種記憶體的變化。首先,在進入 Main() 之後,尚未執行任何指令之前,記憶體的狀況如圖 1 所示:

圖 1
接著要
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。