v 或 v - 或 v repl #进入交互模式
v -b或-backend c ./main.v #指定编译器后端类型:默认是c,也可以是js,native
v -b js ./main.v #指定编译器后端类型为js,目前还是试验性质的,不完善
v -b native ./main.v #指定编译器后端类型为native,目前还是试验性质的,不完善
v -o或-output main.c ./main.v #编译生成C源文件,而不是可执行文件
v -prod xxx.v #生产优化模式编译,生成更小的可执行文件 不指定-prod选项时优先尝试使用tcc编译(v make时会自动下载),指定-prod选项选项后使用gcc msvc等进行编译
v -skip-unused xxx.v #V代码编译生成C代码时,忽略未使用的C函数,可以进一步缩小可执行文件大小,目前最简单的V程序正常编译成C代码大概是1W行左右,使用了-skip-unused后,减小到5000行左右
v -skip-unused -prod xxx.v #V代码编译生成C代码时,忽略未使用的C函数,并且进行生产编译,可以进一步缩小可执行文件大小
v -skip-unused -o xxx.c xxx.v #生成最小的C文件,忽略未使用的C函数
v -usecache xxx.v #使用标准库的缓存,而不是每次都重新编译标准库,编译速度快很多
v -usecache -prod xxx.v #使用标准库缓存,生产优化编译,速度也会快很多
v -nocache -prod xxx.v #取消标准库的缓存,全部重新编译
v -wipe-cache xxx.v #取消标准库的缓存,全部重新编译
v main.v -dump-modules modules.txt #把本次编译所依赖的模块名称保存到modules.txt文件中
v main.v -dump-files files.txt #把本次编译所依赖的V源文件保存到files.txt文件中
v main.v -dump-cflags cflags.txt #把本次编译所使用的cflag选项保存到cflags.txt文件中
v -autofree xxx.v #以自动释放内容方式生成可执行文件
v -obf或-obfuscate #混淆编译生成可执行文件
v -stats #编译时显示额外的统计信息,编译多少行,多少字节,编译时间,每秒编译行数
v -show-timings xxx.v #显示每个编译阶段花费多少时间:扫描,解析,检查,生成C,编译C
v -g xxx.v #不做代码优化,加入更多的调试信息在生成的可执行文件中,然后就可以使用C的调试器调试可执行文件
v -g -cg -keepc #生成可调式的可执行文件,并且不删除生成的C源代码,方便跟踪调试
v -cg run xxx.v #如果编译报错,-cg选项可以提示报错更多的信息,以及报错对应的C代码行,可以更快地定位错误
v -compress #调用upx,压缩加壳生成二进制文件
v -os <os> #跨平台交叉编译,编译生成指定os的可执行文件,OS可以是:linux, mac, windows, msvc
v -arch x64 #指定编译的架构,可以是x86或x64,默认是x64
v -live #启用代码热更新编译(只对注解为[live]的函数生效,修改函数内容会实时编译)
v -shared #编译生成共享库
v -glibc xxx.v #使用glibc库进行编译
v -musl xxx.v #使用musl库进行编译
v -no-builtin xxx.v #不使用buildin内置模块
v -no-std xxx.v #不使用编译参数:-std=gnu99(linux)/-std=c99 C99标准进行编译
...
time v cmd/v #开发编译
time v -prod cmd/v #普通的生产编译,非并发
time v -prod -parallel-cc cmd/v #使用-parallel-cc并发编译选项
编译速度比较:未使用并发编译2分20秒,使用并发编译 7.4秒,足足快了18倍。
v cmd/v 5.93s user 0.43s system 97% cpu 6.521 total
v -prod cmd/v 115.51s user 2.21s system 84% cpu 2:20.00 total
v -prod -parallel-cc cmd/v 7.25s user 0.73s system 107% cpu 7.402 total
v -prod main.v 5.17s user 0.22s system 69% cpu 7.709 total
v -prod -parallel-cc main.v 0.97s user 0.30s system 96% cpu 1.310 total
常用命令例子
v main.v #编译当前目录中的main.v源文件,生成同名的main可执行文件
v run main.v #编译并运行当前目录中的main.v源文件,运行完成后删除可执行文件,每次都重新编译
v crun main.v #编译并运行当前目录中的main.v源文件,运行完成后不删除编译后的可执行文件,如果源代码没有改动,再次运行会直接运行可执行文件,加快运行时间
v watch main.v #编译并运行当前目录中的main.v源文件,并监控,保存自动重新运行
v interpret ./main.v #不先编译,解释执行代码
v project-dir #编译整个目录
v -gc boehm main.v #带GC编译,详细选项参考内存管理章节
v -usecache main.v #使用标准库缓存进行编译
v run main.v #编译当前目录中的main.v源文件,生成同名的main可执行文件,并运行
v -autofree run main.v #以自动释放内容方式,编译,并运行
v -o myexe main.v #编译当前目录中的main.v源文件,生成的可执行文件名为myexe
v -o myexe.c main.v #编译当前目录中的main.v源文件,生成对应的C源文件,而不是可执行文件
v -o myexe.js main.v #编译当前目录中的main.v源文件,生成对应的js源文件,而不是可执行文件
v -prod main.v #生产模式编译当前目录中的main.v源文件,生成更小的可执行文件
v translate main.c #将C代码翻译成V代码
v translate wrapper main.c #将C代码封装成V代码定义,提供给V代码调用
v help #查看编译器帮助文本
v help build #查看build子命令的帮助文本
v help build-native #查看native编译的帮助文本
v version #查看编译器版本
v --version #查看编译器版本
v -v #查看编译器版本
v -v run main.v #-v,如果后面有额外的内容,就是verbose模式,输出额外的编译过程信息,即冗长模式
v #进入交互模式
v - #进入交互模式
v build mymodule #编译mymodule模块(当前位置要在mymodule的上级目录)
v . #编译当前目录
v build-tools #一次性编译所有的cmd/tools中的命令行工具
v up #升级V编译器到最新版本,等价于git pull && make
v install xxx模块 #从https://vpm.vlang.io官方VPM安装指定的模块
v install --git https://github.com/vlang/markdown #从git代码库安装模块
v install --hg xxx代码库url #从hg代码库安装模块
v where fn main #查找main函数的位置
v where struct User #查找User结构体的位置
v where method User.get_name #查找get_name方法的位置
v where fn pow -mod math #在模块math中查找pow函数的位置
v where interface callable -dir abc -dir def #在指定目录中查找接口callable的位置
v ast main.v #将V源代码生成json格式的AST语法树,生成main.json
v ast -t main.v #生成简洁的json格式的AST语法书,去除一些不重要的字段
v ast -w main.v #生成main.json,并且监控源文件变化,保存后自动重新生成
v ast -c main.v #将V源代码同时生成AST语法树文件main.json和C源代码main.c,并且监控源文件变化,保存后自动重新生成
v ls --install #从github上获取最新的vls代码到~/.vls目录中,并编译到bin目录中
v ls --update #从github上更新最新的vls代码,并编译到bin目录中
v help ls #查看ls子命令的详细帮助
#有了v ls就可以替代之前一直在使用的手工编译vls的操作
1.git clone/pull https://github.com/vlang/vls.git
2.v build.vsh
#如果要使用~/.vls/bin中的可执行文件,记得将vscode插件中的bin路径修改为该路径
v scan main.v #扫描main.v源文件,并输出源文件中所有的token
v vet ./main.v #分析main.v源文件代码中存在的错误
v vet . #分析当前目录中所有V源文件代码中存在的错误
v test mymodule #执行mymodule中的测试文件
v test-compiler #执行v源代码中所有的测试文件,用于测试编译器本身
v vlib/v/compiler_errors_test.v #执行编译器错误测试,checker/tests,parser/tests
VTEST_ONLY=xxx v vlib/v/compiler_errors_test.v #执行编译器错误测试,并且名字包含xxx
v doctor #输出当前电脑的基本环境信息,主要跟V编译相关,用于提单到github时,报告环境信息,方便排查
v self -prod #编译器自己编译自己
v -d time_v self #编译器自己编译自己,并增加自定义编译选项
v -d trace_gen_source_line_info self #编译器编译自己,并增加生成的C源代码行信息
v -d show_fps run main_with_gg.v #为使用gg库开发的ui程序实时显示FPS
代码格式化工具
命令行中提供了代码格式化子命令,用来格式化代码:
v fmt -w main.v #统一格式化指定源文件或目录中的代码
v fmt -w . #格式化当前目录中的所有源文件代码
v -d time_parsing -d time_checking -d time_cgening -d time_v self
使用以上几个时间选项编译V编译器后,编译器在编译文件时,会详细显示每一个文件在不同阶段消耗的时间:
0.004 ms v start
0.446 ms parse_CLI_args
0.195 ms parse_file /Users/xx/v/v/vlib/builtin/array.c.v
0.732 ms checker_check /Users/xx/v/v/vlib/strings/builder.v
1.355 ms cgen_file /Users/xx/v/v/vlib/strings/builder.v
837.339 ms v total
glibc和musl libc编译
V编译器也支持musl编译,调用musl-gcc作为编译器。
安装musl
在linux系统中,glibc是内置的,musl需要安装,下面是从源代码编译安装的步骤:
git clone git://git.musl-libc.org/musl #下载musl源代码库
cd musl
./configure
make
make install #安装完成后,默认会把musl安装到:/usr/local/musl目录中,也可以自定义安装目录
#编译成功后,musl-gcc编译器默认在/usr/local/musl/bin目录中,需要添加到环境变量中。
export PATH="/usr/local/musl/bin:$PATH"