原文:不同设备如何统一语言编程平台高效开发?本文为你揭秘,点击链接查看更多技术内容。
随着数字化时代的发展,手机、平板、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解析器、代码最小化、压缩、美化的工具集。