コンパイルが爆速、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行ぐらいある)
const main = (function () {
function fib(a, b) {
const val = a + b;
builtin.println(val);
if (val < 1000) {
fib(b, val);
}
}
(function() {
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);
})();
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に変換するのはコンパイル速度ではなく実行速度が欲しい時、みたいな感じなんですかね。
0 コメント:
コメントを投稿