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#### 源码获取 28 29 下载源码请参考 [下载说明](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md) 30 31### 代码编译 32 33 注意:下列命令需在源码根目录下执行 34 351. 首次编译: 36 37 ``` 38 ./build.sh --product-name rk3568 39 ``` 402. 首次编译后增量编译方舟运行时: 41 42 编译linux-x86版本: 43 44 ``` 45 ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 46 ``` 47 48 编译oh-arm64版本: 49 50 ``` 51 ./build.sh --product-name rk3568 --gn-args use_musl=true --target-cpu arm64 --build-target ark_js_packages 52 ``` 53 54 编译oh-arm32版本: 55 56 ``` 57 ./build.sh --product-name rk3568 --build-target ark_js_packages 58 ``` 593. 首次编译后增量编译方舟前端: 60 61 ``` 62 ./build.sh --product-name rk3568 --build-target ets_frontend_build 63 ``` 64 65 更多编译命令请参考 [编译命令](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-arkcompiler-guide.md) 66 67**说明**:上述编译命令为release版本,编译debug版本需增加编译选项:--gn-args is_debug=true。 68 69方舟相关的二进制文件在如下路径: 70 71``` 72out/rk3568/arkcompiler/runtime_core/ 73out/rk3568/arkcompiler/ets_frontend/ 74out/rk3568/arkcompiler/ets_runtime/ 75out/rk3568/clang_x64/arkcompiler/runtime_core/ 76out/rk3568/clang_x64/arkcompiler/ets_frontend/ 77out/rk3568/clang_x64/arkcompiler/ets_runtime 78``` 79 80## 开发实例 81 82本章节将介绍基于方舟运行时的开发测试实例。 83 84### HelloWorld 85 86#### 运行前准备 87 88* 编译编译方舟运行时和方舟前端 89 90 ``` 91 ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages --build-target ets_frontend_build 92 ``` 93 94#### 运行hello-world.js 95 96新建hello-world.js文件,写入以下源码: 97 98``` 99print("Hello World!!!"); 100``` 101 102运行步骤: 103 1041. 通过方舟前端生成hello-world.abc文件,编译命令: 105 106 ``` 107 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc hello-world.js 108 ``` 109 1102. 执行hello-world.abc文件: 111 112 1. 设置搜索路径: 113 114 ``` 115 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 116 ``` 117 2. 执行ark\_js\_vm: 118 119 ``` 120 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_js_vm hello-world.abc 121 ``` 122 123 执行结果如下: 124 125 ``` 126 Hello World!!! 127 ``` 128 129**说明**:此处“_your_code_path_”为源码目录路径。 130 131#### 反汇编hello-world.abc 132 133编译生成反汇编工具: 134 135``` 136./build.sh --product-name rk3568 --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages 137``` 138 139执行如下命令,结果输出到output.pa文件中: 140 141``` 142/your_code_path/out/rk3568/clang_x64/arkcompiler/runtime_core/ark_disasm hello-world.abc output.pa 143``` 144 145hello-world.abc反汇编结果如下: 146 147``` 148# 149# source binary: hello-world.abc 150# 151 152# ==================== 153# LITERALS 154 155# ==================== 156# RECORDS 157 158.record _ESAnnotation <external> 159 160.record _ESModuleMode { 161 u8 isModule 162} 163 164# ==================== 165# METHODS 166 167.function any func_main_0_any_any_any_any_(any a0, any a1, any a2) <static> { 168 mov v2, a2 169 mov v1, a1 170 mov v0, a0 171 builtin.acc 172 sta v5 173 builtin.idi "print", 0x0 // 加载print函数 174 sta v3 175 lda.str "Hello World!!!" // 加载Hello World!!!字符串 176 sta v4 177 builtin.tern3 v3, v4 // 调用print函数 178 builtin.acc 179} 180``` 181 182### 运行Test262测试用例 183 184#### 运行前准备 185 1861. 编译方舟运行时,编译命令: 187 188``` 189./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 190``` 191 1922. 编译方舟前端,编译命令: 193 194``` 195./build.sh --product-name rk3568 --build-target ets_frontend_build 196``` 197 198**说明**:编译命令执行路径为项目根目录。 199 200#### 运行Test262 201 202运行run\_test262.py脚本,下载及运行Test262用例。 203 204命令行格式: 205 206``` 207python3 test262/run_test262.py [options] 208``` 209 210执行路径为:项目根目录/arkcompiler/ets_frontend。 211 212<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> 213</th> 214<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> 215</th> 216</tr> 217</thead> 218<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> 219</td> 220<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> 221</td> 222</tr> 223<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> 224</td> 225<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> 226</td> 227</tr> 228<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> 229</td> 230<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> 231</td> 232</tr> 233<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> 234</td> 235<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> 236</td> 237</tr> 238<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> 239</td> 240<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> 241</td> 242</tr> 243<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> 244</td> 245<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> 246</td> 247</tr> 248<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> 249</td> 250<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> 251</td> 252</tr> 253<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> 254</td> 255<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> 256</td> 257</tr> 258<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> 259</td> 260<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> 261</td> 262</tr> 263<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> 264</td> 265<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> 266</td> 267</tr> 268<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> 269</td> 270<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> 271</td> 272</tr> 273<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> 274</td> 275<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> 276</td> 277</tr> 278<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> 279</td> 280<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> 281</td> 282</tr> 283<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> 284</td> 285<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> 286</td> 287</tr> 288<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> 289</td> 290<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> 291</td> 292</tr> 293<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> 294</td> 295<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> 296</td> 297</tr> 298</tbody> 299</table> 300 301#### 测试运行示例 302 303- 运行ES51测试用例: 304 305 ``` 306 python3 test262/run_test262.py --es51 307 ``` 308- 仅运行ES2015测试用例: 309 310 ``` 311 python3 test262/run_test262.py --es2015 312 ``` 313- 仅运行ES2021测试用例: 314 315 ``` 316 python3 test262/run_test262.py --es2021 only 317 318 ``` 319- 运行ES2015和ES51和ES2021所有测试用例: 320 321 ``` 322 python3 test262/run_test262.py --es2021 all 323 ``` 324- 运行单一测试用例: 325 326 ``` 327 python3 test262/run_test262.py --file test262/data/test_es5/language/statements/break/12.8-1.js 328 ``` 329- 运行某目录下所有测试用例: 330 331 ``` 332 python3 test262/run_test262.py --dir test262/data/test_es5/language/statements 333 ``` 334- 使用\`babel\`把单个测试用例转换成es5后再运行: 335 336 ``` 337 python3 test262/run_test262.py --babel --file test262/data/test_es5/language/statements/break/12.8-1.js 338 ``` 339 340#### 测试输出 341 342Test262所有用例的测试结果位于项目根目录/arkcompiler/ets_frontend/out下。shell中测试输出结果如下: 343 344``` 345$python3 test262/run_test262.py --file test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js 346 347Wait a moment.......... 348Test command: 349node 350 test262/harness/bin/run.js 351 --hostType=panda 352 --hostPath=python3 353 --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' 354 --threads=15 355 --mode=only strict mode 356 --timeout=60000 357 --tempDir=build/test262 358 --test262Dir=test262/data 359 --saveCompiledTests 360 test262/data/test_es5/language/statements/break/12.8-1.js 361 362PASS test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js (strict mode) 363Ran 1 tests 3641 passed 3650 failed 366used time is: 0:01:04.439642 367``` 368 369### AOT执行 370 371#### 运行前准备 372 373* 编译生成AOT编译器: 374 375 ``` 376 ./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 377 ``` 378 379* 新建hello-world.ts文件,写入以下源码: 380 381 ``` 382 declare function print(arg:any):string; 383 print('Hello World!!!') 384 ``` 385 386#### 运行步骤 387 3881. 通过方舟前端生成hello-world.abc文件,编译命令: 389 390 ``` 391 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc --module --merge-abc hello-world.ts 392 ``` 3932. 设置搜索路径: 394 395 ``` 396 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 397 ``` 3983. 运行ark\_js\_vm,采集PGO信息,生成的PGO信息落盘在文件hello-world.ap: 399 ``` 400 /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 401 ``` 4024. 通过AOT编译器生成an和ai文件,可以通过info日志观察到被编译的函数列表: 403 404 ``` 405 /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 406 ``` 4075. 执行ark\_js\_vm: 408 409 ``` 410 /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_runtime/ark_js_vm --aot-file=./hello-world --entry-point=hello-world hello-world.abc 411 ``` 412 413 执行结果如下: 414 415 ``` 416 Hello World!!! 417 ``` 418 419**说明**:此处“_your_code_path_”为源码目录路径。 420 421## 工具链使用 422 423方舟前端工具采用命令行交互方式,支持将ArkTS代码转换为方舟字节码,使其能够在方舟运行时上运行。支持Windows/Linux/Mac平台。 424 425### ArkTS字节码编译工具概述 426 427使用前端工具将ArkTS文件转换为方舟字节码文件。方舟前端工具在linux平台上可通过全量编译或指定编译前端工具链获取。 428 429构建编译: 430 431``` 432$ ./build.sh --product-name rk3568 --build-target ets_frontend_build 433``` 434 435``` 436$ cd out/rk3568/clang_x64/arkcompiler/ets_frontend/ 437$ ./es2abc [options] file.js 438``` 439 440<a name="table2035444615599"></a> 441 442<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> 443</th> 444<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> 445</th> 446<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> 447</th> 448<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> 449</th> 450</tr> 451</thead> 452<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> 453</td> 454<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> 455</td> 456<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> 457</td> 458<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> 459</td> 460</tr> 461<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> 462</td> 463<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> 464</td> 465<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> 466</td> 467<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> 468</td> 469</tr> 470<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> 471</td> 472<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> 473</td> 474<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> 475</td> 476<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> 477</td> 478</tr> 479<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> 480</td> 481<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> 482</td> 483<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> 484</td> 485<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> 486</td> 487</tr> 488<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> 489</td> 490<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> 491</td> 492<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> 493</td> 494<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> 495</td> 496</tr> 497<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> 498</td> 499<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> 500</td> 501<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> 502</td> 503<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> 504</td> 505</tr> 506<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> 507</td> 508<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> 509</td> 510<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> 511</td> 512<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> 513</td> 514</tr> 515<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> 516</td> 517<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> 518</td> 519<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> 520</td> 521<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> 522</td> 523</tr> 524<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> 525</td> 526<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> 527</td> 528<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> 529</td> 530<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> 531</td> 532</tr> 533<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> 534</td> 535<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> 536</td> 537<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> 538</td> 539<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> 540</td> 541</tr> 542<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> 543</td> 544<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> 545</td> 546<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> 547</td> 548<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> 549</td> 550</tr> 551<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> 552</td> 553<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> 554输出文件路径</p> 555</td> 556<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> 557</td> 558<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> 559</td> 560</tr> 561<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> 562</td> 563<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> 564</td> 565<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> 566</td> 567<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> 568</td> 569</tr> 570<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> 571</td> 572<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> 573</td> 574<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> 575</td> 576<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> 577</td> 578</tr> 579</tbody> 580</table> 581 582### 反汇编器工具概述 583 584工具名称为ark\_disasm,用于将二进制格式的方舟字节码文件转换为文本格式的方舟字节码文件。 585 586编译生成反汇编工具: 587 588``` 589./build.sh --product-name rk3568 --build-target arkcompiler/runtime_core:ark_host_linux_tools_packages 590``` 591 592命令行格式: 593 594``` 595ark_disasm [选项] 输入文件 输出文件 596``` 597 598<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> 599</th> 600<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> 601</th> 602</tr> 603</thead> 604<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> 605</td> 606<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> 607</td> 608</tr> 609<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> 610</td> 611<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> 612</td> 613</tr> 614<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> 615</td> 616<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> 617</td> 618</tr> 619<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> 620</td> 621<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> 622</td> 623</tr> 624<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> 625</td> 626<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> 627</td> 628</tr> 629<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> 630</td> 631<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> 632</td> 633</tr> 634</tbody> 635</table> 636 637输入文件:二进制格式的方舟字节码 638 639输出文件:文本格式的方舟字节码 640 641### AOT工具概述 642 643AOT为Ahead Of Time的简称,也即提前编译,能够在Host端将字节码提前编译成Target端可运行的机器码,这样字节码可以获得充分编译优化,从而加速Target端的运行速度。 644 645编译生成aot编译器: 646 647``` 648./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 649``` 650 651命令行格式: 652 653``` 654ark_aot_compiler [选项] 输入文件 655``` 656 657| 选项 | 描述 | 658| ----------------------- | ----------------------------------------------------------------------------------- | 659| --aot-file | AOT输出文件的路径(不需要文件后缀)。默认值:“aot_file” | 660| --compiler-opt-type-lowering | 利用类型信息,生成优化级别更高的机器码。默认值:“true” | 661| --compiler-opt-max-method | 设置AOT编译方法的大小阈值,当方法的大小超过该值时,则不进行编译。默认值:“32KB” | 662| --compiler-opt-level | 设置AOT的优化级别。默认值:“3” | 663| --compiler-log | AOT的日志选项,可打印出AOT生成的IR图、汇编码等信息。默认值“none” | 664| --compiler-log-snapshot | 打印与序列化有关的日志信息。默认值“false” | 665| --compiler-log-time | 打印AOT过程中各个优化pass的耗时情况。默认值值“false” | 666 667 668输入文件:二进制格式的方舟字节码 669 670输出文件:直接执行的机器码的an文件、存储序列化后ConstPool的ai文件(输出文件路径需使用--aot-file选项指定) 671 672### PGO工具概述 673 674PGO为Profile-guided optimization的简称,也即配置文件引导的优化。该工具能够记录应用启动和性能场景中的高频(热点)函数,并将信息记录于对应的PGO Profiler文件。AOT编译器则可通过这些信息决策部分函数进行编译,从而在基本不影响应用运行性能的情况下,缩短编译时间,减少.an文件的大小。 675 676编译生成aot编译器和ark js虚拟机 677 678``` 679./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages 680``` 681 682### 生成PGO Profiler文件 683 684命令行格式: 685 686``` 687ark_js_vm [选项] 输入文件 688``` 689 690| 选项 | 描述 | 691| ----------------------- | ----------------------------------------------------------------------------------- | 692| --enable-pgo-profiler | 开启pgo工具。默认值:“false” | 693| --compiler-pgo-profiler-path | pgo profiler文件的保存路径。默认值:"none" | 694| --compiler-pgo-hotness-threshold | 热点函数的阈值,当函数的调用次数大于该值,则认为是热点函数。默认值:“2” | 695 696输入文件:二进制格式的方舟字节码 697 698输出文件:保存有热点函数信息的ap文件 699 700### 基于PGO Profiler的AOT编译 701 702命令行格式: 703 704``` 705ark_aot_compiler [选项] 输入文件 706``` 707| 选项 | 描述 | 708| ----------------------- | ----------------------------------------------------------------------------------- | 709| --compiler-pgo-profiler-path | pgo profiler文件路径。默认值:"none" | 710| --compiler-pgo-hotness-threshold | 使能pgo编译的函数调用次数阈值,profile文件中记录的调用次数大于该阈值的函数才会进行编译。默认值:“2”| 711 712输入文件:二进制格式的方舟字节码,ap文件 713 714输出文件:直接执行的机器码的an文件(基于pgo) 715