11
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-15

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との比較は気が向いた時にでも。

11
4
0

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
  3. You can use dark theme
What you can do with signing up
11
4