#打卡不停更#【FFH】浅析OpenHarmony方舟运行时 原创
@TOC
浅析OpenHarmony方舟运行时
开发人员写的JS代码,系统是无法直接读懂的,具体系统是怎么读懂的呢?就关系到我们这篇文章要讲的OpenHamony方舟运行时。
JS VM (JavaScript Virtual Machine)
在说方舟运行时之前,我们先来看看上一小节看到的JS VM (JavaScript Virtual Machine),
刚开始看到这个名称肯定会感觉很陌生。
首先说一下什么是虚拟机(Virtual Machine)
,指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,在实体计算机中能够完成的工作在虚拟机中都能够实现。用通俗的话一句话概括,虚拟机就是一个模拟电脑的应用程序,在这个应用程序里面,你可以干任何能在实体计算机上干的事。这个模拟的电脑里面有相应的操作系统,还有其他实体物理计算机所拥有的环境,并且该虚拟电脑是一个独立的个体,和其他系统互不干扰。
那什么是JS VM (JavaScript Virtual Machine)
呢?JS VM(JS虚拟机)也称为 JavaScript 引擎
,程序员写的JS代码系统是无法直接执行的,因为系统根本看不懂JS代码,那就需要一个角色去翻译,然后去执行翻译之后的代码,这个角色可以认为是JS VM
。
总的来说,JS VM是一个专门处理JavaScript代码的虚拟机,用于解析和执行JavaScript脚本代码。
方舟编译器JS运行时(ArkCompiler JS Runtime)
在OpenHarmony中,ArkCompiler JS Runtime
就可以认为是一个JS VM或者JavaScript引擎,ArkCompiler JS Runtime分成两个部分,分别是JS编译工具链
与JS运行时
。JS工具链将JS源码
编译成方舟字节码(ArkCompiler Bytecode)
,JS运行时负责执行
生成的方舟字节码(后续如无特殊说明,字节码特指方舟字节码)。
以下是JS编译链架构图:
ArkCompiler JS Runtime的源码编译器接收JS源码的输入,再由ts2abc(将JavaScript文件转换为方舟字节码的工具)生成abc文件(方舟字节码文件)。
如下图,JS编译工具链生成的方舟字节码文件再作为输入源,输入到JS Runtime并直接运行字节码文件。
JS Runtime主要由四个子系统组成:
-
Core Subsystem
Core Subsystem主要由与语言无关的基础运行库组成,包括承载字节码的ArkCompiler File组件、支持Debugger的Tooling组件、负责对应系统调用的ArkCompiler Base库组件等。
-
JS Execution Subsystem
执行引擎包含执行字节码的解释器、缓存隐藏类和内联缓存、以及剖析记录运行时类型的Profiler。
-
JS Compiler Subsystem
编译子系统包含Stub编译器、基于Circuit IR的优化编译框架和代码生成器。
-
JS Runtime subsystem
运行时子系统包含了各种JS运行相关的模块:
- 内存管理:对象分配器与垃圾回收器(并发标记和部分内存压缩的CMS-GC和Partial-Compressing-GC)
- 分析工具:DFX工具、cpu和heap的profiling工具
- 并发管理:actor并发模型中的abc文件管理器
- 标准库:Ecmascript规范定义的标准库、高效的container容器库与对象模型
- 其他:异步工作队列、TypeScript类型加载、跟C++交互的JSNAPI接口等。
最后方舟字节码通过JS Runtime的四个子系统,就可以让机器读懂开发人员写的JS代码,最终实现对应的JS语义逻辑。
方舟编译器看来确实功能强大