原文:https://mp.weixin.qq.com/s/8UHznZenc7A_UICta2bETg,点击链接查看更多技术内容。

随着数字化时代的倒退,手机、平板、PC、电视、智能手表、车机等智能设施的普及率越来越高,但不同设施往往搭载了不同的操作系统。面对不同的操作系统与开发框架,利用开发难度大、老本高;同时,不同设施之间交互匮乏、体验割裂,难以为用户带来一致性的利用交互体验。

HarmonyOS是一款面向全场景的分布式操作系统,可能兼容手机、平板、PC、智慧屏、智能手表、车机等智能设施。咱们晓得,HarmonyOS利用开发须要应用高级编程语言,包含TypeScript(以下简称“TS”)、JavaScript(以下简称“JS”)、基于TS加强的ArkTS等,还须要配套相应的工具链和运行时实现高效开发和运行。面对不同设施,开发者如何应用同一套利用框架开发利用,让用户取得对立的利用交互体验呢?

基于此,方舟编译器(以下称“ArkCompiler”)应运而生。ArkCompiler反对ArkTS/TS利用事后编译优化机器码,带来高性能的运行体验;同时,ArkCompiler的并发实例启动更加轻快,并且提供混同字节码能力,无效晋升了源码的安全性。ArkCompiler助力开发者更加高效、便捷、平安地开发HarmonyOS利用。

一、什么是ArkCompiler

ArkCompiler作为HarmonyOS利用开发的对立编程平台,蕴含编译器、工具链、运行时等关键部件,反对ArkTS、TS、JS等高级编程语言的开发、调试调优、运行等业务。

接下来,咱们来看一下ArkCompiler编译工具链与运行时的架构。

编译工具链架构

ArkCompiler的编译工具链以ArkTS/TS/JS源码作为输出,将其编译生成为abc(ArkCompiler Bytecode,即方舟字节码)文件。


运行时架构

ArkCompiler运行时蕴含了执行引擎、内存管理器、语言内建规范库等部件,间接运行字节码文件,实现对应语言标准的语义逻辑。

二、ArkCompiler的性能亮点

动静类型语言因为运行前无奈确定对象类型,须要等程序运行一段时间后,JIT Compiler(Just-In-Time Compiler,即时编译器)能力依据抓取到的运行信息明确对象类型并编译生成对应的优化机器码。

而动态类型语言则能够依据确定的对象类型,间接编译生成对应的优化机器码,启动即可取得高性能,二者的启动性能差别比较显著。


编译优化视角次要区别

基于JS拓展出类型概念的TS曾经成为了前十风行的语言,然而业界目前并没有间接运行TS的引擎,如需运行TS,要先将TS转换成JS,再通过JS引擎运行。那么,TS的类型信息也就在转换过程中抛弃了,运行时无奈接管类型信息并作相应的优化。然而咱们发现,大部分状况下,JS程序中的对象类型是繁多固定的,这也表明JS的对象类型大部分状况下放弃不变。TS的类型是不是也能够在代码运行前间接做编译优化呢?

2.1 业界JS引擎计划
JS开发者间接把源码打到利用包里,当运行时,引擎解析JS源码须要先将JS源码编译成字节码,而后再执行字节码。引擎抓取分析一些运行时的信息,再应用JIT Compiler在运行时编译生成优化机器码,最初能力执行优化机器码,这样能力以比拟高的性能执行JS。


业界JS引擎计划

2.2 ArkCompiler的劣势

高性能ArkTS引擎—AOT编译

咱们后面曾经剖析过,大部分状况下,JS的对象类型放弃不变,而TS又会携带对象类型。因而,ArkCompiler让ArkTS/TS可能持平动态语言的启动性能,其实就是利用语言里的类型信息,让ArkTS/TS像动态语言一样能够间接编译生成优化机器码。

Bytecode Compiler(字节码编译器)会生成带类型的字节码,AOT Compiler(Ahead-Of-Time Compiler,事后编译器)会依据类型字节码预生成相干的类型对象,联合PGO1的配置文件信息,进行编译优化最终生成对应的优化机器码。

ArkCompiler反对利用运行前就编译出优化机器码和字节码。当利用在挪动设施上首次运行时,就能够间接运行高性能优化机器码了。

三、ArkCompiler的并发亮点


并发实例运行比照

3.1 业界JS引擎的Actor并发模型
上图左侧是业界并发实例的运行状况,因为JS是一门单线程语言,JS引擎在设计之初也没有思考多线程运行的反对和优化。

从Actor并发模型的示例图中,咱们能够看出,每一个并发实例都创立了一个残缺的引擎实例来反对运行。它的劣势在于,类Actor的接口能够让开发者不须要关怀共享状态和锁,容易保护和测试,而且非常容易把并发实例迁徙成分布式的服务。不过在挪动利用的场景中,这样的实现也是HTML标准把Web Worker形容成启动慢并且内存开销大的次要起因。

3.2 ArkCompiler的Lite Actor并发劣势
上图右侧是ArkCompiler实现并发的运行状况。ArkCompiler的Lite Actor的实现,本质还是Actor模型,然而通过共享过程内各并发实例之间的不可变对象,把基础设施分层和轻量化,在各实例之间重用了一些公共基础设施,让并发实例运行更轻快。ArkCompiler的实现中,新增一个并发实例只须要拉起相应独有的局部。

基于此,咱们和浏览器头部引擎做了一个比照,在肯定负载下,咱们的并发启动工夫和启动内存获得了显著晋升。依据试验数据表明,相较于业界的计划,Lite Actor并发实例启动工夫和启动内存均优化了50%。

四、ArkCompiler的安全性亮点


字节码混同比照

4.1 业界JS引擎的安全性
现行的JS引擎,往往采纳只有名称混同的UglifyJS2,利用包中的源码也是可见可调试,商业利用源码的安全性绝对较差。

4.2 ArkCompiler的安全性劣势
在ArkCompiler中,Hap包蕴含了混同后的字节码,相较于间接携带源码,进步了开发者代码的安全性。

HarmonyOS的代码爱护,打包的是二进制的ArkCompiler字节码。即便通过ArkCompiler编译运行时提供的Disassembler反编译,也只有字节码能被看到,无奈间接批改调试运行。

五、总结

目前,运行在ArkCompiler上的开发语言ArkTS,在TS的根底上次要拓展了申明式范式和状态模式的UI编程。往后咱们会在动态模式、并发、平安等方面继续加强,让ArkTS成为更卓越的利用开发语言。

面对IoT时代的倒退,咱们会联合HarmonyOS利用生态、开发体验和用户体验等方面的需要,让ArkCompiler与硬件、操作系统、开发框架、编程语言协同设计优化;同时,在多语言对立编译运行和多设施反对的根底上,ArkCompiler让HarmonyOS利用的开发和运行效率显著晋升。

将来,ArkCompiler在继续优化根底体验的同时,会更进一步联合HarmonyOS万物互联的需要,在跨端迁徙、多端协同等翻新场景,从编译器和运行时等方面提供底层的解决方案和优化机制,晋升分布式应用的开发和运行体验。

阐明:
1. PGO即Profile guided optimization,是一种基于性能剖析(profiling)的编译优化技术。

2. UglifyJS是前端开发打包的最常用工具之一,蕴含JS解析器、代码最小化、压缩、丑化的工具集。