Mono通過新的運(yùn)行代碼方式,完善了自己的即時(shí)編譯器和靜態(tài)編譯器。
創(chuàng)新互聯(lián)建站主營巴青網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā),巴青h5微信小程序搭建,巴青網(wǎng)站營銷推廣歡迎巴青等地區(qū)企業(yè)咨詢
2001年,Mono項(xiàng)目正式開始,Mono開發(fā)團(tuán)隊(duì)為.NET指令集編寫了一個(gè)解釋器,用于在Linux上引導(dǎo)一個(gè)自托管的.NET開發(fā)環(huán)境。
當(dāng)時(shí)認(rèn)為解釋器只是一個(gè)臨時(shí)工具,可以在建立一個(gè)Just-in-Time(JIT)編譯器的時(shí)候使用它。解釋器(mint)和JIT引擎(mono)一直保持同步存在的狀態(tài),直到可以將JIT引擎移植到所有支持的平臺。
當(dāng)引入泛型時(shí),同時(shí)保留解釋器和JIT引擎的工程成本變得很高,不再值得,所以去掉了解釋器。
稍后會介紹.NET代碼的全靜態(tài)編譯。這也是引入禁止目標(biāo)平臺生成動態(tài)代碼的技術(shù)。iOS是這方面的主要驅(qū)動者,它開啟了允許Mono運(yùn)行在PlayStation和Xbox等游戲機(jī)上的大門。
全靜態(tài)編譯的主要缺點(diǎn)是:每次更新代碼時(shí)都必須重新創(chuàng)建一個(gè)全新的可執(zhí)行文件。這是一個(gè)緩慢的過程,不適合于實(shí)踐的互動式發(fā)展。
例如,一些游戲開發(fā)者喜歡在不觸發(fā)完整的重新編譯情況下,調(diào)整自己的游戲代碼。靜態(tài)編譯使這種情況變得不切實(shí)際,所以他們在游戲代碼中嵌入腳本語言,來快速迭代和調(diào)整。
.NET缺乏動態(tài)功能,這也妨礙了.NET作為教學(xué)或原型開發(fā)工具在一些環(huán)境中的使用。一些像Xamarin Workbooks或簡單的腳本的工具,不能使用.NET語言,不得不求助于平臺上的其它解決方案。
Frank Krueger在構(gòu)建Continuous IDE時(shí),需要iOS上的這樣的環(huán)境,所以他用F#編寫了自己的.NET解釋器,以便讓他在iPad上擁有一個(gè)完整的 .NET開發(fā)環(huán)境。
為了解決這些問題并支持一些內(nèi)部的微軟產(chǎn)品,又重新迎回了Mono解釋器。
現(xiàn)在再次迎回了Mono的舊解釋器,并升級了它對.NET的支持,同時(shí)還加入了對泛型的支持,使其升級為運(yùn)行.NET,現(xiàn)在2017年它已經(jīng)正式存在了。接下來Mono會增加對混合模式執(zhí)行的支持。
Mono現(xiàn)在運(yùn)行在WebAssembly上就是其中的一種方式(另一種方式是使用LLVM的靜態(tài)編譯)。
解釋器現(xiàn)在是Mono的重要部分,它通過了大量的測試套件的大部分測試,現(xiàn)在你就可以在通過源代碼構(gòu)建Mono的時(shí)候使用它,如下所示:
$ mono --interpreter yourassembly.exe
盡管目前獨(dú)立的解釋器已經(jīng)非常成熟了,但是Mono開發(fā)團(tuán)隊(duì)目前正在開發(fā)一種能夠可以將解釋的代碼與靜態(tài)編譯的代碼或即時(shí)編譯的代碼混合起來的配置,稱之為混合模式執(zhí)行。
對于像iOS,PlayStation和Xbox這樣的平臺,混合模式執(zhí)行意味著你可以預(yù)編譯核心庫或核心應(yīng)用程序,并且仍然支持動態(tài)加載和執(zhí)行代碼。在擁有使用LLVM優(yōu)化所有核心庫的優(yōu)勢的同時(shí),仍具有運(yùn)行某些動態(tài)代碼的靈活性。
這將允許游戲開發(fā)者在他們的系統(tǒng)上使用.NET語言進(jìn)行原型設(shè)計(jì)、實(shí)驗(yàn)和調(diào)整游戲代碼,而不必重新編譯應(yīng)用程序。
這將為在使用 .NET語言的設(shè)備上,進(jìn)行可編寫腳本應(yīng)用程序的設(shè)計(jì)打開大門。
Mono開發(fā)團(tuán)隊(duì)正在擴(kuò)展解釋器的能力來處理各種有趣的場景,下面是一些當(dāng)前的項(xiàng)目:
Mono的完整AOT編譯版本不帶有System.Reflection.Emit,這有幾個(gè)用途。
System.Linq.Expressions API已經(jīng)廣泛應(yīng)用于許多高級場景,例如實(shí)體框架或用戶利用C#編譯器將表達(dá)式解析到表達(dá)式樹中,你可能已經(jīng)在如下場景中看到了代碼:
Expression sum = a + b;var adder = sum.Compile ( ); adder ( );
在完整的AOT場景中,設(shè)計(jì)實(shí)體框架和上述工作的方式都會通過上面的Expression 類集成到解釋器中。雖然這個(gè)expression解釋器有局限性,但也是一個(gè)很大的解釋器。
通過啟用System.Reflection.Emit解釋器,可以去除大量的代碼。
這也使得為 .NET構(gòu)建的腳本語言,能夠工作在靜態(tài)編譯的環(huán)境中,如IronPython,IronRuby和IronScheme。
為了做到這一點(diǎn),Mono開發(fā)團(tuán)隊(duì)正在完成混合模式執(zhí)行的工作。這意味著解釋的代碼補(bǔ)充了現(xiàn)有的靜態(tài)編譯的 .NET代碼。
之前未能解決開發(fā)者在部署應(yīng)用APP時(shí)的熱加載問題,Mono開發(fā)團(tuán)隊(duì)正在完成對AppDomain的支持,以便啟用此方案。
Mono開發(fā)團(tuán)隊(duì)發(fā)現(xiàn)某些程序通過解釋器解釋之后,會比使用JIT引擎來執(zhí)行運(yùn)行更快。
因此打算研究混合執(zhí)行模式,或者稱為分層編譯??梢宰尳忉屍鲌?zhí)行一些對性能不敏感的代碼,例如,靜態(tài)構(gòu)造函數(shù)或其他只能運(yùn)行一次的初始化代碼,以便達(dá)到減少內(nèi)存使用量,減少生成的代碼使用率和執(zhí)行時(shí)間的目的。
另一個(gè)方案是在解釋模式下運(yùn)行代碼,如果超過某個(gè)閾值,則切換到該方法的JIT編譯實(shí)現(xiàn),或者使用屬性來注釋遇到的問題和不值得進(jìn)行優(yōu)化的方法。
Mono下載地址:http://www.mono-project.com/download/
原文鏈接:http://www.mono-project.com/news/
轉(zhuǎn)載請注明出自:葡萄城控件
葡萄城成立于1980年,是全球最大的控件提供商,世界領(lǐng)先的企業(yè)應(yīng)用定制工具、企業(yè)報(bào)表和商業(yè)智能解決方案提供商,為超過75%的全球財(cái)富500強(qiáng)企業(yè)提供服務(wù)。葡萄城于1988年在中國設(shè)立研發(fā)中心,在全球化產(chǎn)品的研發(fā)過程中,不斷適應(yīng)中國市場的本地需求,并為軟件企業(yè)和各行業(yè)的信息化提供優(yōu)秀的軟件工具和咨詢服務(wù)。