共计 3051 个字符,预计需要花费 8 分钟才能阅读完成。
原文: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 解析器、代码最小化、压缩、丑化的工具集。