Zigは2015年に登場した新しいオープンソースのプログラミング言語です。Go言語やRust言語のように、C言語の置き換えを目標にしたコンパイラ言語です。その最大の特徴はシンプルであることです。確かに、マクロもプリプロセッサもありませんが、現代的な言語に仕上がっています。最近話題になることが増えてきたので試してみましょう。
Zigとは
Zigはアンドリュー・ケリー氏によって2015年に登場した新しいプログラミング言語です。コンパイラ基盤のLLVMを利用しており、幅広いOSに対応した実行ファイルを生成することができます。
Zigはシンプルをモットーとしています。Zigのマニュアルでは、C++やRust、D言語など多くの機能を持つ言語を挙げて、それらとは異なりシンプルであることを名言しています。
そして、その構文は、C言語と似ているのですが、遅延処理のdefer構文や型推論など、現代的な言語機能を備えています。また、C言語との連携が考慮されており、C言語で作った資産を活用できます。
また、Zigの生成する実行ファイルのサイズが小さいのも特徴です。ブラウザ上でアプリを実行するWebAssemblyにも対応しており、生成ファイルサイズが小さいという点でも有利です。
しかし、Zigにはスクリプト言語には当然実装されているGCと呼ばれるメモリの自動管理機構が存在しません。そのため、メモリの確保や解放はプログラマーが責任を持って管理する必要があります。
Zigのインストール
それでは、Zigをインストールして試してみましょう。
こちらに各OSごとにバイナリファイルが提供されています。バイナリを利用する場合、ZIPファイルを解凍し、パスを解凍したフォルダにパスを通しましょう。(Windows10/11であれば、Windowsメニューを開き「環境変数」を検索します。そして、環境変数PATHに、Zigのインストールパスを追加します。) 原稿執筆時点でZigのバージョンは0.9.1ですが、各種パッケージマネージャーでのインストールも可能となっています。こちらにコマンドの一覧があります。
macOSのHomebrewであれば、次のコマンドを実行します。
brew install zig
Windowsのchocolateyであれば次のコマンドを実行します。
choco install zig
Ubuntu/Linuxであれば次のコマンドを実行します。
snap install zig --classic --beta
一番簡単なプログラム
それでは、Zigで最も簡単なプログラムを作ってみましょう。以下のプログラムを「hello.zig」という名前で保存しましょう。
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer(); // 標準出力を得る
try stdout.print("Hello, World!\n", .{}); // メッセージを出力
}
コンパイラ言語ではありますが、直接ソースファイルを実行できます。以下のコマンドでプログラムを実行できます。
zig run hello.zig
プログラムを確認してみましょう。プログラムは、C言語と同じようにmain関数から始まります。標準ライブラリのstdより、標準出力stdoutを得て、printで「Hello, World!」を出力するプログラムとなっています。 なお、上記の手順では、プログラムを実行することだけに注力しましたが、Zigで実行ファイルを作成するには、最初にプロジェクトを作成すると簡単です。
mkdir hello
cd hello
zig init-exe
するとプロジェクトのひな形が生成されるので、「src/main.zig」を編集します。そして、次のbuildコマンドを実行します。
zig build
以上の手順で、zig-out/bin以下にhelloという実行ファイルが生成されます。
FizzBuzz問題を解いてみよう
本連載で恒例のFizzBuzz問題を解いてみましょう。FizzBuzz問題とは次のようなものです。FizzBuzz問題では条件分岐やループなど基本的なプログラミング言語の構文を確認できます。
> 1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。
Zigでちょっと冗長にFizzBuzz問題を解くと次のようになります。
const std = @import("std");
// 関数の定義 --- (*1)
fn isFizz(n: u64) bool {
return (n % 3 == 0);
}
fn isBuzz(n: u64) bool {
return (n % 5 == 0);
}
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
// 1から100まで処理を繰り返す --- (*2)
var i: u64 = 1;
while (i <= 100) : (i += 1) {
if (isFizz(i) and isBuzz(i)) {
try stdout.print("FizzBuzz\n", .{});
} else if (isFizz(i)) {
try stdout.print("Fizz\n", .{});
} else if (isBuzz(i)) {
try stdout.print("Buzz\n", .{});
} else {
try stdout.print("{d}\n", .{i});
}
}
}
プログラムを実行するには、次のようなコマンドを実行します。
zig run fizzbuzz.zig
コマンドを実行すると次のように表示されます。
簡単にプログラムを確認してみましょう。プログラムの(*1)では関数を定義します。関数定義はfn 関数名のように書きます。引数の定義は(引数名: 引数型)のように記述します。
(*2)の部分ではwhile構文を使って1から100までの繰り返しを記述します。whileで他のC言語のfor構文のように書けるのが興味深いところです。
Zigのまとめ
今回はZigについて紹介しました。簡単なプログラムを確認して、Zigの雰囲気を感じてみました。Zigは新しい言語でありながら、ユニットテストやソースコード整形などの機能も最初から備わっており、また、各種エディタ用の設定ファイルなども用意されています。既にC言語が分かるなら、学習コストもそれほど高くないことでしょう。今後が楽しみなZigの動向を見守っていきたいと思います。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。