【转】深度理解C# 的执行原理
轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/47177008
- 從編譯原理說起
- 虛擬機是什么
- C# 是什么,IL 又是什么
- .Net Framework vs Mono
- Unity3D 中的 C#
- 小結(jié)
為什么 Unity3D 可以運行 C#,C# 和 Mono 是什么關系,Mono 和 .Net Framework 又是什么關系?我們深入的來聊一聊這個話題!
從編譯原理說起
一句話介紹編譯器:編譯器是將用某種程式語言寫成的源代碼(源語言),轉(zhuǎn)換成另一種程式語言(目標語言)等價形式的程序。通常我們是將某種高級語言(如C、C++、C# 、Java)轉(zhuǎn)換成低級語言(匯編語言、機器語言)。
編譯器以流水線的形式進行工作,分為幾個階段:源代碼 → 詞法分析 → 語法分析 → 語義分析 → 目標代碼 → 鏈接 → 可執(zhí)行文件。現(xiàn)代編譯器還會更復雜,中間會增加更多的處理過程,比如預處理器,中間代碼生成,代碼優(yōu)化等。
虛擬機是什么
虛擬機(VM),簡單理解,就是可以執(zhí)行特定指令的一種程序。為了執(zhí)行指令,還需要一些配套的設施,如寄存器、棧等。虛擬機可以很復雜,復雜到模擬真正的計算機硬件,也可以很簡單,簡單到只能做加減乘除。
在編譯器領域,虛擬機通常執(zhí)行一種叫中間代碼的語言,中間代碼由高級語言轉(zhuǎn)換而成,以 Java 為例,Java 編譯后產(chǎn)生的并不是一個可執(zhí)行的文件,而是一個 ByteCode (字節(jié)碼)文件,里面包含了從 Java 源代碼轉(zhuǎn)換成等價的字節(jié)碼形式的代碼。Java 虛擬機(JVM)負責執(zhí)行這個文件。
虛擬機執(zhí)行中間代碼的方式分為 2 種:解釋執(zhí)行和 JIT(即時編譯)。解釋執(zhí)行即逐條執(zhí)行每條指令,JIT 則是先將中間代碼在開始運行的時候編譯成機器碼,然后執(zhí)行機器碼。由于執(zhí)行的是中間代碼,所以,在不同的平臺實現(xiàn)不同的虛擬機,都可以執(zhí)行同樣的中間代碼,也就實現(xiàn)了跨平臺。
int run(context* ctx, code* c) {for (cmd in c->cmds) {switch (cmd.type) {case ADD:// todo addbreak;case SUB:// todo subtractbreak;// ...}}return 0; }總結(jié)一下,虛擬機本身并不跨平臺,而是語言是跨平臺的,對于開發(fā)人員來說,只需要關心開發(fā)語言即可,不需要關心虛擬機是怎么實現(xiàn)的,這也是 Java 可以跨平臺的原因,C# 也是同樣的。推而廣之,理論上任何語言都可以跨平臺,只要在相應平臺實現(xiàn)了編譯器或者虛擬機等配套設施。
C# 是什么,IL 又是什么
C# 是微軟推出的一種基于 .NET 框架的、面向?qū)ο蟮母呒壘幊陶Z言。微軟在 2000 年發(fā)布了這種語言,希望借助這種語言來取代Java,更多詳細的介紹可以參看?C#?Wiki。
C# 是一個語言,微軟給它定制了一份語言規(guī)范,提供了從開發(fā)、編譯、部署、執(zhí)行的完整的一條龍的服務,每隔一段時間會發(fā)布一份最新的規(guī)范,添加一些新的語言特性。從語法層面來說,C# 是一個很完善,寫起來非常舒服的語言。
C# 和 Java 類似,C# 會編譯成一個中間語言(CIL,Common Intermediate Language,也叫 MSIL),CIL 也是一個高級語言,而運行 CIL 的虛擬機叫 CLR(Common Language Runtime)。通常我們把 C#、CIL、CLR,再加上微軟提供的一套基礎類庫稱為 .Net Framework。
C# 天生就是為征服宇宙設計的,不過非常遺憾,由于微軟的封閉,這個目標并沒有實現(xiàn)。當然 C# 現(xiàn)在還過得很好,因為游戲而煥發(fā)了新的活力,因為 Unity3D,因為 Mono。
.Net Framework vs Mono
Mono 是跨平臺的 .Net Framework 的實現(xiàn)。Mono 做了一件很了不起的事情,將 CLR 在所有支持的平臺上重新實現(xiàn)了一遍,將 .Net Framework 提供的基礎類庫也重新實現(xiàn)了一遍。
以上,Compile Time 的工作實際上可以直接用微軟已有的成果,只要將 Runtime 的 CLR 在其他平臺實現(xiàn),這個工作量不僅大,而且需要保證兼容,非常浩大的一個工程,Mono 做到了,致敬!
Unity3D 中的 C#
Unity3D 內(nèi)嵌了一個 Mono 虛擬機,從上文可以知道,當實現(xiàn)了某個平臺的虛擬機,那語言就可以在該平臺運行,所以,嚴格的講,Unity3D 是通過 Mono 虛擬機,運行 C# 通過編譯器編譯后生成的 IL 代碼。
Unity3D 默認使用 C# 作為開發(fā)語言,除此之外,還支持 JS 和 BOO,因為 Unity3D 開發(fā)了相應的編譯器,將 JS 和 BOO 編譯成了 IL。
小結(jié)
C# 在 Windows 下,是通過微軟的 C# 編譯器,生成了 IL 代碼,運行在 CLR 中。
C# 在除 Windows 外的平臺下,是通過 Mono 的編譯器,生成了 IL 代碼,運行在 Mono 虛擬機中,也可以直接運行將已經(jīng)編譯好的 IL 代碼(通過任意平臺編譯)。
理論上,你創(chuàng)造了一門語言,并且實現(xiàn)了某一平臺下的編譯器,然后實現(xiàn)了所有平臺下符合語言規(guī)范的虛擬機,你的語言就可以運行在任意平臺啦。
問答C#刪除屬性XML?
相關閱讀
深入淺出Lua虛擬機
開發(fā)效率太低?您可能沒看這篇文章
【DataMagic】如何在萬億級別規(guī)模的數(shù)據(jù)量上使用Spark
【每日課程推薦】機器學習實戰(zhàn)!快速入門在線廣告業(yè)務及CTR相應知識
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,更多原文請點擊
搜索關注公眾號「云加社區(qū)」,第一時間獲取技術(shù)干貨,關注后回復1024 送你一份技術(shù)課程大禮包!
海量技術(shù)實踐經(jīng)驗,盡在云加社區(qū)!
總結(jié)
以上是生活随笔為你收集整理的【转】深度理解C# 的执行原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能飙升50% 画质还更好!AMD FS
- 下一篇: c# char unsigned_dll