[編譯] Mono的新解釋器

来源:http://www.cnblogs.com/Crazy7/archive/2017/11/14/7833202.html
-Advertisement-
Play Games

原文鏈接:http://www.mono-project.com/news/2017/11/13/mono-interpreter/ Mono即將通過它的JIT編譯器和靜態編譯器以及一個.net解釋器以帶來一些新的方式來運行你的代碼. 在2001年Mono項目誕生之時,我們為.net指令集實現了一個 ...


原文鏈接:http://www.mono-project.com/news/2017/11/13/mono-interpreter/

 

Mono即將通過它的JIT編譯器和靜態編譯器以及一個.net解釋器以帶來一些新的方式來運行你的代碼.

2001年Mono項目誕生之時,我們為.net指令集實現了一個解釋器用基於它實現了一個在Linux上的自托管的.net開發環境.

當時我們把解釋器定義為一個用來構建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開發環境 

為瞭解決這些問題同時支持MS內部的一些產品,我們決定重啟Mono解釋器項目,  它將伴隨著一個twist歸來.

 

新的Mono解釋器 

我們複活了Mono解釋器並升級了它對.net的支持, 添加了對泛型的支持並將它升級到最新版的.net, 下一步準備為它添加混合模擬執行的支持

這是Mono在現在可以支持WebAssembly的方式之一 (另外一種就是通過LLVM靜態編譯) 

這個解釋器目前已經是Mono主線的一部分而且已經通過了我們大部分測試,你可以通過從源代碼編譯Mono而現在就可以開始通過以下方式使用它: 

$ mono --interpreter yourassembly.exe

 

混合執行模式 

目前解釋器本身已經成形,我們正在努力的實現通過配置使得我們可以將解釋代碼和靜態編譯代碼或者JIT後的代碼混合,我們稱之為混合模式執行

對於iOS, PalyStatition以及Xbox之類的平臺來說,這意味著你可以預編譯你的核心庫或者核心程式, 同時又可以支持動態載入和執行代碼. 得到你所有的核心庫通過LLVM優化的好處的同時仍然具備靈活的運行動態代碼的能力.

這將允許游戲開發者們在他們的系統中使用.net語言來實現原型,測試以及調整他們的游戲而不需要重新編譯程式.

它還將為使用. NET 語言的設備上運行可腳本化應用程式打開大門

 

將來的工作

我們正在通過擴展解釋器的能力以滿足很多有意思的場景,下麵是一些擺在我們面前的項目:

 

靜態編譯Mono的提升

在全AOT編譯的Mono版本(iOS, 游戲主機)上我們無法發佈任何System.Reflection.Emit的實現,因為平臺無法支持,但是現在我們有瞭解釋器,我們可以支持了.

下麵是幾個相關的應用.

 System.Linq.Expressions API被廣泛用於像Entity Framework或者使用C#編譯器將表達式轉化為表達式樹等高級場景下,你也許見過類似以下場景的代碼

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

在全AOT場景下, 我們支持Entity Framework和上面邏輯的方式是為Expression類製作一個解釋器. 這個表達式解釋器有很多限制,而且影響很大.

通過啟用解釋器支持下的System.Reflection.Emit我們可以刪除很多代碼.

這也會允許為.net構建的腳本語言可以在靜態編譯環境下運行, 比如IronPython, IronRuby and IronScheme.

為了達到這些目的, 我們正在努力的為混合模式執行工作. 這意味著解釋代碼可以與已有的靜態編譯代碼協同工作

 

更好的隔離

在上面我提到了我們之前沒做好的一個場景就是通過熱載入代碼使開發人員可以實時部署和調整他們的游戲代碼

我們即將通過完成對AppDomains的支持來滿足這個需求

 

正在研究的混合模式選項

 這個解釋器是運行一些代碼的輕量選擇. 我們發現一些特殊程式在被解釋時的速度超過了被JIT引擎執行的速度

 我們計划去探索一種混合執行方式,有時被稱為分層編譯

 我們可以讓解釋器執行已知的性能不敏感代碼 - 比如, 靜態構造器或者其他只執行一次的初始化代碼以助於減少記憶體占用以及代碼生成和執行時間.

 另外一個考慮是先在解釋模式下運行代碼, 當我們超過了某些門檻時切換到JIT引擎來執行,或者使用Attribute來標記哪些方法值得去優化.

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.1 概述 c#程式開發中,資料庫操作無疑是舉足輕重的,資料庫部分的技術點可能占整個c#技術點的1/4。這幾天我一直在研究System.Data.OracleClient.dll反編譯之後的.CS,放棄c#的心都有了,底層代碼不僅全是英文註釋,而且有很多東西看都看不懂,讓我深刻體會封裝的重要性!此 ...
  • 今天是第一次接觸C#,由於長時間的做Java開發,突然轉到C#非常的不自然,但是也有了一些收穫,給大家分享一下 ...
  • "sweetalert": "^1.1.3",記住這個參數,Abp中這個組件只能用這個版本,高於它的message會沒有效果,切記 ...
  • 回到目錄 進行dotnetcore之後,各種對象都是基於DI進行生產的,這就有了對象的生命周期一說,早在autofac里也有相關知識點,這與Microsoft.Extensions.DependencyInjection是完全溫和的,方便大家理解,在講今天的組件化之前,先對DI的三種生命周期進行理解 ...
  • 大致要實現的 效果如下 1,添加Controller(用到的X.PagedList 註意到nuget添加) 2,視圖 另外還有_createTaskPartial,_EditTaskPartial 等,這裡就不貼代碼了 以上。。。 參考http://www.jianshu.com/p/620c20f ...
  • 最近在練習EF的過程中,實現將Linq返回的結果綁定到Combox時出錯。 錯誤提示如下: System.NotSupportedException:“Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery, DbRawS... ...
  • 一,一些相關解釋 Service 在應用服務層也就是application層。應用服務用於將領域(業務)邏輯暴露給展現層。展現層通過傳入DTO(數據傳輸對象)參數來調用應用服務,而應用服務通過領域對象來執行相應的業務邏輯並且將DTO返回給展現層。 也就是這樣避免了應用服務層和展現層的,直接數據交互, ...
  • Parallel Programming-實現並行操作的流水線(生產者、消費者) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...