第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.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の開発環境構築について学びました:
次の章では、Zigの基本構文と変数について詳しく学びます。