使用內聯中間語言(inline il)
內聯中間語言(inline il)直接在中間語言(intermediate language,il)定義的函式體,中間語言 f# 編譯語言,這主要是為了語言新增到達到乙個較低的比運算子和函式。例項,加法和box 和 not 的功能。我們非常少會用到這個功能,由於f# 庫fsharp.core.dll 已經公開了全部的、可能須要的生成中間語言的功能。然而,有一些極為罕見的情況。不能在 f# 中完畢,而僅僅能在中間語言中實現。內聯中間語言是非常好的選擇。
使用內聯中間語言非常easy。僅僅要把中間語言指令放在括號和#號中間,(# #)。
中間語言指令放在字串中間,使用可以被ilasm.exe 編譯的標準記號,它必須是正確的中間語言形式,否則會編譯出錯;然後,傳遞引數給中間語言指令,它們被壓入中間語言評估棧(il evaluation stack)中;還必須使用標準的冒號。告訴編譯器返回的型別是什麼。這要放在括號里間;還須要顯式地指定引數型別。由於編譯器沒有辦法出它們的型別。
我們如今看一下使用內聯中間語言的演示樣例。
如果因為某種原因,我們要使用在 f# 基本庫fslib.dll 中定義的加法和減法運算子。用我們自定義的函式去替換它們。
我們定義了兩個函式add 和 sub,函式體使用中間語言定義:
// declare add functionusing the il add instruction
let add (x:int)(y:int) = (# "add"x y : int #)
// declare sub functionusing the il sub instruction
let sub (x:int)(y:int) = (# "sub"x y : int #)
// test these functions
let x = add 1 1
let y = sub 4 2
// print the results
printfn "x: %i y:%i" x y
演示樣例的執行結果例如以下:
x: 2 y: 2
程式猿應該小心使用這樣的方法,由於寫乙個毫無意義的程式並不重要,編譯器不可能為此而發出警告。
考慮以下的的程式,我們改動了一下前面的演示樣例,把 "add" 指令替換成 "ret" 指令,表示是返回值,在這個上下文中沒有意義。這個演示樣例在編譯時沒有錯誤和警告,可是執行時會出錯。
// create a faulty add function
let add (x:int) (y:int) = (# "ret"x y : int #)
// attempt to use fault function
let x = add 1 1
演示樣例的執行結果例如以下:
unhandled exception: system.invalidprogramexception:common language runtime
detected an invalid program.
at error.add(int32 x, int32 y)
注意隨.net sdk 公布的乙個工具可以幫助檢測這樣的錯誤。這個工具叫peverify.exe,很多其他資訊有關此工具。也可以看看
Mcrosoft中間語言的主要特徵
mcrosoft中間語言顯然在.net framework中起著非常重要的作用。現在討論一下il intermideate language 的主要特徵。因為面向.net的所有語言在邏輯上都需要支援il的主要特徵。下面是中間語言il的主要特徵 1 物件導向和介面的支援 net的語言無關性還有一些實際...
Linux C語言內聯彙編使用
最近要改個c語言演算法的關鍵部分用組合語言實現,linux裡嵌入彙編基本使用at t彙編,比如linux系統的啟動部分用的就是at t彙編 以前學過at t彙編,但學過一段時間就忘了,但對intel彙編基礎比較熟悉,兩者使用方法基本相似,所以對著intel彙編,花點時間看at t彙編也就容易了。下面...
Linux C語言內聯彙編使用
最近要改個c語言演算法的關鍵部分用組合語言實現,linux裡嵌入彙編基本使用at t彙編,比如linux系統的啟動部分用的就是at t彙編 以前學過at t彙編,但學過一段時間就忘了,但對intel彙編基礎比較熟悉,兩者使用方法基本相似,所以對著intel彙編,花點時間看at t彙編也就容易了。下面...