全新的.NET直譯器 - Mono已經到來

77rou發表於2017-11-16

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在構建時,需要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下載地址:

原文連結:

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

關於葡萄城

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28298702/viewspace-2147346/,如需轉載,請註明出處,否則將追究法律責任。

相關文章