第2章: 環境構築

学習目標

この章を終えると、以下ができるようになります:

  • Zigコンパイラをインストールし、バージョン管理できる
  • Zig Language Server (ZLS) をセットアップし、エディタと統合できる
  • Zigの基本的なコマンドラインツールを使用できる
  • 初めてのZigプログラムをビルド・実行できる
  • Zigのインストール

    公式バイナリからのインストール

    Zigの最も簡単なインストール方法は、公式サイトからビルド済みバイナリをダウンロードすることです。

    macOS / Linux

    # 公式サイトから最新版をダウンロード
    cd ~/Downloads
    wget https://ziglang.org/download/0.12.0/zig-macos-aarch64-0.12.0.tar.xz
    
    # 展開
    tar xf zig-macos-aarch64-0.12.0.tar.xz
    
    # PATHに追加
    sudo mv zig-macos-aarch64-0.12.0 /usr/local/zig
    echo 'export PATH="/usr/local/zig:$PATH"' >> ~/.zshrc
    source ~/.zshrc
    
    # バージョン確認
    zig version
    # 出力: 0.12.0
    

    Windows

    # PowerShellで実行
    # 公式サイトからダウンロード
    Invoke-WebRequest -Uri "https://ziglang.org/download/0.12.0/zig-windows-x86_64-0.12.0.zip" -OutFile "zig.zip"
    
    # 展開
    Expand-Archive -Path "zig.zip" -DestinationPath "C:\zig"
    
    # 環境変数に追加(システムプロパティから手動で設定)
    # または PowerShell で:
    [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\zig", "User")
    
    # バージョン確認
    zig version
    

    パッケージマネージャーからのインストール

    Homebrew (macOS)

    brew install zig
    

    APT (Ubuntu/Debian)

    # 注意: リポジトリのバージョンは古い可能性があります
    sudo apt update
    sudo apt install zig
    
    # または公式バイナリを使用することを推奨
    

    Scoop (Windows)

    scoop install zig
    

    バージョン管理 (zigup)

    複数のZigバージョンを管理するには、zigup を使用します:

    # zigupのインストール
    curl -L https://github.com/marler8997/zigup/releases/latest/download/zigup-x86_64-linux -o zigup
    chmod +x zigup
    sudo mv zigup /usr/local/bin/
    
    # Zigのインストール
    zigup 0.12.0
    
    # バージョンの切り替え
    zigup 0.11.0
    zigup 0.12.0
    
    # masterブランチ(最新の開発版)
    zigup master
    
    # インストール済みバージョンの確認
    zigup list
    

    Zig Language Server (ZLS)

    ZLSは、Zigの公式言語サーバーで、コード補完、エラー表示、リファクタリング機能を提供します。

    ZLSのインストール

    # 公式リリースからダウンロード
    cd ~/Downloads
    wget https://github.com/zigtools/zls/releases/latest/download/zls-x86_64-linux.tar.gz
    tar xf zls-x86_64-linux.tar.gz
    sudo mv zls /usr/local/bin/
    
    # バージョン確認
    zls --version
    

    エディタとの統合

    VS Code

  • 拡張機能 "Zig Language" をインストール
  • 設定 (settings.json) に追加:
  • {
      "zig.path": "/usr/local/zig/zig",
      "zig.zls.path": "/usr/local/bin/zls",
      "zig.initialSetupDone": true
    }
    

    Neovim

    nvim-lspconfig を使用:

    -- init.lua
    require'lspconfig'.zls.setup{
      cmd = {'/usr/local/bin/zls'},
      filetypes = {'zig'},
      root_dir = require'lspconfig'.util.root_pattern('build.zig', '.git'),
    }
    

    Emacs

    ;; init.el
    (use-package zig-mode
      :hook (zig-mode . lsp-deferred)
      :config
      (setq lsp-zig-zls-executable "/usr/local/bin/zls"))
    

    Zigコマンドラインツール

    Zigは包括的なツールチェーンを提供します。すべてのツールは zig コマンド経由でアクセスできます。

    基本コマンド

    zig version

    Zigのバージョンを表示:

    zig version
    # 出力: 0.12.0
    

    zig help

    利用可能なコマンドのヘルプを表示:

    zig help
    

    コンパイルとビルド

    zig run

    ソースファイルをコンパイルして即座に実行:

    # hello.zig を実行
    zig run hello.zig
    
    # 引数を渡す
    zig run main.zig -- arg1 arg2
    

    zig build-exe

    実行ファイルをビルド:

    # デフォルト(デバッグビルド)
    zig build-exe main.zig
    
    # リリースビルド(最適化)
    zig build-exe -O ReleaseFast main.zig
    
    # 出力ファイル名を指定
    zig build-exe main.zig -femit-bin=myapp
    

    最適化オプション:

    -O Debug          デバッグ情報付き、最適化なし(デフォルト)
    -O ReleaseSafe    安全性チェック付き、最適化あり
    -O ReleaseFast    最速、安全性チェックなし
    -O ReleaseSmall   最小サイズ、最適化あり
    

    zig build-lib

    ライブラリをビルド:

    # 静的ライブラリ
    zig build-lib mylib.zig
    
    # 動的ライブラリ
    zig build-lib -dynamic mylib.zig
    
    # Cと互換性のあるライブラリ
    zig build-lib -dynamic -lc mylib.zig
    

    zig test

    ユニットテストを実行:

    # テストを実行
    zig test mycode.zig
    
    # カバレッジ付き
    zig test --test-filter "specific test" mycode.zig
    

    zig build

    build.zig を使った高度なビルド:

    # デフォルトターゲット
    zig build
    
    # 特定のターゲット
    zig build install
    zig build test
    
    # リリースビルド
    zig build -Doptimize=ReleaseFast
    

    クロスコンパイル

    Zigの最も強力な機能の一つは、簡単なクロスコンパイルです:

    # Linux向け(macOSから)
    zig build-exe -target x86_64-linux main.zig
    
    # Windows向け(Linuxから)
    zig build-exe -target x86_64-windows main.zig
    
    # ARM向け
    zig build-exe -target aarch64-linux main.zig
    
    # すべてのターゲットを表示
    zig targets
    

    ターゲット指定の形式:

    <arch>-<os>-<abi>
    
    例:
    x86_64-linux-gnu
    aarch64-macos
    x86_64-windows-msvc
    arm-linux-gnueabihf
    

    フォーマットとリント

    zig fmt

    コードを自動フォーマット:

    # ファイルをフォーマット
    zig fmt main.zig
    
    # ディレクトリを再帰的にフォーマット
    zig fmt src/
    
    # チェックのみ(変更しない)
    zig fmt --check main.zig
    

    Zigのフォーマットスタイルは固定されており、カスタマイズできません。これにより、すべてのZigコードが統一された見た目になります。

    C言語との相互運用

    zig translate-c

    Cヘッダーファイルを Zig に変換:

    # C ヘッダーを Zig に変換
    zig translate-c input.h > output.zig
    
    # マクロ定義を含める
    zig translate-c -I/usr/include input.h > output.zig
    

    zig cc / zig c++

    Zigを Cコンパイラとして使用:

    # C コンパイラとして使用
    zig cc main.c -o main
    
    # C++ コンパイラとして使用
    zig c++ main.cpp -o main
    
    # クロスコンパイル
    zig cc -target x86_64-windows main.c -o main.exe
    

    初めてのZigプログラム

    Hello World

    最もシンプルなZigプログラムを作成しましょう:

    // hello.zig
    const std = @import("std");
    
    pub fn main() void {
        std.debug.print("Hello, Zig!\n", .{});
    }
    

    実行:

    zig run hello.zig
    # 出力: Hello, Zig!
    

    引数を受け取るプログラム

    // args.zig
    const std = @import("std");
    
    pub fn main() !void {
        const allocator = std.heap.page_allocator;
    
        // コマンドライン引数を取得
        const args = try std.process.argsAlloc(allocator);
        defer std.process.argsFree(allocator, args);
    
        std.debug.print("Program name: {s}\n", .{args[0]});
        std.debug.print("Number of arguments: {}\n", .{args.len - 1});
    
        for (args[1..], 0..) |arg, i| {
            std.debug.print("Argument {}: {s}\n", .{i + 1, arg});
        }
    }
    

    実行:

    zig run args.zig -- foo bar baz
    # 出力:
    # Program name: args
    # Number of arguments: 3
    # Argument 1: foo
    # Argument 2: bar
    # Argument 3: baz
    

    ファイル入出力

    // file_io.zig
    const std = @import("std");
    
    pub fn main() !void {
        const allocator = std.heap.page_allocator;
    
        // ファイルに書き込み
        const file = try std.fs.cwd().createFile("output.txt", .{});
        defer file.close();
    
        try file.writeAll("Hello from Zig!\n");
    
        // ファイルを読み込み
        const read_file = try std.fs.cwd().openFile("output.txt", .{});
        defer read_file.close();
    
        const content = try read_file.readToEndAlloc(allocator, 1024);
        defer allocator.free(content);
    
        std.debug.print("File content: {s}", .{content});
    }
    

    実行:

    zig run file_io.zig
    # 出力: File content: Hello from Zig!
    

    ビルドシステム (build.zig)

    複雑なプロジェクトでは、build.zig を使用します。

    プロジェクト構造

    myproject/
    ├── build.zig
    ├── src/
    │   └── main.zig
    └── test/
        └── main_test.zig
    

    build.zig の例

    const std = @import("std");
    
    pub fn build(b: *std.Build) void {
        // ターゲットとモードの設定
        const target = b.standardTargetOptions(.{});
        const optimize = b.standardOptimizeOption(.{});
    
        // 実行ファイルのビルド
        const exe = b.addExecutable(.{
            .name = "myapp",
            .root_source_file = .{ .path = "src/main.zig" },
            .target = target,
            .optimize = optimize,
        });
    
        b.installArtifact(exe);
    
        // `zig build run` コマンドの追加
        const run_cmd = b.addRunArtifact(exe);
        run_cmd.step.dependOn(b.getInstallStep());
    
        if (b.args) |args| {
            run_cmd.addArgs(args);
        }
    
        const run_step = b.step("run", "Run the app");
        run_step.dependOn(&run_cmd.step);
    
        // テストの追加
        const unit_tests = b.addTest(.{
            .root_source_file = .{ .path = "src/main.zig" },
            .target = target,
            .optimize = optimize,
        });
    
        const run_unit_tests = b.addRunArtifact(unit_tests);
    
        const test_step = b.step("test", "Run unit tests");
        test_step.dependOn(&run_unit_tests.step);
    }
    

    ビルドコマンド

    # プロジェクトの初期化
    zig init-exe
    # または
    zig init-lib
    
    # ビルド
    zig build
    
    # 実行
    zig build run
    
    # 引数付きで実行
    zig build run -- arg1 arg2
    
    # テスト
    zig build test
    
    # リリースビルド
    zig build -Doptimize=ReleaseFast
    
    # インストール
    zig build install
    

    開発ワークフロー

    典型的な開発サイクル

    # 1. プロジェクト作成
    mkdir myproject && cd myproject
    zig init-exe
    
    # 2. コード編集
    vim src/main.zig
    
    # 3. フォーマット
    zig fmt src/
    
    # 4. テスト
    zig build test
    
    # 5. 実行
    zig build run
    
    # 6. リリースビルド
    zig build -Doptimize=ReleaseFast
    
    # 7. バイナリを確認
    ls -lh zig-out/bin/myproject
    

    デバッグ

    GDB を使用

    # デバッグ情報付きでビルド
    zig build-exe -O Debug main.zig
    
    # GDB で実行
    gdb ./main
    
    # GDB コマンド
    (gdb) break main
    (gdb) run
    (gdb) next
    (gdb) print variable
    (gdb) continue
    

    LLDB を使用 (macOS)

    # デバッグ情報付きでビルド
    zig build-exe -O Debug main.zig
    
    # LLDB で実行
    lldb ./main
    
    # LLDB コマンド
    (lldb) breakpoint set --name main
    (lldb) run
    (lldb) next
    (lldb) print variable
    (lldb) continue
    

    パフォーマンス測定

    # ベンチマークビルド
    zig build-exe -O ReleaseFast benchmark.zig
    
    # 実行時間測定
    time ./benchmark
    
    # プロファイリング (Linux)
    perf record ./benchmark
    perf report
    
    # プロファイリング (macOS)
    instruments -t "Time Profiler" ./benchmark
    

    まとめ

    この章では、Zigの開発環境構築について学びました:

  • インストール: 公式バイナリ、パッケージマネージャー、zigup
  • ZLS: エディタとの統合による開発体験の向上
  • コマンドラインツール: コンパイル、テスト、フォーマット、クロスコンパイル
  • ビルドシステム: build.zig による高度なビルド管理
  • 開発ワークフロー: 効率的な開発サイクルの確立
  • 次の章では、Zigの基本構文と変数について詳しく学びます。

    参考資料

  • Zig Download: https://ziglang.org/download/
  • ZLS GitHub: https://github.com/zigtools/zls
  • Build System Documentation: https://ziglang.org/documentation/master/#Build-System
  • Zig Cookbook: https://github.com/ziglang/zig-cookbook