The V Programming Language を試す

Vは2019年6月にOSSとして公開されたばかりのシンプルで読みやすく、メンテナンスしやすい言語です。

https://vlang.io/

現在はCに依存していますが今月中(2020年1月)には直接ネイティブのバイナリを出せるようになるようです。

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だとsockerrを返して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サーバ、クライアントを実装することは簡単にできました。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です