什么是.NET
.NET是一個開發框架,它遵循并采用CIL(Common Intermediate Language)和CLR(Common Language Runtime)兩種約定,
CIL標準為一種編譯標準:將不同編程語言(C#, JS, VB等)使用各自的編譯器,按照統一的標準編譯成語義一致的CIL中間碼, 這樣雖然代碼使用的語言不同,但編譯出的產物是一樣的。
CLR標準為一種執行標準:不同的操作系統可以根據CLR這一執行標準開發出自己平臺的中間碼執行器,這樣CIL這個標準中間產物就可以在不同的平臺執行了。其中Mono框架就扮演了這樣一個重要的角色,實現了各個平臺的CLR執行器。
.Net擁有跨語言,跨平臺性:
-
跨語言:就是只要是面向.Net平臺的編程語言,用其中一種語言編寫的類型就可以無縫的在另外一種語言編寫的應用程序中互操作。
-
跨平臺:一次編譯,不需要任何代碼修改,應用程序就可以運行在任意在.Net實現的平臺上跑,即代碼不依賴于操作系統,也不依賴硬件環境。一個.Net程序運行的核心在于.Net
CLR(公共語言運行時,或者稱為.Net 虛擬機,類似java虛擬機的概念),為了讓.Net程序在其他平臺(目前只能在.Net 平臺,windows系統)上跑,微軟官方還推出了在其他平臺(MacOs,Linux)跑的
.Net的實現,就推出了.Net Core。
然而,Unity引擎需求也是需要跨平臺,支持多語言(C#,Js,Boo)。就參考微軟開發.Net Core的概念,于是,推出了Mono.
畫個圖簡單對比一下:
到這里,基本說明了.Net 與Mono和Unity的聯系關系,其實沒啥關系。做游戲都知道,肯定需要跨平臺,不能只支持一種平臺,不然每個對應的平臺做出一種對應的編譯器,那真的會累死。所以對于跨平臺的需求,對于游戲開發而言,很重要。Unity的架構需求設計當然也需要這個特性。參考.Net依托CLR來實現設計思路,于是Mono就出來了。
什么是Mono
Mono是一個框架,它是.NET這個開源框架的子集,它建立在.NET框架基礎上,在使用.NET基礎能力的基礎上,自己做了多各個操作系統的CLR實現來實現跨平臺。同時也重寫了一些.NET框架中的基本功能。
mcs編譯器: C#編譯器,C#編譯為IL中間指令。
Unity跨平臺的原理: 就是Mono運行時編譯器支持將IL代碼轉為對應平臺原生碼,IL可以在任何支持CLI(Common Language Insfrastructure,通用語言環境結構)中運行,IL的運行是依托Mono運行時。
IOS不支持jit編譯原因:機器碼被禁止映射到內存,即封存了內存的可執行權限,變相的封鎖了jit編譯方式,詳情參考:https://www.cnblogs.com/murongxiaopifu/p/4278947.html
JIT編譯: 將IL代碼轉為對應平臺原生碼并且將原生碼映射到虛擬內存中執行。JIT編譯的時候IL是在依托Mono運行時,轉為對應的原生碼后在依托本地運行。