1# 开发实例<a name="ZH-CN_TOPIC_0000001128096218"></a> 2 3- [开发实例<a name="ZH-CN_TOPIC_0000001128096218"></a>](#开发实例) 4 - [HelloWorld<a name="section105987593810"></a>](#helloworld) 5 - [运行前准备](#运行前准备) 6 - [运行hello-world.js](#运行hello-worldjs) 7 - [反汇编hello-world.abc](#反汇编hello-worldabc) 8 - [运行Test262测试用例<a name="section118471435115815"></a>](#运行test262测试用例) 9 - [运行前准备](#运行前准备-1) 10 - [运行Test262](#运行test262) 11 - [测试运行示例](#测试运行示例) 12 - [测试输出](#测试输出) 13 14本章节将介绍基于方舟运行时的开发测试实例。 15 16## HelloWorld<a name="section105987593810"></a> 17 18### 运行前准备 19 201. 编译方舟运行时,编译命令: 21 22``` 23./build.sh --product-name Hi3516DV300 --build-target ark_js_host_linux_tools_packages # arm平台和host端运行工具 24``` 25 262. 编译方舟前端,编译命令: 27 28``` 29./build.sh --product-name Hi3516DV300 --build-target ark_ts2abc_build 30``` 31 32**说明**:编译命令执行路径为项目根目录。 33 34### 运行hello-world.js 35 36新建hello-world.js文件,写入以下源码: 37 38``` 39 print("Hello World!!!"); 40``` 41 42运行步骤: 43 441. 通过方舟前端生成hello-world.abc文件,编译命令: 45 46 ``` 47 node --expose-gc /your code path/out/hi3516dv300/clang_x64/ark/ark/build/src/index.js hello-world.js 48 ``` 49 502. 执行hello-world.abc文件: 51 1. 设置搜索路径: 52 53 ``` 54 export LD_LIBRARY_PATH= out/hi3516dv300/clang_x64/ark/ark:out/hi3516dv300/clang_x64/ark/ark_js_runtime:out/hi3516dv300/clang_x64/global/i18n_standard:prebuilts/clang/ohos/linux-x86_64/llvm/lib 55 ``` 56 57 2. 执行ark\_js\_vm: 58 59 ``` 60 /your code path/out/hi3516dv300/clang_x64/ark/ark_js_runtime/ark_js_vm hello-world.abc 61 ``` 62 63 执行结果如下: 64 65 ``` 66 Hello World!!! 67 ``` 68 69 70 71**说明**:此处“_your code path_”为源码目录路径。 72 73### 反汇编hello-world.abc 74 75执行如下命令,结果输出到output文件中: 76 77``` 78./your code path/out/hi3516dv300/clang_x64/ark/ark/ark_disasm hello-world.abc output 79``` 80 81hello-world.abc反汇编结果如下: 82 83``` 84# 85# source binary: hello-world.abc 86# 87 88# ==================== 89# LITERALS 90 91# ==================== 92# RECORDS 93 94.record _ESAnnotation <external> 95 96.record _ESModuleMode { 97 u8 isModule 98} 99 100# ==================== 101# METHODS 102 103.function any func_main_0_any_any_any_any_(any a0, any a1, any a2) <static> { 104 mov.dyn v2, a2 105 mov.dyn v1, a1 106 mov.dyn v0, a0 107 builtin.acc 108 sta.dyn v5 109 builtin.idi "print", 0x0 // 加载print函数 110 sta.dyn v3 111 lda.str "Hello World!!!" // 加载Hello World!!!字符串 112 sta.dyn v4 113 builtin.tern3 v3, v4 // 调用print函数 114 builtin.acc 115} 116``` 117 118## 运行Test262测试用例<a name="section118471435115815"></a> 119 120### 运行前准备 121 1221. 编译方舟运行时,编译命令: 123 124``` 125./build.sh --product-name Hi3516DV300 --build-target ark_js_host_linux_tools_packages 126``` 127 1281. 编译方舟前端,编译命令: 129 130``` 131./build.sh --product-name Hi3516DV300 --build-target ark_ts2abc_build 132``` 133 134**说明**:编译命令执行路径为项目根目录。 135 136### 运行Test262 137 138运行run\_test262.py脚本,下载及运行Test262用例。 139 140命令行格式: 141 142``` 143python3 test262/run_test262.py [options] 144``` 145 146执行路径为:项目根目录/ark/ts2abc。 147 148<a name="table11141827153017"></a> 149<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> 150</th> 151<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> 152</th> 153</tr> 154</thead> 155<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> 156</td> 157<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> 158</td> 159</tr> 160<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> 161</td> 162<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> 163</td> 164</tr> 165<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> 166</td> 167<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> 168</td> 169</tr> 170<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> 171</td> 172<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> 173</td> 174</tr> 175<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> 176</td> 177<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> 178</td> 179</tr> 180<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> 181</td> 182<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> 183</td> 184</tr> 185<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> 186</td> 187<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> 188</td> 189</tr> 190<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> 191</td> 192<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> 193</td> 194</tr> 195<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> 196</td> 197<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> 198</td> 199</tr> 200<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> 201</td> 202<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> 203</td> 204</tr> 205<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> 206</td> 207<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> 208</td> 209</tr> 210<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> 211</td> 212<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> 213</td> 214</tr> 215<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> 216</td> 217<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> 218</td> 219</tr> 220<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> 221</td> 222<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> 223</td> 224</tr> 225<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> 226</td> 227<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> 228</td> 229</tr> 230<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> 231</td> 232<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> 233</td> 234</tr> 235</tbody> 236</table> 237 238### 测试运行示例 239 240- 运行ES51测试用例: 241 242 ``` 243 python3 test262/run_test262.py --es51 244 ``` 245 246- 仅运行ES2015测试用: 247 248 ``` 249 python3 test262/run_test262.py --es2015 only 250 ``` 251 252- 运行ES2015和ES51所有测试用例: 253 254 ``` 255 python3 test262/run_test262.py --es2015 all 256 ``` 257 258- 运行单一测试用例: 259 260 ``` 261 python3 test262/run_test262.py --file test262/data/test_es5/language/statements/break/12.8-1.js 262 ``` 263 264- 运行某目录下所有测试用例: 265 266 ``` 267 python3 test262/run_test262.py --dir test262/data/test_es5/language/statements 268 ``` 269 270 271- 使用\`babel\`把单个测试用例转换成es5后再运行: 272 273 ``` 274 python3 test262/run_test262.py --babel --file test262/data/test_es5/language/statements/break/12.8-1.js 275 ``` 276 277 278### 测试输出 279 280Test262所有用例的测试结果位于项目根目录/ark/ts2abc/out下。shell中测试输出结果如下: 281 282``` 283$python3 test262/run_test262.py --file test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js 284 285Wait a moment.......... 286Test command: 287node 288 test262/harness/bin/run.js 289 --hostType=panda 290 --hostPath=python3 291 --hostArgs='-B test262/run_sunspider.py --ark-tool=/your code path/out/hi3516dv300/clang_x64/ark/ark_js_runtime/ark_js_vm --ark-frontend-tool=/your code path/out/hi3516dv300/clang_x64/ark/ark/build/src/index.js --libs-dir=/your code path/out/hi3516dv300/clang_x64/ark/ark:/your code path/out/hi3516dv300/clang_x64/global/i18n:/your code path/prebuilts/clang/ohos/linux-x86_64/llvm/lib/ --ark-frontend=ts2panda' 292 --threads=15 293 --mode=only strict mode 294 --timeout=60000 295 --tempDir=build/test262 296 --test262Dir=test262/data 297 --saveCompiledTests 298 test262/data/test_es5/language/statements/break/12.8-1.js 299 300PASS test262/data/test_es2015/built-ins/Array/15.4.5.1-5-1.js (strict mode) 301Ran 1 tests 3021 passed 3030 failed 304used time is: 0:01:04.439642 305``` 306 307