.NET缺乏動態功能,這也妨礙了.NET作為教學或原型開發工具在一些環境中的使用。一些像Xamarin Workbooks或簡單的腳本的工具,不能使用.NET語言,不得不求助於平臺上的其它解決方案。 ...
Mono通過新的運行代碼方式,完善了自己的即時編譯器和靜態編譯器。
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解釋器。
新的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/download/
原文鏈接:http://www.mono-project.com/
轉載請註明出自:葡萄城控制項
相關閱讀: