きゅぶろぐ

きゅぶんずの ぶろぐができて べんりだな

V言語でjsやwasmを出力する

コンパイルが爆速、Null無し、Immutable variables by defaultPure 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に変換するのはコンパイル速度ではなく実行速度が欲しい時、みたいな感じなんですかね。