全新的.NET解釋器 - Mono已經到來

Mono經過新的運行代碼方式,完善了本身的即時編譯器和靜態編譯器。express

2001年,Mono項目正式開始,Mono開發團隊爲.NET指令集編寫了一個解釋器,用於在Linux上引導一個自託管的.NET開發環境。框架

當時認爲解釋器只是一個臨時工具,能夠在創建一個Just-in-Time(JIT)編譯器的時候使用它。解釋器(mint)和JIT引擎(mono)一直保持同步存在的狀態,直到能夠將JIT引擎移植到全部支持的平臺。函數

當引入泛型時,同時保留解釋器和JIT引擎的工程成本變得很高,再也不值得,因此去掉了解釋器。工具

稍後會介紹.NET代碼的全靜態編譯。這也是引入禁止目標平臺生成動態代碼的技術。iOS是這方面的主要驅動者,它開啓了容許Mono運行在PlayStation和Xbox等遊戲機上的大門。性能

全靜態編譯的主要缺點是:每次更新代碼時都必須從新建立一個全新的可執行文件。這是一個緩慢的過程,不適合於實踐的互動式發展。開發工具

例如,一些遊戲開發者喜歡在不觸發完整的從新編譯狀況下,調整本身的遊戲代碼。靜態編譯使這種狀況變得不切實際,因此他們在遊戲代碼中嵌入腳本語言,來快速迭代和調整。測試

.NET缺少動態功能,這也妨礙了.NET做爲教學或原型開發工具在一些環境中的使用。一些像Xamarin Workbooks或簡單的腳本的工具,不能使用.NET語言,不得不求助於平臺上的其它解決方案。優化

Frank Krueger在構建Continuous IDE時,須要iOS上的這樣的環境,因此他用F#編寫了本身的.NET解釋器,以便讓他在iPad上擁有一個完整的 .NET開發環境。設計

爲了解決這些問題並支持一些內部的微軟產品,又從新迎回了Mono解釋器。code

新的Mono解釋器

如今再次迎回了Mono的舊解釋器,並升級了它對.NET的支持,同時還加入了對泛型的支持,使其升級爲運行.NET,如今2017年它已經正式存在了。接下來Mono會增長對混合模式執行的支持。

Mono如今運行在WebAssembly上就是其中的一種方式(另外一種方式是使用LLVM的靜態編譯)。

解釋器如今是Mono的重要部分,它經過了大量的測試套件的大部分測試,如今你就能夠在經過源代碼構建Mono的時候使用它,以下所示:

$ mono --interpreter yourassembly.exe

混合模式執行

儘管目前獨立的解釋器已經很是成熟了,可是Mono開發團隊目前正在開發一種可以能夠將解釋的代碼與靜態編譯的代碼或即時編譯的代碼混合起來的配置,稱之爲混合模式執行。

對於像iOS,PlayStation和Xbox這樣的平臺,混合模式執行意味着你能夠預編譯核心庫或核心應用程序,而且仍然支持動態加載和執行代碼。在擁有使用LLVM優化全部核心庫的優點的同時,仍具備運行某些動態代碼的靈活性。

這將容許遊戲開發者在他們的系統上使用.NET語言進行原型設計、實驗和調整遊戲代碼,而沒必要從新編譯應用程序。

這將爲在使用 .NET語言的設備上,進行可編寫腳本應用程序的設計打開大門。

將來的工做

Mono開發團隊正在擴展解釋器的能力來處理各類有趣的場景,下面是一些當前的項目:

  • 提高Mono的靜態編譯

Mono的完整AOT編譯版本不帶有System.Reflection.Emit,這有幾個用途。

System.Linq.Expressions API已經普遍應用於許多高級場景,例如實體框架或用戶利用C#編譯器將表達式解析到表達式樹中,你可能已經在以下場景中看到了代碼:

Expression sum = a + b;
var adder = sum.Compile ( );
adder ( );

在完整的AOT場景中,設計實體框架和上述工做的方式都會經過上面的Expression 類集成到解釋器中。雖然這個expression解釋器有侷限性,但也是一個很大的解釋器。

經過啓用System.Reflection.Emit解釋器,能夠去除大量的代碼。

這也使得爲 .NET構建的腳本語言,可以工做在靜態編譯的環境中,如IronPython,IronRuby和IronScheme。

爲了作到這一點,Mono開發團隊正在完成混合模式執行的工做。這意味着解釋的代碼補充了現有的靜態編譯的 .NET代碼。

  • 更好的隔離

以前未能解決開發者在部署應用APP時的熱加載問題,Mono開發團隊正在完成對AppDomain的支持,以便啓用此方案。

  • 正在研究混合模式選項

Mono開發團隊發現某些程序經過解釋器解釋以後,會比使用JIT引擎來執行運行更快。

所以打算研究混合執行模式,或者稱爲分層編譯。可讓解釋器執行一些對性能不敏感的代碼,例如,靜態構造函數或其餘只能運行一次的初始化代碼,以便達到減小內存使用量,減小生成的代碼使用率和執行時間的目的。

另外一個方案是在解釋模式下運行代碼,若是超過某個閾值,則切換到該方法的JIT編譯實現,或者使用屬性來註釋遇到的問題和不值得進行優化的方法。

Mono下載地址:http://www.mono-project.com/d...

原文連接:http://www.mono-project.com/n...

轉載請註明出自:葡萄城控件

關於葡萄城

葡萄城成立於1980年,是全球最大的控件提供商,世界領先的企業應用定製工具、企業報表和商業智能解決方案提供商,爲超過75%的全球財富500強企業提供服務。葡萄城於1988年在中國設立研發中心,在全球化產品的研發過程當中,不斷適應中國市場的本地需求,併爲軟件企業和各行業的信息化提供優秀的軟件工具和諮詢服務。

相關文章
相關標籤/搜索