自开源以来,方舟编程体系已经逐步开始成熟,编译器、引擎和调试器等陆续开放。这次开源的是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
功能介绍:方舟编译器是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程平台