• Home
Name
Date
Size
#Lines
LOC

..--

figures/12-May-2024-

README.mdD12-May-2024246 95

README_zh.mdD12-May-202435.9 KiB717571

aot-guide_zh.mdD12-May-20243.5 KiB7967

development-example.mdD12-May-202413.6 KiB317244

environment-setup-and-compilation.mdD12-May-20241.4 KiB5236

overview-zh.mdD12-May-20243.9 KiB5332

overview.mdD12-May-20245.3 KiB5229

using-the-toolchain.mdD12-May-202415 KiB208190

README.md

1 # ArkCompiler JS Runtime Usage Guide
2 
3 -   [Overview](overview.md)
4 -   [Environment Setup and Compilation](environment-setup-and-compilation.md)
5 -   [Development Example](development-example.md)
6 -   [Using the Toolchain](using-the-toolchain.md)
7 
8 
9 

README_zh.md

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 
37 1. 首次编译:
38 
39    ```
40    ./build.sh --product-name rk3568
41    ```
42 2. 首次编译后增量编译方舟运行时:
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    ```
61 3. 首次编译后增量编译方舟前端:
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 ```
74 out/rk3568/arkcompiler/runtime_core/
75 out/rk3568/arkcompiler/ets_frontend/
76 out/rk3568/arkcompiler/ets_runtime/
77 out/rk3568/clang_x64/arkcompiler/runtime_core/
78 out/rk3568/clang_x64/arkcompiler/ets_frontend/
79 out/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 ```
101 print("Hello World!!!");
102 ```
103 
104 运行步骤:
105 
106 1. 通过方舟前端生成hello-world.abc文件,编译命令:
107 
108    ```
109    /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc hello-world.js
110    ```
111 
112 2. 执行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 
147 hello-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 
188 1. 编译方舟运行时,编译命令:
189 
190 ```
191 ./build.sh --product-name rk3568 --build-target ark_js_host_linux_tools_packages
192 ```
193 
194 2. 编译方舟前端,编译命令:
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 ```
209 python3 test262/run_test262.py [options]
210 ```
211 
212 执行路径为:项目根目录/arkcompiler/ets_frontend213 
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 
344 Test262所有用例的测试结果位于项目根目录/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 
349 Wait a moment..........
350 Test command:
351 node
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 
364 PASS test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js (strict mode)
365 Ran 1 tests
366 1 passed
367 0 failed
368 used 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 
390 1. 通过方舟前端生成hello-world.abc文件,编译命令:
391 
392    ```
393    /your_code_path/out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc --module --type-extractor --merge-abc hello-world.ts
394    ```
395 2. 设置搜索路径:
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       ```
400 3. 运行ark\_js\_vm,采集PGO信息,生成的PGO信息落盘在文件hello-world.ap401       ```
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       ```
404 4. 通过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       ```
409 5. 执行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 ```
597 ark_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 
645 AOT为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 ```
656 ark_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 
676 PGO为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 ```
689 ark_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 ```
707 ark_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