惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Y
Y Combinator Blog
博客园 - Franky
D
Docker
B
Blog RSS Feed
M
MIT News - Artificial intelligence
雷峰网
雷峰网
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Martin Fowler
Martin Fowler
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
B
Blog
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
Vercel News
Vercel News
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News

博客园 - 无心三立

zz蚂蚁算法概述zz zz遗传算法 Genetic Algorithm 简介zz 推荐一个网站:我爱自然语言处理http://www.52nlp.cn/ zz几本自然语言处理入门书zz 机器学习的开源工具<转载> 噪声信道模型zz 如何成为一名成功的博士生[转载] 为什么读博士以及有什么意义[转载] The first of my blog write in English 拍电影--真实和虚拟 前天去听讲座 乔家大院 家居风水大全[ZT:http://sssyyyccc.blog.hexun.com/2641355_d.html] 没事就到博客看看,随便写点,成习惯了 Applied Microsoft .net framework Programming---Chapter 1 我的时间该怎么分配 转贴--生活小技巧--感觉不错,就贴上来了 厕所对联(纯属搞笑) 女教师与学生的精彩对答(超级爆笑)
蔡學鏞 - .NET中间语言
无心三立 · 2006-03-16 · via 博客园 - 无心三立

.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

此程式執行時,關鍵的記憶體有三種,分別是:

  • Managed Heap:這是動態配置(Dynamic Allocation)的記憶體,由 Garbage Collector(GC)在執行時自動管理,整個 Process 共用一個 Managed Heap。
  • Call Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每個 Thread 都有自己專屬的 Call Stack。每呼叫一次 method,就會使得 Call Stack 上多了一個 Record Frame;呼叫完畢之後,此 Record Frame 會被丟棄。一般來說,Record Frame 內紀錄著 method 參數(Parameter)、返回位址(Return Address)、以及區域變數(Local Variable)。Java VM 和 .NET CLR 都是使用 0, 1, 2… 編號的方式來識別區域變數。
  • Evaluation Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每個 Thread 都有自己專屬的 Evaluation Stack。前面所謂的堆疊式虛擬機器,指的就是這個堆疊。

指令ldc是将参数存储至堆栈Evaluation Stack;zhi

指令stloc是将变量存储至堆栈Call Stack;後面有一連串的示意圖,用來解說在執行時此三種記憶體的變化。首先,在進入 Main() 之後,尚未執行任何指令之前,記憶體的狀況如圖 1 所示:

圖 1
圖 1

接著要