每一種程式語言,要想執行,就必須要轉換為目標作業系統能夠理解的語言才能執行,這種語言叫做本機**(native code)。c#也是一樣的,也要做這樣的轉換,但是它不是一處到位的,在.net framework這個平台下,該過程分為兩個階段。
(1)c#**編譯為中間語言**的階段-----在編譯c#**時,並不是立即建立了本地**,而是通過c#編譯器(這個編譯器整合在visual studio裡面)把**編譯為通用中間語言(common intermediate language,cil)**,也就是il**,並將其儲存在乙個程式集中。程式集中除了有il**外,還將包括元資料和可選的資源檔案:元資料是用來描述**中的型別,這種描述針對3個方面:型別定義的描述、型別成員的描述和型別引用成員的描述;可選的資源檔案指的是il**中使用的其他資料,如檔案等。(ps:在c#中,程式集分為兩種,擴充套件名為.exe的可執行檔案和擴充套件名為.dll的可供其他程式呼叫的庫檔案。)
(2)中間語言**(il**)轉換為本地**的階段-----要使**能夠在目標作業系統上執行,還需要進一步把cil**轉換為特定cpu的本機**,該過程是由即時編譯器(just-in-time,jit)來完成的。
最後就是執行本機**了,jit編譯生成本機**之後,編譯好的本機**會被儲存在乙個緩衝區中快取,下次呼叫相同的程式集時,可直接從緩衝區中獲取本機**,從而避免了二次驗證和編譯。這樣的使用方式,系統只在首次呼叫時才會造成一些效能損失(jit編譯過程),所以c#程式在第一次呼叫的時候,會明顯感覺慢一些。下面這張圖是我在網上找的,很淺白的說明了**的執行過程。
關於 c語言的編譯 和編譯後程式的執行
原來,一直不太明白這樣乙個問題 既然c語言是一種相對高階的語言,應該用c語言寫出的東西,經過編譯器編譯就可在任意機器上執行。我今天試了一下在linux下編譯的c語言在windows下執行,但是都提示錯誤。然後去網上查了一些資料,事實上如果你編寫的程式全是彙編或者純c語言,沒有用到任何第三方軟體或者和...
C C 的編譯與執行
c c 編譯前,首先要對源 執行預處理。預處理器 preprocessor 是乙個簡單的程式,它用程式設計師 利用預處理器指令 定義好的模式代替源 中的模式 刪除注釋 包含其他檔案以及執行巨集 預處理後生成中間檔案.i 文字 接下來對於.i檔案進行語法分析。編譯器把源 分解成小的單元並把它們按樹形結...
C C 的編譯與執行
c c 編譯前,首先要對源 執行預處理。預處理器 preprocessor 是乙個簡單的程式,它用程式設計師 利用預處理器指令 定義好的模式代替源 中的模式 刪除注釋 包含其他檔案以及執行巨集 預處理後生成中間檔案.i 文字 接下來對於.i檔案進行語法分析。編譯器把源 分解成小的單元並把它們按樹形結...