Mono通過新的運(yùn)行代碼方式,完善了自己的即時編譯器和靜態(tài)編譯器。
成都創(chuàng)新互聯(lián)是一家專業(yè)提供精河企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作、H5建站、小程序制作等業(yè)務(wù)。10年已為精河眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。2001年,Mono項(xiàng)目正式開始,Mono開發(fā)團(tuán)隊(duì)為.NET指令集編寫了一個解釋器,用于在Linux上引導(dǎo)一個自托管的.NET開發(fā)環(huán)境。
當(dāng)時認(rèn)為解釋器只是一個臨時工具,可以在建立一個Just-in-Time(JIT)編譯器的時候使用它。解釋器(mint)和JIT引擎(mono)一直保持同步存在的狀態(tài),直到可以將JIT引擎移植到所有支持的平臺。
當(dāng)引入泛型時,同時保留解釋器和JIT引擎的工程成本變得很高,不再值得,所以去掉了解釋器。
稍后會介紹.NET代碼的全靜態(tài)編譯。這也是引入禁止目標(biāo)平臺生成動態(tài)代碼的技術(shù)。iOS是這方面的主要驅(qū)動者,它開啟了允許Mono運(yùn)行在PlayStation和Xbox等游戲機(jī)上的大門。
全靜態(tài)編譯的主要缺點(diǎn)是:每次更新代碼時都必須重新創(chuàng)建一個全新的可執(zhí)行文件。這是一個緩慢的過程,不適合于實(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時,需要iOS上的這樣的環(huán)境,所以他用F#編寫了自己的.NET解釋器,以便讓他在iPad上擁有一個完整的 .NET開發(fā)環(huán)境。
為了解決這些問題并支持一些內(nèi)部的微軟產(chǎn)品,又重新迎回了Mono解釋器。
現(xiàn)在再次迎回了Mono的舊解釋器,并升級了它對.NET的支持,同時還加入了對泛型的支持,使其升級為運(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的時候使用它,如下所示:
$ mono --interpreter yourassembly.exe
盡管目前獨(dú)立的解釋器已經(jīng)非常成熟了,但是Mono開發(fā)團(tuán)隊(duì)目前正在開發(fā)一種能夠可以將解釋的代碼與靜態(tài)編譯的代碼或即時編譯的代碼混合起來的配置,稱之為混合模式執(zhí)行。
對于像iOS,PlayStation和Xbox這樣的平臺,混合模式執(zhí)行意味著你可以預(yù)編譯核心庫或核心應(yīng)用程序,并且仍然支持動態(tài)加載和執(zhí)行代碼。在擁有使用LLVM優(yōu)化所有核心庫的優(yōu)勢的同時,仍具有運(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,這有幾個用途。
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 類集成到解釋器中。雖然這個expression解釋器有局限性,但也是一個很大的解釋器。
通過啟用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時的熱加載問題,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í)行時間的目的。
另一個方案是在解釋模式下運(yùn)行代碼,如果超過某個閾值,則切換到該方法的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è)報表和商業(yè)智能解決方案提供商,為超過75%的全球財富500強(qiáng)企業(yè)提供服務(wù)。葡萄城于1988年在中國設(shè)立研發(fā)中心,在全球化產(chǎn)品的研發(fā)過程中,不斷適應(yīng)中國市場的本地需求,并為軟件企業(yè)和各行業(yè)的信息化提供優(yōu)秀的軟件工具和咨詢服務(wù)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。