世界を動かす技術を、日本語で。

Zigの実例による解説

概要

  • Zig は堅牢性・最適化・シンプルさを重視した システムプログラミング言語
  • 本ガイドは 注釈付きサンプルコード でZigの基本を解説
  • 各コードブロックは examples/*.zigファイル と対応
  • Zig 0.16.0 のセットアップ方法も紹介
  • Go by Example に影響を受けた構成

Zig入門:注釈付きサンプルで学ぶ

  • Zig はC言語の後継を目指す コンパイル型汎用言語
  • 隠れた制御フローや自動メモリ確保 がなく、挙動が明確
  • プリプロセッサ非搭載 によるシンプルな言語設計
  • 堅牢性 (クラッシュしにくさ)、 最適化 (高速化)、 シンプルさ (理解しやすさ)を重視
  • システム開発や組み込み用途 にも適用可能

サンプルコードの構成と実行

  • 本ガイドの コードブロック は、 content/ ディレクトリ内の記述と examples/*.zig ファイルが完全一致
  • Zig 0.16.0 で動作確認済み
  • macOS ではbrew install zigでインストール
  • その他OSでは 公式サイト (ziglang.org/download)から tarball を取得
  • 主要な実行例:
    • $ zig run examples/01-hello-world.zig Hello, World! の出力
    • $ zig test examples/31-testing.zig テストコード の実行
    • $ zig run examples/44-c-interop.zig -lc libcとの連携 サンプル

Zig by Exampleの特徴

  • Go by Example (Mark McGranaghan作)から着想
  • 実践的な例 を通じて学習効率を向上
  • Zig 0.16 をターゲットとした最新内容
  • 各サンプルには 詳細な注釈 を付与
  • 初心者から中級者 まで幅広く対応

Hackerたちの意見

Zig 0.14を対象にした例があるけど、それ以来かなりの変更があったよ。特に印刷やフォーマットに関して(writergateを見てみて)。

あと、ビルドシステムとCとの相互運用性は古くなってるね。

ああ、でもそのトレーニングデータの変更はもう出てるの?

昨日これを調べたばかりだから、Zigに興味がある人向けに最新のリソースをシェアするね:

  • Karl Seguinの「Learning Zig」: https://www.openmymind.net/learning_zig/
  • https://zig.guide/
  • Pedro Parkの無料プロジェクトベースのオンラインブック「Introduction to Zig」: https://pedropark99.github.io/zig-book
  • Ziglings、修正が必要なほぼ動作するプログラム: https://codeberg.org/ziglings/exercises

「もっと最新」というのは、OPのように最新のソースがもっとあるってこと?それとも、OPが最新じゃないってこと?英語ってややこしいな!

新しい人は、まずはこれを見てみて: https://ziglang.org/learn/why_zig_rust_d_cpp

Zigは好きだけど、すべてのプロジェクトが特定のコンパイラのバージョンを必要とすることに気づいてから学ぶのをやめちゃった。

それが問題だとされる理由を知りたいな。新しいRustの学習者として、興味があるよ。

安定した1.0バージョンがリリースされれば状況は改善するよ。それまでは、mise、nix、docker、またはそれに似たものを使ってね。(他の誰かのマシンでビルドできることを気にするなら、どの言語のプロジェクトでもこれをやるべきだよ。)

すごく簡潔だね。これが言語のドキュメントを読むことに何を追加するのかよく分からない(そのドキュメント自体もあまり良くないし)。言語機能ごとに整理されてるから、大きなスケールの設計決定についてはあまり触れてないと思う。そこが言語の熟練度が見つかるところだと思うんだけど。

Zigって流行りなの、それともちゃんとした言語になるのかな?結局、何かを学ぶのって時間の投資だし。ZigにはRustみたいな業界のプレッシャーがない感じだよね。オープンソースのコミュニティではAI関連の話が出てるし、Hacker NewsでもZigを褒める声があるよ。アロケーターのコンセプトは素晴らしいけど、D言語みたいにメインストリームにならない可能性もあるよね。個人的にはDが好きで、コンパイラも美しいと思ってるけど、言語として優れてるのと、業界で使われるのは別の話だし。だから、Zigを学ぶべきか、もう少し待つべきか迷ってる。今のところ、C#の基本は分かるし、ちょっとPython、C++、TypeScriptも触ったことある。Javaもある程度は知ってるけど、正直言って、作るのはCRUDアプリがほとんど。もっと深く学ぶには、システム言語に手を出す必要があると思うけど、ZigかRustに投資するべきか分からない。

システムプログラミングを学びたいなら、Cを学ぶのをおすすめするよ。システムプログラミングができる言語を学びたいなら、Rustは悪くない選択だと思う。ただ、システムの基礎が分からないとあまり役に立たないかもね。

流行りと確立された言語の違いって何だろう?多くの人(何百万っていると思うけど)がRustは流行りだと思ってるんじゃないかな。> もっと深く学ぶには、システム言語に手を出す必要がある 大半のコードはまだCで書かれてるし。でも正直、ちょっとパフォーマンスを上げたいだけなら、まずはC#の非GC部分(ArrayPool、Span、stackalloc)をチェックした方がいいよ。

Zigは単なる言語じゃないよ。全体のツールチェーンがあって、フリースタンディングをターゲットとして真剣に考えてる。

プログラミング言語の世界では、リンディ効果がすごく強いよね。Zigは面白くてしっかりした言語だけど、ニッチで不安定だし、Cに対して劇的な改善を提供してるわけでもない。Cは現代のカーネルやシステムツールの基盤だから、すぐには消えないと思う。Zigでやることは、ほとんどCやC++でも同じようにできるし。Zigの本当の価値は、よりモダンでおそらく優れた標準ライブラリにあると思う。

どの分野に入りたいの? CRUDアプリの組み立て以外で専門性を高めたいみたいだけど、それによっておすすめする言語が変わるかも。組み込み、ゲーム開発、分散システム、システム管理など、いろいろあるからね。正直、これらの分野でZigを学ぶことを優先するとは思えない理由がいくつかあるよ。* 重要なソフトウェアの既存のコーパスを理解するための前提条件じゃないから(これがCやC++が2026年に重要な理由の一つ)。* メモリ安全じゃないから、GCやRustの借用チェッカーを通じて、セキュリティの重要な属性として見られることが増えてる。* まだ安定してないから、学習や書いたもののビットロットを避けるために、ある程度の手間がかかると思う。* 外から見ると、コミュニティが妙に敵対的でエリート主義に見える。代わりにおすすめするのは、Rust(個人的に好きな言語で、すでに触れたものとは最も異なる)、Go(雇用のために良い選択)、SQL(CRUD系のことをやってるなら知ってるかもだけど、リストに入ってなかった)、bash、あとはもっとPythonやTypeScriptかな。

ここがZigの強みだと思う。高レベルのプログラマーがパフォーマンスの理由で低レベルのプログラミング言語に降りる必要があるとき。高レベルのプログラマーがそれをやるときの問題は、低レベルの作業を頻繁にはやらないことだよね。だから、低レベルのプログラミングをたくさんやる別の分野で働かない限り、降りるたびに実践が不足してることになる。これが、統合が簡単なシンプルな低レベル言語を使うことを好む理由だよ。RustやC++はあまり頻繁に使われることに向いてないけど、Cはシンプルな標準ライブラリと構文でこれにぴったり合う。ただ、現代のプログラミング言語に期待するものがないし、実践が不足してると忘れやすい危険な足元の罠が多い。そこでZigが登場する。低レベルで、自分のツールチェーンを持っていて作業が快適で、クロスコンパイルも簡単だし、Cよりも多くの安全機能が組み込まれてるけど、複雑すぎない。コードはより冗長になる傾向があるけど、逆にわかりやすい。だから、高レベル言語で全てをこなせないとわかっているときにぴったりの言語なんだ。私にとって、それが決め手だね。Odinの方がシンタックスがいいと思うけど、cargo-zigbuildのようなツールが存在する理由がある。Zigに関係ないプロジェクトがZigのツールチェーンを提供して、生活を楽にしようとしてるのは、Zigがこれを真剣に考えてる証拠だよ。1. https://crates.io/crates/cargo-zigbuild

アンドリュー・ケリーとのインタビュー動画を見た方がいいよ。彼がそのことを説明してるから。https://www.youtube.com/watch?v=iqddnwKF8HQ 個人的な感想だけど、Zigは1.0のタグがリリースされたらもっと安定すると思う。今はネットで自分のエラーの解決策が見つからないけど、ZigのDiscordサーバーの人たちが助けてくれてる。

なんで人はまだプログラミング言語を投資として見るんだろう?プログラミングを知ってれば、ただの別の構文に過ぎないのに。プログラミングを学ぶことに集中した方がいいよ。

新しい言語を学ぶのは、純粋に学ぶこと自体のためにも価値があると思う!RustとZigの両方に当てはまるよ。Rustは知的に興味深いけど、Zigならもっと早く使える趣味のプロジェクトを書くことができると思う(私はZigを学びながら『Crafting Interpreters』を同時に読むことにしたんだ。本のコードをそのまま写しながらね)。ZigはRustよりも学びやすいけど、リリース間で構文が非常に不安定になることに注意が必要だよ(0.15.2と0.16の間でIOに関する大きな変更があったから)。将来的に何をプロとして使うか、10年後に何が流行るかを予測するのは本当に難しいけど、さまざまなトピックを学ぶことから得られる価値は大きいと思う。楽しさを優先することが大事だと信じていて、楽しさから有用性が生まれることが多いと感じてる。たとえそうじゃなくても、楽しい時間を過ごして、自分が豊かになったことは間違いないよ!

.{}の中に引数をカプセル化するのは、余計でうるさい気がする。これが何らかの形で合理化されるのは分かるけど、パースを簡単にしたり、珍しい曖昧さを解決したりするためだとしても、ちょっと理解できないな。これは小さなことだし、細かいことを言ってるって思われるかもしれないけど、新しい言語を学ぶときには文法に対して多少の摩擦があるのは覚悟してるけど、無駄だと思うものには耐えられない。同じように、コンパイルエラーを避けるために _ = foo(.{}); を強制するのも嫌だな…

Zigでは、関数の引数は .{} でラップされないよ。.{} は構造体やタプルを作るための構文なんだ。これはオプション引数(オプション構造体)や可変引数関数(タプル)を許可するためのパターンとして使われてる。戻り値を明示的に捨てるのは、最近の多くのプログラミング言語が強制してることだよ。

引数を .{} でカプセル化するのは余計でうるさいように思える。これやらないの?これは varargs やオプショナルのためだけだよ。.{} は Type{}(構造体のコンストラクタ)のショートハンドで、「コンパイラ、型を決めて」っていう意味。だから、逆に言えば、代替案よりも余計にうるさくないし、型名を変更したときにも互換性が高いよ。

私はこう考えてる。変数を定義するための完全なシグネチャは:var foo: Foo = Foo{}; 短縮する方法は二つある:var foo = Foo{}; var foo: Foo = .{}; 右側から変数の型を推測できるし、または変数の型から右側の型を推測できる。だから、引数として .{} が見えるときは、関数のシグネチャから型を推測してるってこと。デフォルト値を使ってるから空になってるだけだよ(またはアイテムが0のタプル)。編集:余分なドットを修正した。

これ、古いしAIが生成したものだよ。Zigの学習素材でインタラクティブで例を使った良いソースが欲しいなら、ziglingsをチェックしてみて:https://codeberg.org/ziglings これは人間が書いてテストしてるから、学習には欠かせないよ。ちなみに、公式のZigウェブサイトにも載ってる。このプロジェクトは常に最新のZigリリースに合わせて更新されてる。

まあ、これも退屈なGoの本を作った同じ人が関わってるから、退屈なGoも今ではおそらくAI生成なんだろうね。本を読む前や買う前に、著者を徹底的に調査する必要がある。著者の名前は今や以前よりも重要だと思う。本が共有されるときは、著者を強調する必要があるよね。

Zigの大きな問題は、AIを活用せずに自分たちで行き詰まってしまったことだと思う。反AIの絶対主義者たちを引き寄せてしまって、これが大きな障害になるだろうね。Rustユーザーとして、AIのおかげでRustは以前は怖がっていた開発者たちの手に簡単に渡った。LLMをいじったり、AIの使用にこだわらない他のRust開発者に質問したりすることで、Rustについてたくさん学んだよ。群衆のルールに屈すると、自分の存在が完全にその群衆のイデオロギーに依存することになって、適応力や競争力を失うことになる。例) 大手スタジオの「現代のオーディエンス」向けのゲーム。

これを使わない方がいいよ。Lorisが言うこと以外なら、ziglingsをおすすめする:コードを読む必要がある。これらの例ではビルトインがコンパイルすらできない。これは少なくとも2年前の情報だよ。

すべての章をざっと見たけど、例があまりにも単純すぎて、Zigの構文や意味を十分に示せてないね。