IT评测·应用市场-qidao123.com

标题: HarmonyOS实战开发:方舟编译器运行指南-ArkCompiler [打印本页]

作者: 万万哇    时间: 2024-10-28 14:52
标题: HarmonyOS实战开发:方舟编译器运行指南-ArkCompiler
方舟编译器简介

方舟编译器(ArkCompiler)是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编译运行时平台。

要相识虚拟机的详细设计请参考 概述
环境搭建和编译

环境配置

搭建Ubuntu环境


源码获取

下载源码请参考 下载说明
代码编译

  1. 注意:下列命令需在源码根目录下执行
复制代码
说明:上述编译下令为release版本,编译debug版本需增长编译选项:--gn-args is_debug=true。
方舟相关的二进制文件在如下路径:
  1. out/rk3568/arkcompiler/runtime_core/
  2. out/rk3568/arkcompiler/ets_frontend/
  3. out/rk3568/arkcompiler/ets_runtime/
  4. out/rk3568/clang_x64/arkcompiler/runtime_core/
  5. out/rk3568/clang_x64/arkcompiler/ets_frontend/
  6. out/rk3568/clang_x64/arkcompiler/ets_runtime
复制代码
开发实例

本章节将先容基于方舟运行时的开发测试实例。
HelloWorld

运行前准备


运行hello-world.js

新建hello-world.js文件,写入以下源码:
  1. print("Hello World!!!");
复制代码
运行步调:
说明:此处“your_code_path”为源码目录路径。
反汇编hello-world.abc

编译生成反汇编工具:
  1. ./build.sh --product-name rk3568 --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages
复制代码
实行如下下令,结果输出到output.pa文件中:
  1. /your_code_path/out/rk3568/clang_x64/arkcompiler/runtime_core/ark_disasm hello-world.abc output.pa
复制代码
hello-world.abc反汇编结果如下:
  1. #
  2. # source binary: hello-world.abc
  3. #
  4. # ====================
  5. # LITERALS
  6. # ====================
  7. # RECORDS
  8. .record _ESAnnotation <external>
  9. .record _ESModuleMode {
  10.         u8 isModule
  11. }
  12. # ====================
  13. # METHODS
  14. .function any func_main_0_any_any_any_any_(any a0, any a1, any a2) <static> {
  15.         mov v2, a2
  16.         mov v1, a1
  17.         mov v0, a0
  18.         builtin.acc
  19.         sta v5
  20.         builtin.idi "print", 0x0 // 加载print函数
  21.         sta v3
  22.         lda.str "Hello World!!!"  // 加载Hello World!!!字符串
  23.         sta v4
  24.         builtin.tern3 v3, v4  // 调用print函数
  25.         builtin.acc
  26. }
复制代码
运行Test262测试用例

运行前准备

  1. ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages
复制代码
  1. ./build.sh --product-name rk3568 --build-target ets_frontend_build
复制代码
说明:编译下令实行路径为项目根目录。
运行Test262

运行run_test262.py脚本,下载及运行Test262用例。
下令行格式:
  1. python3 test262/run_test262.py [options]
复制代码
实行路径为:项目根目录/arkcompiler/ets_frontend。
  选项
  描述
  --h,--help
  帮助提示
  --dir DIR
  选定要测试的目录
  --file FILE
  选定要测试的文件
  --mode [{1, 2, 3}]
  模式选择,1:仅默认值;2:仅严格模式;3:默认模式和严格模式
  --es51
  运行Test262 ES5.1版本
  --es2015 [{all, only}]
  运行Test262 ES2015版本,all:包含的所有用例;only:仅包括ES2015
  --esnext
  运行Test262-ES.next
  --engine FILE
  运行测试的其他引擎,指定二进制文件(如:d8,hermes,jsc,qjs...)
  --babel
  是否使用Babel转换
  --timeout TIMEOUT
  设置测试超时时间(以毫秒为单位)
  --threads THREADS
  设置并行运行线程数
  --hostArgs HOSTARGS
  通报给eshost主机的下令行参数
  --ark-tool ARK_TOOL
  方舟运行时的二进制工具
  --ark-frontend-tool ARK_FRONTEND_TOOL
  方舟前端转换工具
  --libs-dir LIBS_DIR
  依赖so的路径集合,通过“:”分割
  --ark-frontend [{ts2panda, es2panda}]
  指定前端
  测试运行示例


测试输出

Test262所有用例的测试结果位于项目根目录/arkcompiler/ets_frontend/out下。shell中测试输出结果如下:
  1. $python3 test262/run_test262.py --file test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js
  2. Wait a moment..........
  3. Test command:
  4. node
  5.         test262/harness/bin/run.js
  6.         --hostType=panda
  7.         --hostPath=python3
  8.         --hostArgs='-B test262/run_sunspider.py --ark-tool=/your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_js_vm --ark-frontend-tool=/your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/build/src/index.js --libs-dir=/your_code_path/out/rk3568/clang_x64/global/i18n:/your_code_path/prebuilts/clang/ohos/linux-x86_64/llvm/lib:/your_code_path/out/rk3568/clang_x64/thirdparty/zlib/ --ark-frontend=ts2panda'
  9.         --threads=15
  10.         --mode=only strict mode
  11.         --timeout=60000
  12.         --tempDir=build/test262
  13.         --test262Dir=test262/data
  14.         --saveCompiledTests
  15.         test262/data/test_es5/language/statements/break/12.8-1.js
  16. PASS test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js (strict mode)
  17. Ran 1 tests
  18. 1 passed
  19. 0 failed
  20. used time is: 0:01:04.439642
复制代码
AOT实行

运行前准备


运行步调

说明:此处“your_code_path”为源码目录路径。
工具链使用

方舟前端工具采用下令行交互方式,支持将ArkTS代码转换为方舟字节码,使其可以或许在方舟运行时上运行。支持Windows/Linux/Mac平台。
ArkTS字节码编译工具概述

使用前端工具将ArkTS文件转换为方舟字节码文件。方舟前端工具在linux平台上可通过全量编译或指定编译前端工具链获取。
构建编译:
  1. $ ./build.sh --product-name rk3568 --build-target ets_frontend_build
复制代码
  1. $ cd out/rk3568/clang_x64/arkcompiler/ets_frontend/
  2. $ ./es2abc [options] file.js
复制代码

  选项
  描述
  取值范围
  默认值
  --debug-info
  携带debug信息
  -
  -
  --debugger-evaluate-expression
  debugger下对输入的base64情势的表达式求值
  -
  -
  --dump-assembly
  输出为汇编文件
  -
  -
  --dump-ast
  打印剖析得到的ast(抽象语法树)
  -
  -
  --dump-debug-info
  打印debug信息
  -
  -
  --dump-literal-buffer
  打印literal buffer内容
  -
  -
  --dump-size-stat
  显示字节码相关的统计信息
  -
  -
  --extension
  指定输入范例
  ['js', 'ts', 'as']
  -
  --help
  帮助提示
  -
  -
  --module
  按照ESM模式编译
  -
  -
  --opt-level
  指定编译优化等级
  ['0', '1', '2']
  0
  --output
  输出文件路径
  -
  -
  --parse-only
  只对输入文件做剖析动作
  -
  -
  --thread
  指定生成字节码时所用的线程数目
  0-呆板支持的线程数目
  0
  反汇编器工具概述

工具名称为ark_disasm,用于将二进制格式的方舟字节码文件转换为文本格式的方舟字节码文件。
编译生成反汇编工具:
  1. ./build.sh --product-name rk3568 --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages
复制代码
下令行格式:
  1. ark_disasm [选项] 输入文件 输出文件
复制代码
选项
  描述
  --debug
  使能调试信息, 如果没有指定"--debug-file", 输出情势将会是标准输出。默认值是false
  --debug-file
  调试信息输出文件路径,默认为std::cout
  --skip-string-literals
  将字符串用对应的string_ID代替,可以减少输出文件的巨细。默认值是false
  --quiet
  打开所有--skip-*选项。默认值是false
  --help
  帮助提示
  --verbose
  输出更多关于类和方法在文件中的信息。默认值是false
  输入文件:二进制格式的方舟字节码
输出文件:文本格式的方舟字节码
AOT工具概述

AOT为Ahead Of Time的简称,也即提前编译,可以或许在Host端将字节码提前编译成Target端可运行的呆板码,这样字节码可以获得充实编译优化,从而加快Target端的运行速率。
编译生成aot编译器:
  1. ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages
复制代码
下令行格式:
  1. ark_aot_compiler [选项] 输入文件
复制代码
选项描述--aot-fileAOT输出文件的路径(不需要文件后缀)。默认值:“aot_file”--compiler-opt-type-lowering利用范例信息,生成优化级别更高的呆板码。默认值:“true”--compiler-opt-max-method设置AOT编译方法的巨细阈值,当方法的巨细超过该值时,则不举行编译。默认值:“32KB”--compiler-opt-level设置AOT的优化级别。默认值:“3”--compiler-logAOT的日记选项,可打印出AOT生成的IR图、汇编码等信息。默认值“none”--compiler-log-snapshot打印与序列化有关的日记信息。默认值“false”--compiler-log-time打印AOT过程中各个优化pass的耗时环境。默认值值“false” 输入文件:二进制格式的方舟字节码
输出文件:直接实行的呆板码的an文件、存储序列化后ConstPool的ai文件(输出文件路径需使用--aot-file选项指定)
PGO工具概述

PGO为Profile-guided optimization的简称,也即配置文件引导的优化。该工具可以或许记录应用启动和性能场景中的高频(热点)函数,并将信息记录于对应的PGO Profiler文件。AOT编译器则可通过这些信息决定部分函数举行编译,从而在基本不影相应用运行性能的环境下,缩短编译时间,减少.an文件的巨细。
编译生成aot编译器和ark js虚拟机
  1. ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages
复制代码
生成PGO Profiler文件

下令行格式:
  1. ark_js_vm [选项] 输入文件
复制代码
选项描述--enable-pgo-profiler开启pgo工具。默认值:“false”--compiler-pgo-profiler-pathpgo profiler文件的保存路径。默认值:"none"--compiler-pgo-hotness-threshold热点函数的阈值,当函数的调用次数大于该值,则认为是热点函数。默认值:“2” 输入文件:二进制格式的方舟字节码
输出文件:保存有热点函数信息的ap文件
基于PGO Profiler的AOT编译

下令行格式:
  1. ark_aot_compiler [选项] 输入文件
复制代码
选项描述--compiler-pgo-profiler-pathpgo profiler文件路径。默认值:"none"--compiler-pgo-hotness-threshold使能pgo编译的函数调用次数阈值,profile文件中记录的调用次数大于该阈值的函数才会举行编译。默认值:“2” 输入文件:二进制格式的方舟字节码,ap文件
输出文件:直接实行的呆板码的an文件(基于pgo)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4