首頁  >  文章  >  後端開發  >  C#執行原理深入解析(圖文)

C#執行原理深入解析(圖文)

不言
不言轉載
2018-10-20 17:22:243086瀏覽

這篇文章帶給大家的內容是關於C#執行原理深入解析(圖文),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

為什麼 Unity3D 可以運行 C#,C# 和 Mono 是什麼關係,Mono 和 .Net Framework 又是什麼關係?我們深入的來聊聊這個話題!

從編譯原理說起

一句話介紹編譯器:編譯器是將用某種程式語言寫成的原始碼(原始語言),轉換成另一種語言(目標語)等價形式的程序。通常我們是將某種高階語言(如C、C 、C# 、Java)轉換成低階語言(組合語言、機器語言)。

編譯器以管線的形式進行工作,分為幾個階段:原始碼 → 詞法分析 → 語法分析 → 語意分析 → 目標程式碼 → 連結 → 執行檔。現代編譯器也會更複雜,中間會增加更多的處理過程,例如預處理器,中間程式碼生成,程式碼最佳化等。

C#執行原理深入解析(圖文)

#虛擬機器是什麼

虛擬機器(VM),簡單理解,就是可以執行特定指令的一種程序。為了執行指令,還需要一些配套的設施,如暫存器、堆疊等。虛擬機可以很複雜,複雜到模擬真正的電腦硬件,也可以很簡單,簡單到只能做加減乘除。

在編譯器領域,虛擬機器通常執行一種叫做中間程式碼的語言,中間程式碼由高階語言轉換而成,以 Java 為例,Java 編譯後產生的並不是一個可執行的文件,而是一個 ByteCode (字節碼)文件,裡麵包含了從 Java 原始碼轉換成等價的字節碼形式的代碼。 Java 虛擬機器(JVM)負責執行這個檔案。

虛擬機器執行中間程式碼的方式分為 2 種:解釋執行和 JIT(即時編譯)。解釋執行即逐條執行每條指令,JIT 則是先將中間程式碼在開始運作的時候編譯成機器碼,然後執行機器碼。由於執行的是中間代碼,所以,在不同的平台實現不同的虛擬機,都可以執行相同的中間代碼,也實現了跨平台。

int run(context* ctx, code* c) {
    for (cmd in c->cmds) {
        switch (cmd.type) {
            case ADD:
            // todo add
            break;
            case SUB:
            // todo subtract
            break;
            // ...
        }
    }
    return 0;
}

總結一下,虛擬機器本身不是跨平台,而是語言是跨平台的,對於開發人員來說,只需要關心開發語言即可,不需要關心虛擬機器是怎麼實現的,這也是 Java 可以跨平台的原因,C# 也是一樣的。推而廣之,理論上任何語言都可以跨平台,只要在相應平台實現了編譯器或虛擬機器等配套設施。

C# 是什麼,IL 又是什麼

C# 是微軟推出的一種基於 .NET 框架的、物件導向的高階程式語言。微軟在 2000 年發布了這種語言,希望藉助這種語言來取代Java,更多詳細的介紹可以參考  C# Wiki。

C# 是一個語言,微軟為它定制了一份語言規範,提供了從開發、編譯、部署、執行的完整的一條龍的服務,每隔一段時間會發布一份最新的規範,加入一些新的語言特性。從文法層面來說,C# 是個很完善,寫起來很舒服的語言。

C# 和 Java 類似,C# 會編譯成一個中間語言(CIL,Common Intermediate Language,也叫 MSIL),CIL 也是高階語言,而執行 CIL 的虛擬機器叫 CLR(Common Language Runtime)。通常我們把 C#、CIL、CLR,再加上微軟提供的一套基礎類別庫稱為 .Net Framework。

C#執行原理深入解析(圖文)

C# 天生就是為征服宇宙設計的,不過非常遺憾,由於微軟的封閉,這個目標並沒有實現。當然 C# 現在還過得很好,因為遊戲而煥發了新的活力,因為 Unity3D,因為 Mono。

.Net Framework vs Mono

Mono 是跨平台的 .Net Framework 的實作。 Mono 做了一件很了不起的事情,將 CLR 在所有支援的平台上重新實作了一遍,將 .Net Framework 提供的基礎類別庫也重新實作了一遍。

C#執行原理深入解析(圖文)

以上,Compile Time 的工作其實可以直接用微軟已有的成果,只要將Runtime 的CLR 在其他平台實現,這個工作量不僅大,而且需要保證兼容,非常浩大的一個工程,Mono 做到了,致敬!

Unity3D 中的 C

#

Unity3D 內嵌了一個Mono 虛擬機,從上文可以知道,當實現了某個平台的虛擬機,那語言就可以在該平台運行,所以,嚴格的講,Unity3D 是透過Mono 虛擬機,執行C# 通過編譯器編譯後產生的IL 程式碼。

Unity3D 預設使用 C# 作為開發語言,除此之外,還支援 JS 和 BOO,因為 Unity3D 開發了對應的編譯器,將 JS 和 BOO 編譯成了 IL。

小結

C# 在 Windows 下,是透過微軟的 C# 編譯器,產生了 IL 程式碼,運行在 CLR 中。

C# 在除Windows 外的平台下,是透過Mono 的編譯器,產生了IL 程式碼,運行在Mono 虛擬機中,也可以直接執行將已經編譯好的IL 程式碼(透過任意平台編譯)。

理論上,你創造了一門語言,並且實現了某一平台下的編譯器,然後實現了所有平台下符合語言規範的虛擬機,你的語言就可以運行在任意平台啦。

#

以上是C#執行原理深入解析(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除