LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

良さげなクロスプラットフォーム開発言語《v》のメモ(Go,Nim,Rustと少し比較)

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言語で高階関数を書いて遊んでみた

④インターフェイス

こちらも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

参考
Goのinterfaceがわからない人へ

⑤テスト手法

hello.vをテストする際には、hello_test.vを用意してね、とのこと。

hello.v
fn hello() string {
    return 'Hello world'
}
hello_test.v
fn test_hello() {
    assert hello() == 'Hello world'
}

まぁ、実際に開発する段になってから考えるところだろうけど、IDEがサポートしてくれたら使いやすいのかも。

感想

Swift/Kotlinが結局クロスプラットフォーム開発用途には不十分と思われるので、ニッチなクロスプラットフォーム開発用途ではv言語ありかも。nimとの比較は気が向いた時にでも。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4