Open10

Zig 言語に入門してみる

やまゆやまゆ

Zig という開発中のプログラミング言語があります。

Zigは、堅牢、最適、および再利用可能なソフトウェアをメンテナンスするための汎用プログラミング言語およびツールチェインです。

⚡ シンプルな言語
プログラミング言語の知識をデバッグするよりも、アプリケーションのデバッグにフォーカスしてください。
隠された制御フローはありません。
隠されたメモリ割り当てはありません。
プリプロセッサ、マクロもありません。

⚡ コンプタイム
コンパイル時のコード実行と遅延評価に基づくメタプログラミングへの新しいアプローチ。
コンパイル時に任意の関数を呼び出します。
ランタイムオーバーヘッドなしに型を値として操作します。
コンプタイムはターゲットアーキテクチャをエミュレートします。

⚡ Zigでメンテナンス
C/C++/Zigのコードベースを段階的に改善することができます。
Zigを依存性ゼロのドロップインC/C++コンパイラとして使用し、すぐにクロスコンパイルをサポートします。
zig buildを活用し、全てのプラットフォームで一貫した開発環境を構築します。
C/C++プロジェクトにZigのコンパイルユニットを追加することができます。

公式サイトの引用です。静的型があり、 Rust ほど複雑ではない Simple な言語で、 C 言語に依存せず同レイヤーのコードを書けるところに魅力があります。また、日本語公式翻訳が充実しているのも良い所です。

やまゆやまゆ

現在のバージョンは 0.13.0 ということで、まだ stable バージョンはありません。公式でも、タグバージョンより nightly build(最新のビルド)を使った方が良いと書かれています。

どんな言語かは overview を覗くことでなんとなくわかります。

別言語との差別化は このページ で明確化されています。

実際のコードサンプルは このページ を見るとすぐに分かります。

細かい言語仕様については zig.guide を見ることで確認できます。

やまゆやまゆ

Install

https://ziglang.org/download/

公式ページから master ビルドをダウンロードできます。今回は WSL2 Ubuntu 22.04 で動かすので、 Linux x86_64 ビルドをダウンロードします。

$ tar xf zig-linux-x86_64-0.14.0-dev.367+a57479afc.tar.xz

で解凍したディレクトリを PATH に通します。

export PATH="/path/to/zig-linux:$PATH"
やまゆやまゆ

Hello world

$ zig init

既にドキュメントと少し異なるのですが、 zig init コマンドでサンプルコードが生成されます。

私が好きな部分として、「テストコードと実装を同じファイルに記述可能」な点があります。

src/root.zig
const std = @import("std");
const testing = std.testing;

export fn add(a: i32, b: i32) i32 {
    return a + b;
}

test "basic add functionality" {
    try testing.expect(add(3, 7) == 10);
}

このように、 add 関数の実装とそのテストコードが同じファイルに配置されています。

やまゆやまゆ

Unit Test

$ zig test src/root.zig
All 1 tests passed.

zig バイナリ自体にユニットテスト機能が搭載されているので、サードパーティライブラリを入れたりすることなくテストの実施が可能です。

Build

$ zig build
$ ls -alh zig-out/bin/hello-world 
-rwxr-xr-x 1 m-yamagishi m-yamagishi 2.2M Jul 23 14:02 zig-out/bin/hello-world
$ ldd zig-out/bin/hello-world 
        not a dynamic executable
$ ./zig-out/bin/hello-world 
All your codebase are belong to us.
Run `zig build test` to run the tests.

ビルドももちろん行うことができ、これで現在の環境向け(linux x86_64)のバイナリが生成されます。

やまゆやまゆ

test はグローバルだけでなく、例えば struct の中に書くことも可能です。実装のすぐ下にテストコードが書けるのがかなり好きですね。