Vは2019年6月にOSSとして公開されたばかりのシンプルで読みやすく、メンテナンスしやすい言語です。
現在はCに依存していますが今月中(2020年1月)には直接ネイティブのバイナリを出せるようになるようです。
Direct x64 machine code generation is here!
— The V Programming Language (@v_language) November 22, 2019
Building a 263 byte Hello World program in 3 milliseconds:
The compilation speed in this mode is about 1 million lines per second.
(It’s at a very early stage, but by January, V will be able to compile itself without a C compiler.) pic.twitter.com/PhBuyiMPPT
GCはありませんがRustのようにコンパイル時に自動的に解放するタイミングを決定しているので、メモリリークや二重解放の問題がなく実行時にGCの負荷が掛かりません。
Goに似たシンプルな言語でVを書くのに必要なことを覚えるのに時間は掛かりません。
Goを書いたことある方であれば公式のドキュメントを少し見ただけで書けると思います。
試しにechoサーバとクライアントを書いてみました。
私がGoを主に使用しているということとVがGoに似ているということから、Goと比較しながら見ていきます。
https://github.com/minami14/v-echo-server
server.v
module main import net fn main() { sock := net.listen(1234)? for { s := sock.accept() or { println(err) continue } go serve(s) } } fn serve(sock net.Socket) { buf, n := s.recv(1024) line := tos(buf, n) println(line) s.send(buf, n) or { println(err) } }
エラーハンドリングのやり方が違ったりしますが基本的にはGoと同じような感じですね。
Goのpackage
がVではmodule
になっています。
import
は"net"
のようにダブルクォーテーションで囲む必要はありません。
関数はfunc
ではなくfn
です。
今回は再代入を行っていませんが、Vの変数はデフォルトでイミュータブルです。
再代入する場合にはmut x = 1
のようにmut
を付ける必要があります。
sock := net.listen(1234)?
これは以下と同じ意味です
sock := net.listen(1234) or {
panic(err)
}
Goだとsock
とerr
を返してif err!=nil
でエラーハンドリングしますが、Vではエラーを返す関数を呼ぶときに結果とerr
を合わせて返すのではなく結果かerrのどちらかを返します。
err
が帰った場合にはor
でエラーハンドリングをします。
main関数内ではor { panic(err) }
の代わりに?
が使えます。
以下はerrを返す関数の例です。Goと違ってifが式になっています。
fn foo(x int) int? {
return if x > 0 {
x
}
else {
error('x is negative')
}
}
forループはGoと同じです
for {
s := sock.accept() or {
println(err)
continue
}
go serve(s)
}
並列処理はGoと同じようにgo serve(s)
と書けますが、現在は新たにスレッドを作成して実行するようになっています。
コルーチンとスケジューラは近いうちに実装される予定です。
Vはリリースされたばかりの言語で情報が少なかったのですが、シンタックスがGoに似ていてシンプルで読みやすい言語なので、標準モジュールのソースを見ながらechoサーバ、クライアントを実装することは簡単にできました。