システムプログラミングにおいて、Cは小さなフットプリントとマシンハードウェアへの近さから、依然として基礎的な標準であり続けています。しかし、開発者はCのリソース管理やエラー状態の手動管理において、しばしば摩擦を感じることがあります。Zigは、この低レイヤーの哲学を維持しつつ、時間のかかる作業やエラーの元となる特定のパターンを排除するために設計された機能を導入する、現代的な代替手段として位置付けられています。メモリ安全性のために大きな儀式を導入するRustとは異なり、ZigはCの一般的なタスクをより堅牢にし、テストしやすくすることに焦点を当てています。

Zigにおける主要な改善の一つは、リソースのクリーンアップの処理方法です。Cでは、関数が途中で失敗した場合に、以前に割り当てられたリソースを正しい逆順で解放するために、開発者は通常`goto`ラベルを使用します。Zigはこれを`errdefer`に置き換えます。これは、クリーンアップの指示を割り当てのすぐ隣に配置するメカニズムです。Zigは、関数がエラーを返した場合にのみ、これらの指示を自動的に逆順で実行します。このアプローチはコードを簡素化するだけでなく、よりきめ細かなテストも可能にします。例えば、開発者は特殊な「FailingAllocator」を使用して、すべての特定の失敗パスがメモリをリークすることなく、対応するクリーンアップを正しくトリガーしているかを確認できます。

リソースのクリーンアップのためにZigでerrdeferを使用する様子を示すコードリスト。
Zigのerrdeferメカニズムは、Cのgotoラベルと比較して、よりクリーンなリソース管理を可能にします。www.mtsoukalos.eu

この画像は、テキストで説明されているZigのerrdeferメカニズムを例示しており、クリーンアップの指示が割り当ての隣にどのように配置されるかを示しています。

複数のerrdefer文を含むZigの関数を示すコードリスト。
Zigが複数のクリーンアップタスクを自動的に逆順で処理する例。www.mtsoukalos.eu

この視覚資料は、第2段落で言及されている自動的な逆順クリーンアップロジックの具体的な例を提供します。

Zigはまた、メモリ境界やエラー処理に関するCの一般的な落とし穴にも対処しています。Cでは、関数に渡される配列は生のポインタとして扱われることが多く、範囲外のインデックスに誤ってアクセスしてしまうことが容易です。Zigは、データとその長さをセットにする「スライス」を使用し、デバッグモードやセーフモードでコンパイラがそのようなエラーを検知できるようにします。さらに、Cでは`close()`のような関数の戻り値を無視することが許容されますが、Zigはエラーを戻り値の一部として扱います。コンパイラは、開発者が`try`、`catch`、または`if`文を使用して明示的にエラーを処理しない限り、プログラムのビルドを拒否します。テキストを操作するCのプリプロセッサの代わりに、Zigは`comptime`を使用して通常のZigコードをコンパイル時に実行し、ジェネリックなデータ構造や構成に対してより優れた型チェックを提供します。

エラー型を返すZigの関数を示すコードリスト。
Zigの明示的なエラー処理では、開発者はtryまたはcatchを使用して戻り値を処理する必要があります。www.mtsoukalos.eu

この画像は、Cのオプションの戻り値とは異なり、Zigがエラーを戻り値の一部として扱う方法についての議論をサポートします。

Zigのスライスとその長さプロパティを示すコードリスト。
Zigのスライスは、範囲外のメモリアクセスを防ぐためにデータと長さをセットにします。www.mtsoukalos.eu

このスクリーンショットは、Cの生のポインタの落とし穴に対する解決策として第3段落で説明されている「スライス」の概念を例示しています。

これらの利点がある一方で、Zigには安定性と安全性に関する特定のトレードオフが含まれます。Zigはすべてのメモリエラーを排除するわけではなく、use-after-freeバグを許容し、ポインタがダングリング状態になることを防ぐわけではありません。さらに、「fast」および「small」モードでは、Cのパフォーマンスプロファイルに合わせるために、多くの安全性チェックが無効化されます。Zigはまだ進化の過程にあるため、Cが提供する数十年のツール、ドキュメント、ハードウェアサポートを欠いています。レガシーシステムやベンダー固有のCコンパイラしか提供されないマイクロコントローラで作業する開発者にとっては、Cが実用的な選択肢であり続けますが、新しいプロジェクトにとっては、Zigはより現代的な安全網を備えながらマシンに近いコードを書く方法を提供します。

Hacker Newsの読者の反応

  • 代替案: あるコメント投稿者はプロジェクトの信頼性について懸念を表明し、MUSLライブラリのZigによる書き換えにおいて、繰り返し発生する重大なエラーを観察したと述べています。 コメント ↗
  • 懐疑的: 別のユーザーは、1.0以前のバージョンについては問題が致命的ではない可能性を示唆し、ユーザーは他のlibc実装にリンクできる可能性があると指摘しました。 コメント ↗
  • 懐疑的: あるコメント投稿者は、プロジェクトのチームサイズが小さいため、特定のバグ修正や機能を迅速に優先順位付けすることが困難であると主張しました。 コメント ↗

Hacker Newsのスレッドで出た意見の要約です。事実として検証されたものではありません。 議論の全文を読む ↗