溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

全新的.NET解釋器 - Mono已經(jīng)到來

發(fā)布時(shí)間:2020-06-19 15:59:05 來源:網(wǎng)絡(luò) 閱讀:755 作者:powertoolsteam 欄目:系統(tǒng)運(yùn)維

Mono通過新的運(yùn)行代碼方式,完善了自己的即時(shí)編譯器和靜態(tài)編譯器。

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引擎移植到所有支持的平臺(tái)。

當(dāng)引入泛型時(shí),同時(shí)保留解釋器和JIT引擎的工程成本變得很高,不再值得,所以去掉了解釋器。

稍后會(huì)介紹.NET代碼的全靜態(tài)編譯。這也是引入禁止目標(biāo)平臺(tái)生成動(dòng)態(tài)代碼的技術(shù)。iOS是這方面的主要驅(qū)動(dòng)者,它開啟了允許Mono運(yùn)行在PlayStation和Xbox等游戲機(jī)上的大門。

全靜態(tài)編譯的主要缺點(diǎn)是:每次更新代碼時(shí)都必須重新創(chuàng)建一個(gè)全新的可執(zhí)行文件。這是一個(gè)緩慢的過程,不適合于實(shí)踐的互動(dòng)式發(fā)展。

例如,一些游戲開發(fā)者喜歡在不觸發(fā)完整的重新編譯情況下,調(diào)整自己的游戲代碼。靜態(tài)編譯使這種情況變得不切實(shí)際,所以他們?cè)谟螒虼a中嵌入腳本語言,來快速迭代和調(diào)整。

.NET缺乏動(dòng)態(tài)功能,這也妨礙了.NET作為教學(xué)或原型開發(fā)工具在一些環(huán)境中的使用。一些像Xamarin Workbooks或簡(jiǎn)單的腳本的工具,不能使用.NET語言,不得不求助于平臺(tái)上的其它解決方案。

Frank Krueger在構(gòu)建Continuous IDE時(shí),需要iOS上的這樣的環(huán)境,所以他用F#編寫了自己的.NET解釋器,以便讓他在iPad上擁有一個(gè)完整的 .NET開發(fā)環(huán)境。

為了解決這些問題并支持一些內(nèi)部的微軟產(chǎn)品,又重新迎回了Mono解釋器。

 

新的Mono解釋器

現(xiàn)在再次迎回了Mono的舊解釋器,并升級(jí)了它對(duì).NET的支持,同時(shí)還加入了對(duì)泛型的支持,使其升級(jí)為運(yùn)行.NET,現(xiàn)在2017年它已經(jīng)正式存在了。接下來Mono會(huì)增加對(duì)混合模式執(zhí)行的支持。

Mono現(xiàn)在運(yùn)行在WebAssembly上就是其中的一種方式(另一種方式是使用LLVM的靜態(tài)編譯)。

解釋器現(xiàn)在是Mono的重要部分,它通過了大量的測(cè)試套件的大部分測(cè)試,現(xiàn)在你就可以在通過源代碼構(gòu)建Mono的時(shí)候使用它,如下所示:

$ mono --interpreter yourassembly.exe

 

混合模式執(zhí)行

盡管目前獨(dú)立的解釋器已經(jīng)非常成熟了,但是Mono開發(fā)團(tuán)隊(duì)目前正在開發(fā)一種能夠可以將解釋的代碼與靜態(tài)編譯的代碼或即時(shí)編譯的代碼混合起來的配置,稱之為混合模式執(zhí)行。

對(duì)于像iOS,PlayStation和Xbox這樣的平臺(tái),混合模式執(zhí)行意味著你可以預(yù)編譯核心庫(kù)或核心應(yīng)用程序,并且仍然支持動(dòng)態(tài)加載和執(zhí)行代碼。在擁有使用LLVM優(yōu)化所有核心庫(kù)的優(yōu)勢(shì)的同時(shí),仍具有運(yùn)行某些動(dòng)態(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ò)展解釋器的能力來處理各種有趣的場(chǎng)景,下面是一些當(dāng)前的項(xiàng)目:

  • 提升Mono的靜態(tài)編譯

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

System.Linq.Expressions API已經(jīng)廣泛應(yīng)用于許多高級(jí)場(chǎng)景,例如實(shí)體框架或用戶利用C#編譯器將表達(dá)式解析到表達(dá)式樹中,你可能已經(jīng)在如下場(chǎng)景中看到了代碼:

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

在完整的AOT場(chǎng)景中,設(shè)計(jì)實(shí)體框架和上述工作的方式都會(huì)通過上面的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ì)正在完成對(duì)AppDomain的支持,以便啟用此方案。 

  • 正在研究混合模式選項(xiàng)

Mono開發(fā)團(tuán)隊(duì)發(fā)現(xiàn)某些程序通過解釋器解釋之后,會(huì)比使用JIT引擎來執(zhí)行運(yùn)行更快。

因此打算研究混合執(zhí)行模式,或者稱為分層編譯??梢宰尳忉屍鲌?zhí)行一些對(duì)性能不敏感的代碼,例如,靜態(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)載請(qǐng)注明出自:葡萄城控件

關(guān)于葡萄城

葡萄城成立于1980年,是全球最大的控件提供商,世界領(lǐng)先的企業(yè)應(yīng)用定制工具、企業(yè)報(bào)表和商業(yè)智能解決方案提供商,為超過75%的全球財(cái)富500強(qiáng)企業(yè)提供服務(wù)。葡萄城于1988年在中國(guó)設(shè)立研發(fā)中心,在全球化產(chǎn)品的研發(fā)過程中,不斷適應(yīng)中國(guó)市場(chǎng)的本地需求,并為軟件企業(yè)和各行業(yè)的信息化提供優(yōu)秀的軟件工具和咨詢服務(wù)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI