1# 方舟运行时使用指南 2 3## 方舟编译器简介 4 5方舟编译器(ArkCompiler)是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编译运行时平台。 6 7* ArkCompiler主要分成两个部分:编译工具链与运行时。 8* ArkCompiler eTS Runtime主要由四个子系统组成:Core Subsystem、Execution Subsystem、Compiler Subsystem、Runtime subsystem。 9* ArkCompiler 的设计特点:原生支持类型、并发模型优化与并发API、安全。 10 11要了解虚拟机的详细设计请参考 [概述](overview-zh.md) 12 13## 环境搭建和编译 14 15### 环境配置 16 17#### 搭建Ubuntu环境 18 19- 初始环境软件安装(Ubuntu版本推荐18.04或20.04) 20 21 ``` 22 sudo apt-get update 23 sudo apt-get upgrade 24 sudo apt-get install git-lfs git bison flex gnupg build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses-dev x11proto-core-dev libx11-dev libc++1 lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 libtinfo5 bc npm genext2fs liblz4-tool libssl-dev ruby openjdk-8-jre-headless gdb python3-pip libelf-dev libxcursor-dev libxrandr-dev libxinerama-dev 25 ``` 26 27 详细Ubuntu安装搭建请参考 [搭建Ubuntu环境](https://developer.huawei.com/consumer/cn/training/course/video/C101639988048536240) 28 29#### 源码获取 30 31 下载源码请参考 [下载说明](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md) 32 33### 代码编译 34 35 注意:下列命令需在源码根目录下执行 36 371. 首次编译: 38 39 ``` 40 ./build.sh --product-name rk3568 41 ``` 422. 首次编译后增量编译方舟运行时: 43 44 编译linux-x86版本: 45 46 ``` 47 ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 48 ``` 49 50 编译oh-arm64版本: 51 52 ``` 53 ./build.sh --product-name rk3568 --gn-args use_musl=true --target-cpu arm64 --build-target ark_js_packages 54 ``` 55 56 编译oh-arm32版本: 57 58 ``` 59 ./build.sh --product-name rk3568 --build-target ark_js_packages 60 ``` 613. 首次编译后增量编译方舟前端: 62 63 ``` 64 ./build.sh --product-name rk3568 --build-target ets_frontend_build 65 ``` 66 67 更多编译命令请参考 [编译命令](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-arkcompiler-guide.md) 68 69**说明**:上述编译命令为release版本,编译debug版本需增加编译选项:--gn-args is_debug=true。 70 71方舟相关的二进制文件在如下路径: 72 73``` 74out/rk3568/arkcompiler/runtime_core/ 75out/rk3568/arkcompiler/ets_frontend/ 76out/rk3568/arkcompiler/ets_runtime/ 77out/rk3568/clang_x64/arkcompiler/runtime_core/ 78out/rk3568/clang_x64/arkcompiler/ets_frontend/ 79out/rk3568/clang_x64/arkcompiler/ets_runtime 80``` 81 82## 开发实例 83 84本章节将介绍基于方舟运行时的开发测试实例。 85 86### HelloWorld 87 88#### 运行前准备 89 90* 编译编译方舟运行时和方舟前端 91 92 ``` 93 ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages --build-target ets_frontend_build 94 ``` 95 96#### 运行hello-world.js 97 98新建hello-world.js文件,写入以下源码: 99 100``` 101print("Hello World!!!"); 102``` 103 104运行步骤: 105 1061. 通过方舟前端生成hello-world.abc文件,编译命令: 107 108 ``` 109 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc hello-world.js 110 ``` 111 1122. 执行hello-world.abc文件: 113 114 1. 设置搜索路径: 115 116 ``` 117 export LD_LIBRARY_PATH=/your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime:/your_code_path/prebuilts/clang/ohos/linux-x86_64/llvm/lib:/your_code_path/out/rk3568/clang_x64/thirdparty/zlib 118 ``` 119 2. 执行ark\_js\_vm: 120 121 ``` 122 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_js_vm hello-world.abc 123 ``` 124 125 执行结果如下: 126 127 ``` 128 Hello World!!! 129 ``` 130 131**说明**:此处“_your_code_path_”为源码目录路径。 132 133#### 反汇编hello-world.abc 134 135编译生成反汇编工具: 136 137``` 138./build.sh --product-name rk3568 --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages 139``` 140 141执行如下命令,结果输出到output.pa文件中: 142 143``` 144/your_code_path/out/rk3568/clang_x64/arkcompiler/runtime_core/ark_disasm hello-world.abc output.pa 145``` 146 147hello-world.abc反汇编结果如下: 148 149``` 150# 151# source binary: hello-world.abc 152# 153 154# ==================== 155# LITERALS 156 157# ==================== 158# RECORDS 159 160.record _ESAnnotation <external> 161 162.record _ESModuleMode { 163 u8 isModule 164} 165 166# ==================== 167# METHODS 168 169.function any func_main_0_any_any_any_any_(any a0, any a1, any a2) <static> { 170 mov v2, a2 171 mov v1, a1 172 mov v0, a0 173 builtin.acc 174 sta v5 175 builtin.idi "print", 0x0 // 加载print函数 176 sta v3 177 lda.str "Hello World!!!" // 加载Hello World!!!字符串 178 sta v4 179 builtin.tern3 v3, v4 // 调用print函数 180 builtin.acc 181} 182``` 183 184### 运行Test262测试用例 185 186#### 运行前准备 187 1881. 编译方舟运行时,编译命令: 189 190``` 191./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 192``` 193 1942. 编译方舟前端,编译命令: 195 196``` 197./build.sh --product-name rk3568 --build-target ets_frontend_build 198``` 199 200**说明**:编译命令执行路径为项目根目录。 201 202#### 运行Test262 203 204运行run\_test262.py脚本,下载及运行Test262用例。 205 206命令行格式: 207 208``` 209python3 test262/run_test262.py [options] 210``` 211 212执行路径为:项目根目录/arkcompiler/ets_frontend。 213 214<table><thead align="left"><tr id="row101462717303"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p51552743010"><a name="p51552743010"></a><a name="p51552743010"></a>选项</p> 215</th> 216<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p11592710304"><a name="p11592710304"></a><a name="p11592710304"></a>描述</p> 217</th> 218</tr> 219</thead> 220<tbody><tr id="row2015172763014"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p171592710306"><a name="p171592710306"></a><a name="p171592710306"></a>--h,--help</p> 221</td> 222<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p13151527133011"><a name="p13151527133011"></a><a name="p13151527133011"></a>帮助提示</p> 223</td> 224</tr> 225<tr id="row1015527173015"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p1615182712308"><a name="p1615182712308"></a><a name="p1615182712308"></a>--dir DIR</p> 226</td> 227<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p9556101593120"><a name="p9556101593120"></a><a name="p9556101593120"></a>选定要测试的目录</p> 228</td> 229</tr> 230<tr id="row1015112763020"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p1815182733012"><a name="p1815182733012"></a><a name="p1815182733012"></a>--file FILE</p> 231</td> 232<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1615627173019"><a name="p1615627173019"></a><a name="p1615627173019"></a>选定要测试的文件</p> 233</td> 234</tr> 235<tr id="row131515277307"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p111572716304"><a name="p111572716304"></a><a name="p111572716304"></a>--mode [{1, 2, 3}]</p> 236</td> 237<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1655718513105"><a name="p1655718513105"></a><a name="p1655718513105"></a>模式选择,1:仅默认值;2:仅严格模式;3:默认模式和严格模式</p> 238</td> 239</tr> 240<tr id="row1815112753020"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p2151927193015"><a name="p2151927193015"></a><a name="p2151927193015"></a>--es51</p> 241</td> 242<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1715312588115"><a name="p1715312588115"></a><a name="p1715312588115"></a>运行Test262 ES5.1版本</p> 243</td> 244</tr> 245<tr id="row1915182703012"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p17151527133017"><a name="p17151527133017"></a><a name="p17151527133017"></a>--es2015 [{all, only}]</p> 246</td> 247<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p15761152983113"><a name="p15761152983113"></a><a name="p15761152983113"></a>运行Test262 ES2015版本,all:包含的所有用例;only:仅包括ES2015</p> 248</td> 249</tr> 250<tr id="row10924204611109"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p18924846111013"><a name="p18924846111013"></a><a name="p18924846111013"></a>--esnext</p> 251</td> 252<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p15495042191410"><a name="p15495042191410"></a><a name="p15495042191410"></a>运行Test262-ES.next</p> 253</td> 254</tr> 255<tr id="row5161145010105"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p716125071020"><a name="p716125071020"></a><a name="p716125071020"></a>--engine FILE</p> 256</td> 257<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p121612050181014"><a name="p121612050181014"></a><a name="p121612050181014"></a>运行测试的其他引擎,指定二进制文件(如:d8,hermes,jsc,qjs...)</p> 258</td> 259</tr> 260<tr id="row1325585931120"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p112561595112"><a name="p112561595112"></a><a name="p112561595112"></a>--babel</p> 261</td> 262<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p32561959111112"><a name="p32561959111112"></a><a name="p32561959111112"></a>是否使用Babel转换</p> 263</td> 264</tr> 265<tr id="row95230818126"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p12523158191210"><a name="p12523158191210"></a><a name="p12523158191210"></a>--timeout TIMEOUT</p> 266</td> 267<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p65233871210"><a name="p65233871210"></a><a name="p65233871210"></a>设置测试超时时间(以毫秒为单位)</p> 268</td> 269</tr> 270<tr id="row474911612120"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p1274912166123"><a name="p1274912166123"></a><a name="p1274912166123"></a>--threads THREADS</p> 271</td> 272<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p4749121631210"><a name="p4749121631210"></a><a name="p4749121631210"></a>设置并行运行线程数</p> 273</td> 274</tr> 275<tr id="row561512363122"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p26152036191218"><a name="p26152036191218"></a><a name="p26152036191218"></a>--hostArgs HOSTARGS</p> 276</td> 277<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p156151636161215"><a name="p156151636161215"></a><a name="p156151636161215"></a>传递给eshost主机的命令行参数</p> 278</td> 279</tr> 280<tr id="row77091648111210"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p18709164871213"><a name="p18709164871213"></a><a name="p18709164871213"></a>--ark-tool ARK_TOOL</p> 281</td> 282<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p16709194812126"><a name="p16709194812126"></a><a name="p16709194812126"></a>方舟运行时的二进制工具</p> 283</td> 284</tr> 285<tr id="row3767145231210"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p3767155201216"><a name="p3767155201216"></a><a name="p3767155201216"></a>--ark-frontend-tool ARK_FRONTEND_TOOL</p> 286</td> 287<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p4767195251220"><a name="p4767195251220"></a><a name="p4767195251220"></a>方舟前端转换工具</p> 288</td> 289</tr> 290<tr id="row753817001311"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p553870111318"><a name="p553870111318"></a><a name="p553870111318"></a>--libs-dir LIBS_DIR</p> 291</td> 292<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p35384041313"><a name="p35384041313"></a><a name="p35384041313"></a>依赖so的路径集合,通过“:”分割</p> 293</td> 294</tr> 295<tr id="row08504716135"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p11851747161314"><a name="p11851747161314"></a><a name="p11851747161314"></a>--ark-frontend [{ts2panda, es2panda}]</p> 296</td> 297<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1085144712137"><a name="p1085144712137"></a><a name="p1085144712137"></a>指定前端</p> 298</td> 299</tr> 300</tbody> 301</table> 302 303#### 测试运行示例 304 305- 运行ES51测试用例: 306 307 ``` 308 python3 test262/run_test262.py --es51 309 ``` 310- 仅运行ES2015测试用例: 311 312 ``` 313 python3 test262/run_test262.py --es2015 314 ``` 315- 仅运行ES2021测试用例: 316 317 ``` 318 python3 test262/run_test262.py --es2021 only 319 320 ``` 321- 运行ES2015和ES51和ES2021所有测试用例: 322 323 ``` 324 python3 test262/run_test262.py --es2021 all 325 ``` 326- 运行单一测试用例: 327 328 ``` 329 python3 test262/run_test262.py --file test262/data/test_es5/language/statements/break/12.8-1.js 330 ``` 331- 运行某目录下所有测试用例: 332 333 ``` 334 python3 test262/run_test262.py --dir test262/data/test_es5/language/statements 335 ``` 336- 使用\`babel\`把单个测试用例转换成es5后再运行: 337 338 ``` 339 python3 test262/run_test262.py --babel --file test262/data/test_es5/language/statements/break/12.8-1.js 340 ``` 341 342#### 测试输出 343 344Test262所有用例的测试结果位于项目根目录/arkcompiler/ets_frontend/out下。shell中测试输出结果如下: 345 346``` 347$python3 test262/run_test262.py --file test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js 348 349Wait a moment.......... 350Test command: 351node 352 test262/harness/bin/run.js 353 --hostType=panda 354 --hostPath=python3 355 --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' 356 --threads=15 357 --mode=only strict mode 358 --timeout=60000 359 --tempDir=build/test262 360 --test262Dir=test262/data 361 --saveCompiledTests 362 test262/data/test_es5/language/statements/break/12.8-1.js 363 364PASS test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js (strict mode) 365Ran 1 tests 3661 passed 3670 failed 368used time is: 0:01:04.439642 369``` 370 371### AOT执行 372 373#### 运行前准备 374 375* 编译生成AOT编译器: 376 377 ``` 378 ./build.sh --product-name rk3568 --build-target ets_frontend_build --build-target ark_js_host_linux_tools_packages --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages 379 ``` 380 381* 新建hello-world.ts文件,写入以下源码: 382 383 ``` 384 declare function print(arg:any):string; 385 print('Hello World!!!') 386 ``` 387 388#### 运行步骤 389 3901. 通过方舟前端生成hello-world.abc文件,编译命令: 391 392 ``` 393 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc --module --merge-abc hello-world.ts 394 ``` 3952. 设置搜索路径: 396 397 ``` 398 export LD_LIBRARY_PATH=/your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime:/your_code_path/prebuilts/clang/ohos/linux-x86_64/llvm/lib:/your_code_path/out/rk3568/clang_x64/thirdparty/icu:/your_code_path/out/rk3568/clang_x64/thirdparty/zlib 399 ``` 4003. 运行ark\_js\_vm,采集PGO信息,生成的PGO信息落盘在文件hello-world.ap: 401 ``` 402 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_js_vm --enable-pgo-profiler=true --compiler-pgo-profiler-path=hello-world.ap --entry-point=hello-world hello-world.abc 403 ``` 4044. 通过AOT编译器生成an和ai文件,可以通过info日志观察到被编译的函数列表: 405 406 ``` 407 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_aot_compiler --enable-pgo-profiler=true --compiler-pgo-profiler-path=hello-world.ap --log-level=info --aot-file=./hello-world hello-world.abc 408 ``` 4095. 执行ark\_js\_vm: 410 411 ``` 412 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_js_vm --aot-file=./hello-world --entry-point=hello-world hello-world.abc 413 ``` 414 415 执行结果如下: 416 417 ``` 418 Hello World!!! 419 ``` 420 421**说明**:此处“_your_code_path_”为源码目录路径。 422 423## 工具链使用 424 425方舟前端工具采用命令行交互方式,支持将ArkTS代码转换为方舟字节码,使其能够在方舟运行时上运行。支持Windows/Linux/Mac平台。 426 427### ArkTS字节码编译工具概述 428 429使用前端工具将ArkTS文件转换为方舟字节码文件。方舟前端工具在linux平台上可通过全量编译或指定编译前端工具链获取。 430 431构建编译: 432 433``` 434$ ./build.sh --product-name rk3568 --build-target ets_frontend_build 435``` 436 437``` 438$ cd out/rk3568/clang_x64/arkcompiler/ets_frontend/ 439$ ./es2abc [options] file.js 440``` 441 442<a name="table2035444615599"></a> 443 444<table><thead align="left"><tr id="row535415467591"><th class="cellrowborder" valign="top" width="12.898710128987101%" id="mcps1.1.6.1.1"><p id="p13354134619595"><a name="p13354134619595"></a><a name="p13354134619595"></a>选项</p> 445</th> 446<th class="cellrowborder" valign="top" width="19.33806619338066%" id="mcps1.1.6.1.3"><p id="p157281281906"><a name="p157281281906"></a><a name="p157281281906"></a>描述</p> 447</th> 448<th class="cellrowborder" valign="top" width="25.82741725827417%" id="mcps1.1.6.1.4"><p id="p103276335016"><a name="p103276335016"></a><a name="p103276335016"></a>取值范围</p> 449</th> 450<th class="cellrowborder" valign="top" width="35.066493350664935%" id="mcps1.1.6.1.5"><p id="p1835494695915"><a name="p1835494695915"></a><a name="p1835494695915"></a>默认值</p> 451</th> 452</tr> 453</thead> 454<tbody><tr id="row1435412465598"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p881325510017"><a name="p881325510017"></a><a name="p881325510017"></a>--debug-info</p> 455</td> 456<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p072882813015"><a name="p072882813015"></a><a name="p072882813015"></a>携带debug信息</p> 457</td> 458<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p10327833305"><a name="p10327833305"></a><a name="p10327833305"></a>-</p> 459</td> 460<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p076075115014"><a name="p076075115014"></a><a name="p076075115014"></a>-</p> 461</td> 462</tr> 463<tr id="row1435412465598"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p881325510017"><a name="p881325510017"></a><a name="p881325510017"></a>--debugger-evaluate-expression</p> 464</td> 465<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p072882813015"><a name="p072882813015"></a><a name="p072882813015"></a>debugger下对输入的base64形式的表达式求值</p> 466</td> 467<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p10327833305"><a name="p10327833305"></a><a name="p10327833305"></a>-</p> 468</td> 469<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p076075115014"><a name="p076075115014"></a><a name="p076075115014"></a>-</p> 470</td> 471</tr> 472<tr id="row3355346105920"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p163552462595"><a name="p163552462595"></a><a name="p163552462595"></a>--dump-assembly</p> 473</td> 474<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p127284281905"><a name="p127284281905"></a><a name="p127284281905"></a>输出为汇编文件</p> 475</td> 476<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p93278335012"><a name="p93278335012"></a><a name="p93278335012"></a>-</p> 477</td> 478<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p1976019511306"><a name="p1976019511306"></a><a name="p1976019511306"></a>-</p> 479</td> 480</tr> 481<tr id="row9355174675912"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p6355104616592"><a name="p6355104616592"></a><a name="p6355104616592"></a>--dump-ast</p> 482</td> 483<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p187287280015"><a name="p187287280015"></a><a name="p187287280015"></a>打印解析得到的ast(抽象语法树)</p> 484</td> 485<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p932819331104"><a name="p932819331104"></a><a name="p932819331104"></a>-</p> 486</td> 487<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p1475975114013"><a name="p1475975114013"></a><a name="p1475975114013"></a>-</p> 488</td> 489</tr> 490<tr id="row53551046175917"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p13575501218"><a name="p13575501218"></a><a name="p13575501218"></a>--dump-debug-info</p> 491</td> 492<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p1372811281608"><a name="p1372811281608"></a><a name="p1372811281608"></a>打印debug信息</p> 493</td> 494<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p133287335020"><a name="p133287335020"></a><a name="p133287335020"></a>-</p> 495</td> 496<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p37585513019"><a name="p37585513019"></a><a name="p37585513019"></a>-</p> 497</td> 498</tr> 499<tr id="row8355204635911"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p657125010117"><a name="p657125010117"></a><a name="p657125010117"></a>--dump-literal-buffer</p> 500</td> 501<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p77281528704"><a name="p77281528704"></a><a name="p77281528704"></a>打印literal buffer内容</p> 502</td> 503<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p83281633208"><a name="p83281633208"></a><a name="p83281633208"></a>-</p> 504</td> 505<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p17580511404"><a name="p17580511404"></a><a name="p17580511404"></a>-</p> 506</td> 507</tr> 508<tr id="row6355124665910"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p105611505114"><a name="p105611505114"></a><a name="p105611505114"></a>--dump-size-stat</p> 509</td> 510<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p20728192819015"><a name="p20728192819015"></a><a name="p20728192819015"></a>显示字节码相关的统计信息</p> 511</td> 512<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p1332810331508"><a name="p1332810331508"></a><a name="p1332810331508"></a>-</p> 513</td> 514<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p157577519014"><a name="p157577519014"></a><a name="p157577519014"></a>-</p> 515</td> 516</tr> 517<tr id="row235584610599"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p95515501012"><a name="p95515501012"></a><a name="p95515501012"></a>--extension</p> 518</td> 519<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p37282028600"><a name="p37282028600"></a><a name="p37282028600"></a>指定输入类型</p> 520</td> 521<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p133281033804"><a name="p133281033804"></a><a name="p133281033804"></a>['js', 'ts', 'as']</p> 522</td> 523<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p675665112019"><a name="p675665112019"></a><a name="p675665112019"></a>-</p> 524</td> 525</tr> 526<tr id="row135584635915"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p4551501217"><a name="p4551501217"></a><a name="p4551501217"></a>--help</p> 527</td> 528<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p157285282020"><a name="p157285282020"></a><a name="p157285282020"></a>帮助提示</p> 529</td> 530<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p1532819334016"><a name="p1532819334016"></a><a name="p1532819334016"></a>-</p> 531</td> 532<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p475510516018"><a name="p475510516018"></a><a name="p475510516018"></a>-</p> 533</td> 534</tr> 535<tr id="row133555461596"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p3541550416"><a name="p3541550416"></a><a name="p3541550416"></a>--module</p> 536</td> 537<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p27281728502"><a name="p27281728502"></a><a name="p27281728502"></a>按照ESM模式编译</p> 538</td> 539<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p832833312018"><a name="p832833312018"></a><a name="p832833312018"></a>-</p> 540</td> 541<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p1975514517020"><a name="p1975514517020"></a><a name="p1975514517020"></a>-</p> 542</td> 543</tr> 544<tr id="row23556463595"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p135313506120"><a name="p135313506120"></a><a name="p135313506120"></a>--opt-level</p> 545</td> 546<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p97284281607"><a name="p97284281607"></a><a name="p97284281607"></a>指定编译优化等级</p> 547</td> 548<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p43281335010"><a name="p43281335010"></a><a name="p43281335010"></a>['0', '1', '2']</p> 549</td> 550<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p57545511102"><a name="p57545511102"></a><a name="p57545511102"></a>0</p> 551</td> 552</tr> 553<tr id="row5356124655916"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p185311501910"><a name="p185311501910"></a><a name="p185311501910"></a>--output</p> 554</td> 555<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p1872818281006"><a name="p1872818281006"></a><a name="p1872818281006"></a> 556输出文件路径</p> 557</td> 558<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p73281733408"><a name="p73281733408"></a><a name="p73281733408"></a>-</p> 559</td> 560<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p77537511606"><a name="p77537511606"></a><a name="p77537511606"></a>-</p> 561</td> 562</tr> 563<tr id="row1335654635915"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p175213504115"><a name="p175213504115"></a><a name="p175213504115"></a>--parse-only</p> 564</td> 565<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p20729728003"><a name="p20729728003"></a><a name="p20729728003"></a>只对输入文件做解析动作</p> 566</td> 567<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p4328533205"><a name="p4328533205"></a><a name="p4328533205"></a>-</p> 568</td> 569<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p175385118014"><a name="p175385118014"></a><a name="p175385118014"></a>-</p> 570</td> 571</tr> 572<tr id="row1335654635915"><td class="cellrowborder" valign="top" width="12.898710128987101%" headers="mcps1.1.6.1.1 "><p id="p175213504115"><a name="p175213504115"></a><a name="p175213504115"></a>--thread</p> 573</td> 574<td class="cellrowborder" valign="top" width="19.33806619338066%" headers="mcps1.1.6.1.3 "><p id="p20729728003"><a name="p20729728003"></a><a name="p20729728003"></a>指定生成字节码时所用的线程数目</p> 575</td> 576<td class="cellrowborder" valign="top" width="25.82741725827417%" headers="mcps1.1.6.1.4 "><p id="p4328533205"><a name="p4328533205"></a><a name="p4328533205"></a>0-机器支持的线程数目</p> 577</td> 578<td class="cellrowborder" valign="top" width="35.066493350664935%" headers="mcps1.1.6.1.5 "><p id="p175385118014"><a name="p175385118014"></a><a name="p175385118014"></a>0</p> 579</td> 580</tr> 581</tbody> 582</table> 583 584### 反汇编器工具概述 585 586工具名称为ark\_disasm,用于将二进制格式的方舟字节码文件转换为文本格式的方舟字节码文件。 587 588编译生成反汇编工具: 589 590``` 591./build.sh --product-name rk3568 --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages 592``` 593 594命令行格式: 595 596``` 597ark_disasm [选项] 输入文件 输出文件 598``` 599 600<table><thead align="left"><tr id="row125182553217"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p175162514327"><a name="p175162514327"></a><a name="p175162514327"></a>选项</p> 601</th> 602<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p6512255324"><a name="p6512255324"></a><a name="p6512255324"></a>描述</p> 603</th> 604</tr> 605</thead> 606<tbody><tr id="row5511825103218"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p45172513326"><a name="p45172513326"></a><a name="p45172513326"></a>--debug</p> 607</td> 608<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1245695053215"><a name="p1245695053215"></a><a name="p1245695053215"></a>使能调试信息, 如果没有指定"--debug-file", 输出形式将会是标准输出。默认值是false</p> 609</td> 610</tr> 611<tr id="row951112515321"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p451192515323"><a name="p451192515323"></a><a name="p451192515323"></a>--debug-file</p> 612</td> 613<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p175142583210"><a name="p175142583210"></a><a name="p175142583210"></a>调试信息输出文件路径,默认为std::cout</p> 614</td> 615</tr> 616<tr id="row951112515321"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p451192515323"><a name="p451192515323"></a><a name="p451192515323"></a>--skip-string-literals</p> 617</td> 618<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p175142583210"><a name="p175142583210"></a><a name="p175142583210"></a>将字符串用对应的string_ID代替,可以减少输出文件的大小。默认值是false</p> 619</td> 620</tr> 621<tr id="row951112515321"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p451192515323"><a name="p451192515323"></a><a name="p451192515323"></a>--quiet</p> 622</td> 623<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p175142583210"><a name="p175142583210"></a><a name="p175142583210"></a>打开所有--skip-*选项。默认值是false</p> 624</td> 625</tr> 626<tr id="row45116253325"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p85116259328"><a name="p85116259328"></a><a name="p85116259328"></a>--help</p> 627</td> 628<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p1348135833214"><a name="p1348135833214"></a><a name="p1348135833214"></a>帮助提示</p> 629</td> 630</tr> 631<tr id="row194197407327"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p154205401325"><a name="p154205401325"></a><a name="p154205401325"></a>--verbose</p> 632</td> 633<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p369871173312"><a name="p369871173312"></a><a name="p369871173312"></a>输出更多关于类和方法在文件中的信息。默认值是false</p> 634</td> 635</tr> 636</tbody> 637</table> 638 639输入文件:二进制格式的方舟字节码 640 641输出文件:文本格式的方舟字节码 642 643### AOT工具概述 644 645AOT为Ahead Of Time的简称,也即提前编译,能够在Host端将字节码提前编译成Target端可运行的机器码,这样字节码可以获得充分编译优化,从而加速Target端的运行速度。 646 647编译生成aot编译器: 648 649``` 650./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 651``` 652 653命令行格式: 654 655``` 656ark_aot_compiler [选项] 输入文件 657``` 658 659| 选项 | 描述 | 660| ----------------------- | ----------------------------------------------------------------------------------- | 661| --aot-file | AOT输出文件的路径(不需要文件后缀)。默认值:“aot_file” | 662| --compiler-opt-type-lowering | 利用类型信息,生成优化级别更高的机器码。默认值:“true” | 663| --compiler-opt-max-method | 设置AOT编译方法的大小阈值,当方法的大小超过该值时,则不进行编译。默认值:“32KB” | 664| --compiler-opt-level | 设置AOT的优化级别。默认值:“3” | 665| --compiler-log | AOT的日志选项,可打印出AOT生成的IR图、汇编码等信息。默认值“none” | 666| --compiler-log-snapshot | 打印与序列化有关的日志信息。默认值“false” | 667| --compiler-log-time | 打印AOT过程中各个优化pass的耗时情况。默认值值“false” | 668 669 670输入文件:二进制格式的方舟字节码 671 672输出文件:直接执行的机器码的an文件、存储序列化后ConstPool的ai文件(输出文件路径需使用--aot-file选项指定) 673 674### PGO工具概述 675 676PGO为Profile-guided optimization的简称,也即配置文件引导的优化。该工具能够记录应用启动和性能场景中的高频(热点)函数,并将信息记录于对应的PGO Profiler文件。AOT编译器则可通过这些信息决策部分函数进行编译,从而在基本不影响应用运行性能的情况下,缩短编译时间,减少.an文件的大小。 677 678编译生成aot编译器和ark js虚拟机 679 680``` 681./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 682``` 683 684### 生成PGO Profiler文件 685 686命令行格式: 687 688``` 689ark_js_vm [选项] 输入文件 690``` 691 692| 选项 | 描述 | 693| ----------------------- | ----------------------------------------------------------------------------------- | 694| --enable-pgo-profiler | 开启pgo工具。默认值:“false” | 695| --compiler-pgo-profiler-path | pgo profiler文件的保存路径。默认值:"none" | 696| --compiler-pgo-hotness-threshold | 热点函数的阈值,当函数的调用次数大于该值,则认为是热点函数。默认值:“2” | 697 698输入文件:二进制格式的方舟字节码 699 700输出文件:保存有热点函数信息的ap文件 701 702### 基于PGO Profiler的AOT编译 703 704命令行格式: 705 706``` 707ark_aot_compiler [选项] 输入文件 708``` 709| 选项 | 描述 | 710| ----------------------- | ----------------------------------------------------------------------------------- | 711| --compiler-pgo-profiler-path | pgo profiler文件路径。默认值:"none" | 712| --compiler-pgo-hotness-threshold | 使能pgo编译的函数调用次数阈值,profile文件中记录的调用次数大于该阈值的函数才会进行编译。默认值:“2”| 713 714输入文件:二进制格式的方舟字节码,ap文件 715 716输出文件:直接执行的机器码的an文件(基于pgo) 717