1.3. 命令行功能

本节介绍 wa 命令主要功能。

1.3.1. 帮助信息

输入 wa 命令或 wa -h 可查看命令行帮助信息,如下:

$ wa
NAME:
   Wa - Wa is a tool for managing Wa source code.

USAGE:
   wa [global options] command [command options] [arguments...]

VERSION:
   v0.8.1-mvp

COMMANDS:
   play   start Wa playground
   init   init a sketch Wa module
   build  compile Wa source code
   run    compile and run Wa program
   fmt    format Wa source code file
   test   test Wa packages
   yacc   generates parsers for LALR(1) grammars
   logo   print Wa text format logo

GLOBAL OPTIONS:
   --debug, -d              set debug mode (default: false)
   --trace value, -t value  set trace mode (*|app|compiler|loader)
   --help, -h               show help (default: false)
   --version, -v            print the version (default: false)

COPYRIGHT:
   Copyright 2018 The Wa Authors. All rights reserved.

See "https://wa-lang.org" for more information.

主要有以下子命令:

  • play:启动本地版本的 playground;
  • init:初始化一个凹语言工程;
  • build:编译凹语言程序;
  • run:编译并执行凹语言程序;
  • fmt:格式化凹语言源代码文件;
  • test:执行凹语言工程的单元测试;
  • yacc:凹语言版本的 yacc,用于生成 LALR(1) 语法规则的解析器代码;
  • logo:打印凹语言文字版本的Logo。

其中 build 命令在 1.1.1 节展示过,play 命令已经在 1.2.5 节展示过,本节简要介绍之外的子命令。

1.3.2 初始化工程

在 1.1.1 节已经展示过 wa run hello.wa 执行一个独立文件的凹语言程序。但是单文件的凹语言程序有一个巨大的限制——它只有一个文件且不能引用非标准库的代码。对于更大的凹程序推荐用凹工程的方式组织。

使用 wa init 命令可以初始化一个凹工程,先看看命令行帮助:

$ wa init -h
NAME:
   wa init - init a sketch Wa module

USAGE:
   wa init [command options] [arguments...]

OPTIONS:
   --name value, -n value     set app name (default: "hello")
   --pkgpath value, -p value  set pkgpath file (default: "myapp")
   --update, -u               update example (default: false)
   --help, -h                 show help (default: false)

该命令有 -name-pkgpath 两个重要的参数,分别对应工程的名字和对应的包路径。每个参数都有默认值,可以用 wa init 生成一个 hello 工程。

$ wa init
$ tree hello
hello
├── LICENSE
├── README.md
├── src
│   ├── main.wa
│   ├── mymath
│   │   └── math.wa
│   ├── mypkg
│   │   └── pkg.wa
│   └── zz_test.wa
├── vendor
│   └── 3rdparty
│       └── pkg
│           └── pkg.wa
└── wa.mod

7 directories, 8 files

工程的结构在 1.4 节介绍。

1.3.3 编译和执行

命令行环境进入 hello 目录,输入 wa build 将在 output 目录构建出 wasm 模块:

$ wa build
$ tree output/
output/
├── hello.wasm
└── hello.wat

1 directory, 2 files

默认输出的是 WASI 规范的 output/hello.watoutput/hello.wasm 文件。可以用标准的工具执行输出的 wasm 模块。也可以用 wa 命令执行:

$ wa run ./output/hello.wasm
你好,凹语言!
5050
...

如果不带参数执行 wa run 命令,表示编译并执行当前凹语言工程,会先构建出 output/hello.wasm 然后再执行。

1.3.4 格式化代码

wa fmt 命令用于格式化代码,其命令行帮助信息如下:

$ wa fmt -h
NAME:
   wa fmt - format Wa source code file

USAGE:
   wa fmt [command options] [<file.wa>|<path>|<path>/...]

OPTIONS:
   --help, -h  show help (default: false)

命令行参数是要进行格式化的路径:

  • wa fmt file.wa 格式化指定的凹语言文件
  • wa fmt path 格式化指定目录下的全部凹语言文件
  • wa fmt path/... 递归格式化指定路径的凹语言文件,含子目录

如果不指定参数,则默认格式化当前目录下全部的凹语言文件。如果当前目录属于凹语言工程中,则默认格式化全部子目录的凹语言文件。

1.3.5 单元测试

默认生成的工程会有一个 src/zz_test.wa 测试文件,内容如下:

func TestSum {
    assert(sum(100) == 5050, "sum(100) failed")
}

func ExampleSum {
    println(sum(100))

    // Output:
    // 5050
}

TestSum 测试函数中通过内置的 assert 函数测试 sum(100) 的结果为 5050。在 ExampleSum 示例测试函数中通过 // Output: 测试输出的内容符合期望的结果。

在工程目录的命令行环境通过 wa test 命令执行测试:

$ wa test
ok   myapp 104ms

1.3.6 凹语言版本的 yacc

yacc 是用于生成语法解析器的程序,是编译器爱好者的工具。凹语言的 yacc 从 goyacc 移植而来,详细的用法可以参考凹语言官网碎碎念部分的 相关文章

1.3.7 打印 Logo

wa logo 可以输出一些文本格式的 Logo 图案,读者可以通过 wa logo -h 命令帮助自行探索。