首页 > 编程语言 >不同设备如何统一语言编程平台高效开发?本文为你揭秘

不同设备如何统一语言编程平台高效开发?本文为你揭秘

时间:2023-05-09 10:33:06浏览次数:35  
标签:高效 ArkCompiler 并发 编程 TS JS 编译 揭秘 运行

 

原文: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解析器、代码最小化、压缩、美化的工具集。

 

标签:高效,ArkCompiler,并发,编程,TS,JS,编译,揭秘,运行
From: https://www.cnblogs.com/HarmonyOSDev/p/17384126.html

相关文章

  • 对比编程语言的四种错误处理方法,哪种才是最优方案?
    作者:AndreaBergia译者:豌豆花下猫@Python猫英文:Errorhandlingpatterns转载请保留作者及译者信息!错误处理是编程的一个基本要素。除非你写的是“helloworld”,否则就必须处理代码中的错误。在本文中,我将讨论各种编程语言在处理错误时使用的最常见的四种方法,并分析它们的优......
  • 编程打卡: C++ 语言程序设计
    编程打卡:C++语言程序设计#include<iostream>#include<array>usingnamespacestd;intmain(){intn;cin>>n;array<double,100000>scores;for(inti=0;i<n;i++){cin>>scores[i];}......
  • 2023.5.8编程一小时打卡
    一、问题描述:初始化int类型数组date1[]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20},应用本章的直接插入排序模板进行排序,对此函数模板稍作修改,加入输出语句,在每一个待排序元素后显示整个数组,观察排序过程中数据的变化,加深对插入排序算法的理解。二、解题思路:首先,定......
  • 在网络编程中涉及中文的编码解码的问题
    在网络编程中涉及中文需要编码解码的场景编码URLEncoder.encode("我最爱桃子了","utf-8")解码URLdecoder.decode("我最爱桃子了","utf-8");......
  • kernel module编程(四):设备属性和与上层应用的联系
     本文也即是《LinuxDeviceDrivers》一书第三章CharDrivers的读书笔记之二。 这部分开始有些觉得阴涩难懂。我上网去查,没能找到这本书的Example的例子,所以决定还是靠自己。我先写一个应用层的例子,通过这个例子来触发kernelmodule的一些操作,这样比较容易理解。#in......
  • kernel module编程(三):获取(分配或注册)设备号
    《LinuxDeviceDrivers》一书第三章CharDrivers的读书笔记之一。我们在/dev中可以查看设备节点,每个设备有一个主号码(major)以及一个副号码(minor),通常一个major号码对应某一种设备,虽然linux允许多种设备共享一个major号码。minor号码用于kernel具体进行设备的对应,kernel并不了解......
  • ThreadLocal让你的多线程编程更简单【Java多线程必备】
    一、介绍ThreadLocal是Java中的一个线程局部变量,该变量在多线程并发执行时,为每个线程都提供了一个独立的副本。简单来说,ThreadLocal提供了一种在多线程环境中,使每个线程绑定自己独立的变量的方法,每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。二、特性1.......
  • Javascript异步编程的4种方法
    你可能知道,Javascript语言的执行环境是"单线程"(singlethread)。所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须......
  • 【编程入门】应用市场(NodeJS版)
    背景前面已输出多个系列:《十余种编程语言做个计算器》《十余种编程语言写2048小游戏》《17种编程语言+10种排序算法》《十余种编程语言写博客系统》《十余种编程语言写云笔记》《N种编程语言做个记事本》目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学......
  • c#中使用 async 和 await 的异步编程
    什么是异步编程异步编程是对线程的一种应用方式。类似于人跑步时戴着耳机听歌,这两个行为可以同时进行,而不是先跑完步再听歌。异步编程就是同一时间做多件事,通常异步编程就是在继续运行原有逻辑的同时,把耗时的操作放进一个单独的线程中进行并行处理,以重复利用CPU资源以及节省总的......