不同设备如何统一语言编程平台高效开发?本文为你揭秘
原文: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 解析器、代码最小化、压缩、美化的工具集。
评论