通用中間語言 (CIL) 怎麼學習?

剛下載它的壓縮文件,但是無從下手


CIL(Common Intermediate Language),又名MSIL(Microsoft Intermediate Language),是CLI(Common Language Infrastructure)所使用的中間語言。

要學習CIL可以做實驗:先用C#寫些實驗程序,用csc編譯為.NET Assembly之後用ildasm解成MSIL。這樣可以很快熟悉C#或其它.NET語言的語言結構到MSIL的映射。這樣得到的MSIL可以通過ilasm再彙編為.NET Assembly,這樣round-trip能力非常強大。

這樣做實驗的缺點是:MSIL的語言能力比.NET上常見的高級語言所能表達的能力要大,所以從C#之類的語言生成的MSIL只能用到合法的MSIL的一部分能力,而沒用到全部。不過這「一部分」也已經是很大的部分了,夠用。

然後也可以讀讀書。有好幾本專門講MSIL的書,例如這本:Expert .NET 2.0 IL Assembler (豆瓣)

當然,學習CIL必備的參考資料是它的規範:ECMA-335 http://www.ecma-international.org/publications/standards/Ecma-335.htm


同推薦 @RednaxelaFX 的Expert .NET 2.0 IL Assembler。

但是我不清楚你為什麼學CIL啊,因為我學CIL不過是為了了解一下C#編譯以後會變成什麼,平時用的最多最多的,也不過是寫個動態的property setter getter之類的,一些高級的東西只看過書了解過(比如方法調用callvirt、calli和call的區別引出的多態的實現方法,類和結構的field使用直接和間接的方式訪問揭示其在內存中的存儲方式等等),沒自己寫過。

我一般用Reflector來看IL代碼,可以方便的在C#和IL直接轉換:

實際上現在很多類庫不需要你動手直接寫IL,比如.NET自己的Lambda Expression Tree就可以很容易的動態生成代碼,而且還是面向對象的,操作起來比較方便。


對於入門:自己寫些小程序反編譯看IL代碼,其OpCodes也不多,多看幾次就可以了,鏈接:OpCodes 成員 (System.Reflection.Emit)
如果要深入,就要看書,如《MSIL權威指南》等…


非微軟員工學CIL的價值不大吧


推薦閱讀:

TAG:.NET | 編譯原理 | 編譯 | CLR |