HOME/Articles/

zig言語

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
  )
)