自開源以來,方舟編程體系已經逐步開始成熟,編譯器、引擎和除錯器等陸續開放,這次開源的是JavaScript引擎,和Java引擎一樣,都是基于統一的編譯器生成的MapleIR,圖一顯示了引擎(紅色部分)在整個方舟體系中的位置,

圖一、方舟體系示意圖
由于依托統一的MapleIR來執行,所以引擎在很大程度上是跟高級語言無關的,當然,不同語言的特性要分別支持,引擎可以在多語言運行環境下執行JavaScript程式,實作C/C++/Java/JavaScript等多語言程式混合執行,基于此實作的除錯器也可以實作多語言除錯,
方舟多語言引擎分為靜態和動態型別兩類,分別處理靜態型別語言(statically typed language,比如Java)和動態型別編程語言(Dynamically typed language,比如JavaScript),靜態型別程式在編譯時就可以確定資料型別,編譯后的程式只有顯式資料型別轉換,而動態型別程式需在運行時確定資料型別,對資料型別的操作也有較大的差異,運行階段需要做隱式型別轉換,為了減少運行時性能開銷,我們設計了這兩類方舟多語言引擎,在函式層面可完成多語言程式混合執行,方舟JavaScript 引擎屬于動態型別,而之前推出的Java引擎則屬于靜態型別,
方舟JavaScript 引擎可支持JavaScript應用開發,在IoT(物聯網)和手機設備上運行JavaScript應用,JavaScript應用開發框架一般采用多種編程語言實作,即兼顧了功能易擴展性(JavaScript),又保證了運行時高性能(如C/C++),JS應用的開發也有類似的需求,方舟編程體系的多語言聯合編譯恰好滿足了這樣的需求,而JavaScript 引擎成為其中重要的一環,
這次推出的方舟JS引擎涉及了方舟編程體系的多個部件,比如編譯器JS前端(目前暫時用SpiderMonkey,后續用MapleFE替換),JS后端,JS運行時,及JS除錯器等,圖二顯示了引擎的主要作業模塊,JavaScript應用或框架程式經前端處理,轉換為Maple IR的中間代碼,方舟編譯器可進一步優化并由后端產生MapleIR 指令代碼,再由方舟JavaScript 引擎執行這些MapleIR代碼,運行時確定資料型別,做合適的型別轉換,

圖二、方舟JavaScript引擎結構示意圖
方舟JavaScript 引擎實作了大部分ECMAScript 5.1標準,由于JavaScript語言的動態語言特性,比如eval()和 Function建構式,可以在運行時創建JS代碼并運行,這就需要JavaScript前端在運行時做語法分析并產生代碼,暫時沒有實作,后續會集成自研的MapleFE實作全部功能,另外事件驅動架構和ECMA-402標準暫沒有實作,
這次方舟JS引擎實作了絕大多數的基本功能,但如果想獲得高性能的JavaScript引擎,首先需要增加的是方舟JIT(Just-in-time)編譯器,方舟JIT編譯器可以依據運行時的型別資訊以及其他程式動態資訊做相應的假設,進行程式優化,該JIT編譯器是基于方舟編譯器的,本次開源不包含JIT編譯器,將在下一次發布時推出,
方舟引擎以及方舟體系還有很大的改進空間,愿和開源社區朋友一起努力完善它,
Maple引擎代碼倉:
https://gitee.com/openarkcompiler-incubator/maple_engine
開源方舟編譯器微信公眾號

微信號:openarkcompiler
功能介紹:方舟編譯器是為支持多種編程語言、多種芯片平臺的聯合編譯、運行而設計的統一編程平臺
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271638.html
標籤:其他
下一篇:一個大專生小白寫學c
