V 语言学习笔记
目录 :
引子: vlang,未来的语言
vlang,面向前端、后端、大数据、区块链、人工智能,渗透到社会的方方面面。在 2050 年打败了其他编程语言,统一了世界。连一岁婴儿都能一小时无脑入门 vlang。它甚至变成了世界各国的通用语,让人类重建了传说中的巴别塔,科技得到飞跃进步 ……
——— 引自 2050 年人民日报
序
V语言
,Vlang,是黑客的编程语言。
rust 、zig 都很好,只是它们太严谨和学院派。
V 更像是 javascript 这种快速启动的语言,没有那么多条条框框,入门快,当然速度也快。
V 首页很多宣传还尚未落地(比如 C 自动转 V),被不少人称之为虚假宣传,比如说 :
先去宣传,再去实现,是正确的策略,人类是想象的共同体。
大部分人因为看见才相信,而有些人因为相信所以看见。
正如,信仰共产主义也许是少数人,但是总有极少的人真的信了,星星之火可以燎原。没有共产党就没有新中国。
也许计算机数学家们会觉得 V 有些轻浮,但我相信黑客会喜欢这门语言。
思为行先,敢于去想,敢于去试,也许这就是艺术和数学的区别。编程语言是艺术还是数学?这是永恒的问题。
我觉得 V 最大的优点我觉得是模糊的语言设计和程序开发的边界。
它自我编译,三五秒,就可以重新编译,代码也很清楚。
V 的作者在 V 代码目录结构 中写道 :
我试图使编译器和 vlib 的代码尽可能简单和可读。
V 的目标之一是向具有不同水平的编译器开发经验的开发者开放。编译器不需要成为充满魔法的黑盒子,只有少数人才能理解。
V 编译器是模块化的,可以被其他应用程序使用。它位于
cmd/v/
和vlib/v/
中。在使用 V 编译器时,最重要和最有用的命令是
v self
。它重建了 V 编译器。编译器的结构非常简单,有三个不同的步骤。
解析/生成 AST (
v.parser
) => 检查类型 (v.checker
) => 生成 C/JavaScript/机器代码 (v.gen
)
也许有人觉得 :
但我觉得,这种简单性,正是 V 最大的优点。
不要把 V 当成传统笨重的编程语言,编译器是晦涩难懂的天书。
把它当成是网页前端框架,就像 Vue,入门门槛低,人人能参与。
有什么问题,动手改就是。
自己动手,丰衣足食。
美丽新世界不是坐着等来的,是劳动人民靠双手创造出来的。
v self
编译自己
V 可用用 v self
方便的编译自身,在我 2015 版的苹果笔记本上,编译一次要 5.63 秒。
我建议用源码的形式安装。
git clone git@github.com:vlang/v.git
make
sudo ./v symlink
有什么想法,就去直接修改编译器或者标准库的源代码。
然后用 v self
,自我编译下。搞定需求后,提交合并到官方源代码。
今天我刚刚学习 V,就发起了 3 个合并请求(1、2, 3),并且提出了一个语言改进的建议: optional explicit declaration of support for an interface。
我英文不好,但有 DeepL 的翻译,很容易就中文转英文来和国际友人深入交流。
V 写脚本
v init
初始化项目后,我需要一个编译脚本。
V 可以替代 bash 来写这种脚本。
我的编译脚本如下。
#!/usr/bin/env -S v run
import v.vmod
fn sh(cmd string){
println("❯ $cmd")
print(execute_or_exit(cmd).output)
}
vm := vmod.decode( @VMOD_FILE ) or { panic(err) }
name := vm.name
sh('v -autofree -prod ${name}.v')
suffix := $if windows { '.exe' } $else { '' }
src := name + suffix
bin := join_path_single('bin',src)
mkdir('bin') or {}
mv(src, bin)?
println(' '+bin)
监控文件改动并自动重启运行
一遍写一遍运行是我的习惯,监控文件改动并自动重启运行是我的刚需。
v 自带了 v watch run xx.v
来实现这一点。
我创建了一个脚本来方便使用 ./dev.sh
,如下:
#!/usr/bin/env bash
DIR=$(dirname $(realpath "$0"))
cd $DIR
set -ex
NAME=$(cat v.mod|grep name|awk -F\' '{print $2}')
SH="v watch run $NAME.v"
exec $SH \
-i '.git' \
-i 'bin' \
-c -s --before "printf \"\e[90m❯ ${SH}\e[0m\n\""
项目模板见 rmw-link/rmw-v-template