Zigは2015年に登場した新しいオープンソースのプログラミング言語です。Go言語やRust言語のように、C言語の置き換えを目標にしたコンパイラ言語です。その最大の特徴はシンプルであることです。確かに、マクロもプリプロセッサもありませんが、現代的な言語に仕上がっています。最近話題になることが増えてきたので試してみましょう。

  • ZigのWebサイト

    ZigのWebサイト

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

コマンドを実行すると次のように表示されます。

  • ZigでFizzBuzzのプログラムを実行したところ

    ZigでFizzBuzzのプログラムを実行したところ

簡単にプログラムを確認してみましょう。プログラムの(*1)では関数を定義します。関数定義はfn 関数名のように書きます。引数の定義は(引数名: 引数型)のように記述します。

(*2)の部分ではwhile構文を使って1から100までの繰り返しを記述します。whileで他のC言語のfor構文のように書けるのが興味深いところです。

Zigのまとめ

今回はZigについて紹介しました。簡単なプログラムを確認して、Zigの雰囲気を感じてみました。Zigは新しい言語でありながら、ユニットテストやソースコード整形などの機能も最初から備わっており、また、各種エディタ用の設定ファイルなども用意されています。既にC言語が分かるなら、学習コストもそれほど高くないことでしょう。今後が楽しみなZigの動向を見守っていきたいと思います。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。