コンパイルが爆速、Null無し、Immutable variables by default、Pure functions by defaultと自分が好きな機能盛りだくさんなV言語。
そんなV言語がjsやwasmの出力に対応しました!!!
が、出力方法はまだドキュメントに乗っていません。
まあそのうち乗るでしょう。
vlangのdiscordから集めてきた情報を元にビルド方法を紹介します。
サンプルコード
公式に乗ってるフィボナッチ数列を列挙するコードをコンパイルしていきます。
fibonacci.v
fn fib(a int, b int) { val := a + b println(val) if val < 1000 { fib(b, val) } } fn main() { areas := ['game', 'web', 'tools', 'science', 'systems', 'embedded', 'drivers', 'GUI', 'mobile'] for area in areas { println('Hello, $area developers!') } fib(0, 1) }
普通に実行してみる
v fibonacci.v
コンパイルはこれぐらいの速度。(以下、全部MBP2018で試しています。)
0.25s user 0.04s system 97% cpu 0.301 total
./fibonacci
実行はこれぐらいの速度。
0.00s user 0.00s system 56% cpu 0.004 total
js
v -b js -w -o fibonacci fibonacci.v
これでfibonacci.jsが生成されます。
0.00s user 0.00s system 73% cpu 0.008 total
とバカ早いです。
> node fibonacci.js Hello, game developers! Hello, web developers! Hello, tools developers! Hello, science developers! Hello, systems developers! Hello, embedded developers! Hello, drivers developers! Hello, GUI developers! Hello, mobile developers! 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
0.04s user 0.01s system 91% cpu 0.060 total
実行速度のテストするには、試行回数が2桁ぐらい足りないので参考程度に。
でもこれvでそのままビルドして実行するより早いのでは??
変換後のコードはこんな感じ。
(前にbuiltinの定義が100行ぐらいある) /** @namespace main */ const main = (function () { /** * @function * @param {number} a * @param {number} b * @returns {void} */ function fib(a, b) { /** @type {number} */ const val = a + b; builtin.println(val); if (val < 1000) { fib(b, val); } } /* program entry point */ (function() { /** @type {string[]} */ const areas = ["game", "web", "tools", "science", "systems", "embedded", "drivers", "GUI", "mobile"]; for (let _tmp1 = 0; _tmp1 < areas.length; ++_tmp1) { const area = areas[_tmp1]; builtin.println(`Hello, ${area} developers!`); } fib(0, 1); })(); /* module exports */ return {}; })();
めちゃめちゃ素直に変換されてるのが分かります。
wasm
v -o fibonacci.c fibonacci.v emcc fibonacci.c -s WASM=1 -o hello.html
いや、vはcに変換してるだけやん!
まあそれはそれとして、v->cはjs同様早いんですが、
c->wasmは 2.15s user 0.72s system 224% cpu 1.277 total
ぐらいの時間がかかります。
このfibonacci.c、なんと9559行にも膨れます。
Cに変換するのはコンパイル速度ではなく実行速度が欲しい時、みたいな感じなんですかね。