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)

也许有人觉得 :

不算 lexer 和 parser,核心代码就几千行。只能说作者营销做的好,官网看上去还挺像那么回事的。在新窗口打开

但我觉得,这种简单性,正是 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在新窗口打开

更新:
来自: gcxfd