はじめに
Zigは、堅牢性、最適性、および保守性を重視したプログラミング言語であると知られています。
C言語の代替(better-C)を目指しつつ、モダンな機能を取り入れたシンプルで強力なツールチェーンを提供しています。
ここでは、Zigのインストールから、最初のプログラムを動かすまでの手順を解説しようと思います。
特徴
暗黙の関数呼び出しを行わない
var a = b + c.d;
foo();
var();
例えばこのコードでは、見た通りに
-
b + c.dの評価 foo()-
bar()
のフローで動作し、勝手な処理が挿入されたりしません。これが100%保証されます。
暗黙のメモリ確保がない
ヒープの有無が環境によって異なっても、コードは共通して動作します。ヒープが存在しない環境でも標準ライブラリが使用可能です。
Zigでは、ヒープアロケータを提供・操作する標準ライブラリ機能は存在しますが、あくまでオプションの機能となっています。
ヒープメモリの割り当てを必要とするすべての標準ライブラリ機能は、実行時に Allocator パラメータを受け取ります。これは、Zigの標準ライブラリがフリースタンディング(OSのない)環境をサポートしていることを意味します。これによって例えば、std.ArrayList や std.AutoHashMap はベアメタルプログラミングでも使用可能となっています。
標準ライブラリの完全オプション化
Zigは標準ライブラリが「完全にオプション」であり、使っても使わなくてもよく、使った分だけバイナリに含まれます。そのため、ベアメタルにも高レイヤアプリケーション開発にも最適です。
WASMにおいても、他言語より小さいバイナリを作成ことが期待されます。
新しいライブラリ言語としての役割
- クロスコンパイルに強い
- エラーハンドリングが強力
- GC(ガベージコレクション)に依存しない
言語としてだけでなく、ビルドツールとしても強力なオールインワンパッケージを提供します。
Simplicity
- C++、Rust、D言語のような 言語機能の複雑さに悩む時間がゼロになります
→「言語仕様のデバッグ」に費やす時間がなくなり、
コンパイラは極力シンプルで、特別な「魔法」はなく、コードを読めば挙動が分かります。
Zigは、「言語を覚えるコスト」と「ビルド環境の構築」における課題を解決するためのツールチェーンです。
コンプタイム(Comptime)
コンパイル時のコード実行と遅延評価に基づく、メタプログラミングへの新しいアプローチを提供します。
- コンパイル時に任意の関数を呼び出せます。
- ランタイムオーバーヘッドなしに、型を値として操作できます。
- コンパイル時の実行(Comptime)では、ターゲットアーキテクチャをエミュレートします。
インストール
Zigのインストールは非常に簡単です。公式のバイナリをダウンロードしてパスを通すだけです。
公式バイナリ (推奨)## はじめに
Zigは、堅牢性、最適性、および保守性を重視した汎用プログラミング言語です。
C言語の代替を目指しつつ、モダンな機能を取り入れたシンプルで強力なツールチェーンを提供します。
この記事では、Zigのインストールから、最初のプログラムである「Hello World」を動かすまでの手順を解説します。
特徴
暗黙の関数呼び出しを行わない
var a = b + c.d;
foo();
var();
例えばこのコードでは、見た通りに
-
b + c.dの評価 foo()-
bar()
のフローで動作し、勝手な処理が挿入されたりしません。これが100%保証されます。
暗黙のメモリ確保がない
ヒープの有無が環境によって異なっても、コードは共通して動作します。ヒープが存在しない環境でも標準ライブラリが使用可能です。
Zigでは、ヒープアロケータを提供・操作する標準ライブラリ機能は存在しますが、これらは言語本体に組み込まれたものではなく、オプションの機能です。
ヒープメモリの割り当てを必要とするすべての標準ライブラリ機能は、実行時に Allocator パラメータを受け取ります。これは、Zigの標準ライブラリがフリースタンディング(OSのない)環境をサポートしていることを意味します。例えば、 std.ArrayList や std.AutoHashMap はベアメタルプログラミングでも使用可能です!
標準ライブラリの完全オプション化
Zigは標準ライブラリが「完全にオプション」であり、
使っても使わなくてもよく、使った分だけバイナリに含まれます。
そのため、ベアメタル開発にもハイレベルなアプリケーション開発にも最適です。
WebAssemblyにおいても、他言語より小さいバイナリを作成できます。
新しいライブラリ言語としての役割
- クロスコンパイルに強い
- エラーハンドリングが強力
- GC(ガベージコレクション)に依存しない
言語としてだけでなく、ビルドツールとしても強力なオールインワンパッケージを提供します。
Simplicity
- C++、Rust、D言語のような 言語機能の複雑さに悩む時間がゼロになります
→「言語仕様のデバッグ」に費やす時間がなくなり、
コンパイラは極力シンプルで、コードを読めば挙動が分かります。
Zigは、「言語を覚えるコスト」と「ビルド環境の構築」における課題を解決するためのツールチェーンです。
コンプタイム(Comptime)
コンパイル時のコード実行と遅延評価に基づく、メタプログラミングへの新しいアプローチを提供しています。
- コンパイル時に任意の関数を呼び出せます。
- ランタイムオーバーヘッドなしに、型を値として操作できます。
- コンパイル時の実行(Comptime)では、ターゲットアーキテクチャをエミュレートします。
インストール
Zigのインストールは比較的簡単だと思います。公式のバイナリをダウンロードしてパスを通すだけです。
公式バイナリ
Zigの公式サイトから、自分のOSに合ったバイナリをダウンロードします。
ダウンロードしたファイルを解凍し、適当な場所に配置して、その中の zig コマンドがあるディレクトリにパスを通せば完了です。
Hello World
では、実際にZigのコードを書いて動かしてみましょう。
コードの作成
hello.zig というファイルを作成し、以下のコードを記述します。
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, {s}!\n", .{"World"});
}
解説
Zigでは std 構造体を通して標準ライブラリの機能にアクセスします。
-
pub fn main() !void: エントリーポイントとなるmain関数です。!voidは、この関数がエラーを返す可能性があることを示しています(Error Union Type)。 -
std.io.getStdOut().writer(): 標準出力へのライターを取得しています。 -
try stdout.print(...): フォーマット付きで文字列を出力します。tryは、もしprintがエラーを返した場合に、そのエラーをmain関数の呼び出し元に伝播させるためのキーワードです。
実行
Zigのソースコードを実行するには、 zig run コマンドを使います。
$ zig run hello.zig
Hello, World!
また、 zig build-exe コマンドを使うと、実行可能ファイルを生成できます。
$ zig build-exe hello.zig
$ ./hello
Hello, World!
これでZigの第一歩は完了です!
Zigの公式サイトから、自分のOSに合ったバイナリをダウンロードします。
ダウンロードしたファイルを解凍し、適当な場所に配置して、その中の zig コマンドがあるディレクトリにパスを通せば完了です。
ZVM (Zig Version Manager)
複数のバージョンを切り替えたい場合は、ZVM などのバージョンマネージャーを使うのも便利です。
# インストール (Linux/macOS)
curl -s https://raw.githubusercontent.com/tristanisham/zvm/master/install.sh | bash
# 最新版のZigをインストール
zvm install master
zvm use master
パッケージマネージャー
Homebrew (macOS/Linux) や Scoop (Windows) などのパッケージマネージャーでもインストール可能です。
# macOS
brew install zig
# Windows (Scoop)
scoop install zig
Hello World
では、実際にZigのコードを書いて動かしてみましょう。
コードの作成
hello.zig というファイルを作成し、以下のコードを記述します。
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, {s}!\n", .{"World"});
}
解説
-
const std = @import("std");: 標準ライブラリをインポートしています。Zigではstd構造体を通して標準ライブラリの機能にアクセスします。 -
pub fn main() !void: エントリーポイントとなるmain関数です。!voidは、この関数がエラーを返す可能性があることを示しています(Error Union Type)。 -
std.io.getStdOut().writer(): 標準出力へのライターを取得しています。 -
try stdout.print(...): フォーマット付きで文字列を出力します。tryは、もしprintがエラーを返した場合に、そのエラーをmain関数の呼び出し元に伝播させるためのキーワードです。
実行
Zigのソースコードを実行するには、 zig run コマンドを使います。
$ zig run hello.zig
Hello, World!
また、 zig build-exe コマンドを使うと、実行可能ファイルを生成できます。
$ zig build-exe hello.zig
$ ./hello
Hello, World!