序
GoとNimは趣味でそれなりに触って、Rustは仕事にならない限り触らないことにしている自分が、v言語をチラ見してみたのでメモを残しておく。 バージョン0.1台とまだまだ若い言語なので参考程度に。
v言語:
https://vlang.io/
cf.なるほど。
Rustを業務で1年使ってみてわかったこと
v言語を三行で
- v言語はGoをリスペクトしてる型あり言語。もともとvはGoで書かれていた。
- Nimと同様にC言語をバックエンドとしてバイナリ化する。vは、Nim並みにコンパイルは早くバイナリサイズは小さく。
- Rustとは異なり言語仕様はシンプルに。モダンなところはRustにも学ぶ(関数定義はfuncではなくfnだし...)。
v言語の使い所、思ったところを三行で
- 公式サイトとしては、v言語をクロスプラットフォームなクライアント側のアプリ作りに使って欲しい模様。出自からも当座はクライアント側一択か。
- 実用するには、C/C++(/objective-C)との相性の良さが、「実績として」活かされるようになることが必要か。
- サーバ側とのやり取りはjsonで行うのが基本か。近い将来のモダンな開発としてはサーバ側はGraphQLでインターフェイスを切るといったところになるのだろう。
どこぞの猛者がネットワークゲームのクライアントとしてv言語を採用してくださったりすると、v言語が広まるのだろうか。
見た目。学習コストが低そうで好感あり。
GoっぽいがRustっぽくもあるのだろう。が、Rustを良く知らないので、とりあえず、Scalaを日常的に書いている人間としては違和感が少なくて良かった。まぁ、vはモダンな見た目の言語ということ。チラ見しておこう。
#公式サイトに行くと、web上でv言語のサンプルを実行することができる。web上での実行は若い言語では望ましい機能だね。
①文字列の扱い
name := 'Bob'
println('Hello, $name!') // `$` is used for string interpolation
println(name.len)
bobby := name + 'by' // + is used to concatenate strings
println(bobby) // "Bobby"
println(bobby[1..3]) // "ob"
mut s := 'hello '
s += 'world' // `+=` is used to append to a string
println(s) // "hello world"
やはりGoっぽい。文字列をmutableで扱う場合にはmutで明示するというあたりは今風で良い(scala/kotlin等のval/var相当)。
出典:
https://vlang.io/docs#strings
②パターンマッチ
s := match number {
1 { 'one' }
2 { 'two' }
else {
println('this works too')
'many'
}
}
出典:
https://vlang.io/docs#match
scalaのmatch(以下)と近しい。
val s = number match {
case 1 => 'one'
case 2 => 'two'
case _ => {
println('this works too')
'many'
}
}
##③高階関数
かなりGoっぽいね。
fn sqr(n int) int {
return n * n
}
fn run(value int, op fn(int) int) int {
return op(value)
}
fn main() {
println(run(5, sqr)) // "25"
}
出典:
https://vlang.io/docs#highfns
##④インターフェイス
こちらもGoっぽい。ただ、コンパイルが通らなかった。まぁ、若い言語ですから ;-)
struct Dog {}
struct Cat {}
fn (d Dog) speak() string {
return 'woof'
}
fn (c Cat) speak() string {
return 'meow'
}
interface Speaker {
speak() string
}
fn perform(s Speaker) {
println(s.speak())
}
dog := Dog{}
cat := Cat{}
perform(dog) // "woof"
perform(cat) // "meow"
出典:
https://vlang.io/docs#interfaces
##⑤テスト手法
hello.v
をテストする際には、hello_test.v
を用意してね、とのこと。
fn hello() string {
return 'Hello world'
}
fn test_hello() {
assert hello() == 'Hello world'
}
まぁ、実際に開発する段になってから考えるところだろうけど、IDEがサポートしてくれたら使いやすいのかも。
感想
Swift/Kotlinが結局クロスプラットフォーム開発用途には不十分と思われるので、ニッチなクロスプラットフォーム開発用途ではv言語ありかも。nimとの比較は気が向いた時にでも。