Article Outline
インストール
brew install zig
プロジェクトの作成
mkdir zig-playground
cd zig-playground
zig init-exe
build.zig
ファイルを使ってビルドする。自分でビルドコマンドを実行してもよい。
実行
zig run src/main.zig
# もしくは
zig build run
ハローワールド
const std = @import("std");
pub fn main() anyerror!void {
std.debug.print("Hello, {s}!\n", .{"World"});
}
クイックソート
pub fn quicksort() void {
var array = [_]i32{ 4, 6, 1, 3, 9, 2, 1 };
for (array) |_, i| {
var j: usize = 0;
while (j < array.len - i - 1) : (j += 1) {
if (array[j] > array[j + 1]) {
// swap
const temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
// 出力
for (array) | v | {
std.debug.print("{d}\n", .{ v });
}
}
wasm
export fn add(a: i32, b: i32) i32 {
return a + b;
}
コンパイルする。
zig build-lib src/wasm.zig -target wasm32-freestanding-musl -dynamic -O ReleaseSmall --export=add
HTMLから読み込む。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebAssembly</title>
</head>
<body>
<script>
WebAssembly.instantiateStreaming(fetch('wasm.wasm'))
.then(obj => {
const res = obj.instance.exports.add(1, 2);
console.log(res)
});
</script>
</body>
</html>
wasmの中身。
(module
(memory $memory (;0;) (export "memory") 1)
(global $global0 (mut i32) (i32.const 65536))
(func $add (;0;) (export "add") (param $var0 i32) (param $var1 i32) (result i32)
local.get $var1
local.get $var0
i32.add
)
)