深度理解C# 的執行原理

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~javascript

本文由鵝廠優文發表於雲+社區專欄java

  • [從編譯原理提及](javascript:;)
  • [虛擬機是什麼](javascript:;)
  • [C# 是什麼,IL 又是什麼](javascript:;)
  • [.Net Framework vs Mono](javascript:;)
  • [Unity3D 中的 C#](javascript:;)
  • [小結](javascript:;)

做者:易立 | 騰訊IEG高級工程師編程

爲何 Unity3D 能夠運行 C#,C# 和 Mono 是什麼關係,Mono 和 .Net Framework 又是什麼關係?咱們深刻的來聊一聊這個話題!框架

從編譯原理提及

一句話介紹編譯器:編譯器是將用某種程式語言寫成的源代碼(源語言),轉換成另外一種程式語言(目標語言)等價形式的程序。一般咱們是將某種高級語言(如C、C++、C# 、Java)轉換成低級語言(彙編語言、機器語言)。機器學習

編譯器以流水線的形式進行工做,分爲幾個階段:源代碼 → 詞法分析 → 語法分析 → 語義分析 → 目標代碼 → 連接 → 可執行文件。現代編譯器還會更復雜,中間會增長更多的處理過程,好比預處理器,中間代碼生成,代碼優化等。編程語言

img

虛擬機是什麼

虛擬機(VM),簡單理解,就是能夠執行特定指令的一種程序。爲了執行指令,還須要一些配套的設施,如寄存器、棧等。虛擬機能夠很複雜,複雜到模擬真正的計算機硬件,也能夠很簡單,簡單到只能作加減乘除。學習

在編譯器領域,虛擬機一般執行一種叫中間代碼的語言,中間代碼由高級語言轉換而成,以 Java 爲例,Java 編譯後產生的並非一個可執行的文件,而是一個 ByteCode (字節碼)文件,裏面包含了從 Java 源代碼轉換成等價的字節碼形式的代碼。Java 虛擬機(JVM)負責執行這個文件。優化

虛擬機執行中間代碼的方式分爲 2 種:解釋執行和 JIT(即時編譯)。解釋執行即逐條執行每條指令,JIT 則是先將中間代碼在開始運行的時候編譯成機器碼,而後執行機器碼。因爲執行的是中間代碼,因此,在不一樣的平臺實現不一樣的虛擬機,均可以執行一樣的中間代碼,也就實現了跨平臺。ui

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# 也是一樣的。推而廣之,理論上任何語言均可以跨平臺,只要在相應平臺實現了編譯器或者虛擬機等配套設施。spa

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。

img

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

.Net Framework vs Mono

Mono 是跨平臺的 .Net Framework 的實現。Mono 作了一件很了不得的事情,將 CLR 在全部支持的平臺上從新實現了一遍,將 .Net Framework 提供的基礎類庫也從新實現了一遍。

img

以上,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#刪除屬性XML?

相關閱讀

深刻淺出Lua虛擬機

開發效率過低?您可能沒看這篇文章

【DataMagic】如何在萬億級別規模的數據量上使用Spark

【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識

此文已由做者受權騰訊雲+社區發佈,更多原文請點擊

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索