星期三, 4月 16, 2008

[Boo]Boo(3) - ildasm

使用 ildasm 有兩個目的:
  1. 比較print macro 與 print 函數的差別
  2. 比較 booc 編譯出來的可執行檔與 c# 編譯出來的可執行代碼


print macro 與 print 函數算是差別很大吧。
print 函數會調用 Boo.Lang.Builtins 類別裡的 print 函數,雖然實際上此函數的內容也是使用 Console.WriteLine(),但是除了你需要多附上 Boo.Lang.dll 之外,你還需要負擔 CLR 執行時動態把 Boo.Lang.dll 載入的成本。
IL_0005: call void [Boo.Lang/*23000001*/]Boo.Lang.Builtins/*01000001*/::print(object) /* 0A000001 */

使用 print macro 的話,就只是把 Console.WriteLine 替換進去,以編譯出來的結果而言,這會比較有效率,但如果作為 script 執行時,我想應該會有些損失。
IL_0005: call void [mscorlib/*23000001*/]System.Console/*01000001*/::WriteLine(string) /* 0A000001 */

這就是為甚麼BOO Primer建議使用 print macro 的原因。

booc 編譯出來的結果與使用 gmcs (我使用 Mono 的 c# 2.0 編譯器)編譯出來的結果非常接近,都同樣直接呼叫 System.Console.WriteLine,可以視為一樣。
p.s. 我也看過以 csc 編譯出來的結果了,實際上也非常相近,不過反組譯出來的IL代碼裡面的編排有些許不同。

沒有留言: