From 92c802449297550b99f8eef64b93cf0ad8093bde Mon Sep 17 00:00:00 2001 From: DaiH Date: Thu, 24 Mar 2022 11:59:23 +0800 Subject: [PATCH] Revision Of ARK-Runtime-Subsystem's Doc Signed-off-by: DaiH Revision Of ARK-Runtime-Subsystem's Doc https: //gitee.com/openharmony/docs/pulls/2124/commits Change-Id: Ib545835e44ea3b956468cf4e3469aa8ad87ee753 --- zh-cn/readme/ARK-Runtime-Subsystem-zh.md | 48 ++++++++++++------ .../figures/zh-cn_image_ark-js-arch.png | Bin 0 -> 34397 bytes 2 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 zh-cn/readme/figures/zh-cn_image_ark-js-arch.png diff --git a/zh-cn/readme/ARK-Runtime-Subsystem-zh.md b/zh-cn/readme/ARK-Runtime-Subsystem-zh.md index 20db506985..4880e24045 100644 --- a/zh-cn/readme/ARK-Runtime-Subsystem-zh.md +++ b/zh-cn/readme/ARK-Runtime-Subsystem-zh.md @@ -8,40 +8,56 @@ ## 简介 -方舟\(ARK\)是华为自研的统一编程平台,包含编译器、工具链、运行时等关键部件,支持高级语言在多种芯片平台的编译与运行,并支撑OpenHarmony操作系统及其应用和服务运行在手机、个人电脑、平板、电视、汽车和智能穿戴等多种设备上的需求。本次开源的ARK-JS提供的能力是在OpenHarmony标准系统\(standard system\)中编译和运行JavaScript语言\(本文后面简称JS\)。 +方舟编译器\(ArkCompiler\)是OpenHarmony内置的组件化、可配置的多语言编译和运行平台,包含编译器、工具链、运行时等核心部件,支持高级编程语言在多种芯片平台上编译与运行,并支撑OpenHarmony标准操作系统及其应用和服务运行在手机、个人电脑、平板、电视、汽车和智能穿戴等多种设备上的需求。开源的ArkCompiler JS Runtime提供的能力是在OpenHarmony操作系统中编译和运行JavaScript语言\(本文后面简称JS\)。 -本次开源的ARK-JS分成两个部分,分别是JS编译工具链与JS运行时。JS工具链将JS源码编译成方舟字节码\(ARK Bytecode\),JS运行时负责执行生成的方舟字节码\(后续如无特殊说明,字节码特指方舟字节码\)。 +ArkCompiler JS Runtime分成两个部分,分别是JS编译工具链与JS运行时。JS工具链将JS源码编译成方舟字节码\(ArkCompiler Bytecode\),JS运行时负责执行生成的方舟字节码\(后续如无特殊说明,字节码特指方舟字节码\)。 -JS编译工具链架构: +图1 JS编译工具链架构: ![](figures/zh-cn_image_ark_frontend.png) -JS前端编译器,将JavaScript源码解析为AST\( Abstract Syntax Tree\)后,经过AST变换、字节码生成器、寄存器分配后由native emiter产生方舟字节码文件\(abc文件\) +ArkCompiler JS Runtime的源码编译器接收JS源码的输入,再由ts2abc(将JavaScript文件转换为字节码的工具)生成abc文件。 -JS运行时(Runtime)架构: +图2 JS运行时\(Ark-JS-Runtime\)架构: -![](figures/zh-cn_image_ark_runtime.png) +![](figures/zh-cn_image_ark-js-arch.png) -ARK-JS Runtime以方舟字节码文件作为输入并直接运行字节码文件,实现对应的JS语义逻辑。 +ArkCompiler JS Runtime以方舟字节码文件作为输入并直接运行字节码文件,实现对应的JS语义逻辑。 -ARK-JS Runtime主要由四个部分组成: +JS Runtime主要由四个子系统组成: -- Core Runtime +- Core Subsystem - Core Runtime主要由语言无关的基础运行库组成,包括承载字节码的ARK File组件、支持Debugger的Tooling组件、负责对应系统调用的ARK Base组件等。 + Core Subsystem主要由与语言无关的基础运行库组成,包括承载字节码的ArkCompiler File组件、支持Debugger的Tooling组件、负责对应系统调用的ArkCompiler Base库组件等。 -- Execution Engine +- JS Execution Subsystem - 执行引擎目前包含执行字节码的解释器、缓存隐藏类和内联缓存、以及剖析记录运行时类型的Profiler。 + 执行引擎包含执行字节码的解释器、缓存隐藏类和内联缓存、以及剖析记录运行时类型的Profiler。 -- ECMAScript Runtime +- JS Compiler Subsystem - ECMAScript Runtime则包含了各种JS对象的分配器、垃圾回收器、以及用以支撑ECMAScript规范的内部运行库。 + 编译子系统包含Stub编译器、基于Circuit IR的优化编译框架和代码生成器。 -- AFFI \(ARK Foreign Function Interface\) +- JS Runtime subsystem + + 运行时子系统包含了各种JS运行相关的模块: + - 内存管理:对象分配器与垃圾回收器\(并发标记和部分内存压缩的CMS-GC和Partial-Compressing-GC\) + - 分析工具:DFX工具、cpu和heap的profiling工具 + - 并发管理:actor并发模型中的abc文件管理器 + - 标准库:Ecmascript规范定义的标准库、高效的container容器库与对象模型 + - 其他:异步工作队列、TypeScript类型加载、跟C++交互的JSNAPI接口等。 - AFFI是ARK JS运行时的C++语言外部函数接口。 +**ArkCompiler-JS的设计特点:** +- ArkCompiler JS Runtime的主要设计目标,是为OpenHarmony操作系统提供JavaScript/TypeScript应用程序执行引擎,而不是作为浏览器中的JavaScript执行引擎。 + +- 为了提升应用的执行性能和安全性,ArkCompiler JS Runtime选择将JaveScript/TypeScript程序预先静态编译为方舟字节码(带上静态类型信息),从而减少运行时的编译和类型信息收集开销。另外出于安全性和性能的考虑,ArkCompiler JS Runtime选择不支持eval和只支持strict模式的代码。 + +- 原生支持TypeScript:目前业界通用的执行方式是把TS转化为JS,再通过JS运行时来执行。ArkJS规划在ts2abc编译TS源码时,会推导分析TS的类型信息并传递给ArkCompiler JS运行时。运行时直接利用类型信息静态生成内联缓存(inline caching)从而加速字节码执行。另外,ArkJS规划中的TSAOT \(Ahead-of-Time\) Compiler,可以利用ts2abc传递的类型信息,直接编译生成高质量的机器码,使得应用可以直接以机器码形式运行,提升运行性能。 + +- 轻量级Actor并发模型:ECMAScript没有提供并发规范,业界JS引擎的实现中常用Actor并发模型。此模型下执行体之间不共享任何数据,通过消息机制进行通信。业界当前实现的JS Actor模型(web-worker)有启动速度慢、内存占用高这些缺陷。为了利用设备的多核能力获得更好的性能提升,ArkCompiler JS Runtime需要提供启动快、内存占用少的Actor实现。目前ArkCompiler JS运行时已经实现在Actor内存隔离模型的基础上,共享actor实例中的不可变或者不易变的对象(方法和字节码),后续继续共享内建代码块、常量字符串等等,来提升JS Actor的启动性能和节省内存开销,达到实现轻量级Actor并发模型的目标。 + +- TypeScript/C++的跨语言交互:在OpenHarmony操作系统平台API实现中,通常需要面临C/C++代码访问和操作TS对象的场景。对这个业务场景,Ark-JS规划可以根据TS程序中的class声明和运行时约定,静态生成包含TS对象布局描述的C/C++头文件,以及操作这些TS对象的C/C++实现库。在C/C++代码中,通过包含TS对象描述头文件以及链接对应实现库,实现直接操作TS对象的效果。由于TS类型或其内在布局并非总是固定不变的,因此在TS对象操作的代码实现中,会插入类型检查,如果对象类型或布局在运行时发生变化,则回退执行通用的慢速路径。 ## 目录 diff --git a/zh-cn/readme/figures/zh-cn_image_ark-js-arch.png b/zh-cn/readme/figures/zh-cn_image_ark-js-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..4e34094c9c82cd80881078df9b5e5904dbe98a61 GIT binary patch literal 34397 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 E052%TEdT%j literal 0 HcmV?d00001 -- GitLab