🐥

5分でざっと理解するZig言語

2023/01/11に公開

Zig言語の話をするときに、初めての人にざっと読んでもらうためのページ。

Zig言語とは

静的型付きのコンパイル言語。C言語と同じ立ち位置。

本家
https://ziglang.org/

ziglang.org のoverview 日本語
https://ziglang.org/ja/learn/overview/

Wikipedia
https://ja.wikipedia.org/wiki/Zig_(プログラミング言語)
Wikipedia 英語版
https://en.wikipedia.org/wiki/Zig_(programming_language)

ドキュメント
https://ziglang.org/documentation/master/
標準ライブラリのリファレンス
https://ziglang.org/documentation/master/std/#root

現在の状況

まだ開発中で正式リリースには至っていない。なのでまだ破壊的変更はあり得る。
記事を書いた時点の安定版タグは0.10.0。
公式なパッケージマネージャはまだない。[1](非公式なものは複数存在する)

** 2023/08/15 追記 **
安定版0.11.0のリリースとともに公式版パッケージマネージャが利用可能になりました。
https://ziglang.org/download/0.11.0/release-notes.html

私が考えたキャッチコピー

「C言語が誕生したのは1972年。Zig言語はそれを2020年代の知見で再構成するもの。50年分の進化!!」

"C but with the problems fixed" 原作者 Andrew Kelly

特徴

  • ヘッダファイルが無い。プリプロセッサも無い。例外も無い。ガベージコレクタは無い。
  • オブジェクト指向ではない。
  • C++でのデストラクタは無い。Golangのようにdeferでリソースを解放する。
  • defer, errdefer, ラベル付きblockの導入によりgotoが不要になっている。
  • コンパイル時限定(comptime)で、型で演算できる。つまりジェネリクスと同じ効果。
  • うっかりコーディングミスを未然に防ぐ施策が多々ある。(オーバーフローを検出する演算子など )[2]
  • ソースコードのフォーマットツールが最初からある。
  • クロスコンパイルが簡単。(バックエンドがLLVM) wasmも出力できる。
  • C言語との相互運用がやりやすい。(C ABIのライブラリを呼べるし、C ABIのライブラリを作れる)
  • 言語仕様と標準ライブラリが明確に分離されている。free standing(=ベアメタル環境)対応可能。
  • ZigがCコンパイラ、C++コンパイラとしても使える。
  • ビルドツールを含んでいるので、makeやcmakeのコマンドが不要。
  • CのソースコードをZigに自動変換するツールがある。(全てが自動変換できるわけではないが移行の助けになる)
  • ZigはZig自身で記述されている。(self-hosted)

(いずれ改善されるであろう)弱点

  • まだ正式リリースではないので破壊的変更が入る可能性がある
  • 標準ライブラリがまだ貧弱。(足りないものは自分で作るかCのライブラリを使う)
  • 公式のパッケージマネージャがまだ無い
  • コンパイルエラーのメッセージが人にやさしくないときがある(完全にコンパイラ目線)

ふわっとした説明(2023/01/13追記)

Rustからborrow checkerを外して、Golangのdefer構文を採用したという感じ。
Zig独自の部分はメモリのallocatorを明示的に分離したところとcomptimeによるすっきりとしたgenericsの実現。

人々の声

嘘です。私の感想です。

「Rustの方がいいのはわかっているが、覚えること多いしコンパイル通すのがつらい。」
「Rustでunsafeまみれのコード書くくらいなら、Zigの方が見通しよく書ける。」
「Goが好きだけど、wasmのコード出力したらコードサイズが巨大すぎてロードに時間がかかる」
「ベアメタルの組み込み環境だけどそろそろC言語の次を探したい」

https://twitter.com/tetsu_koba/status/1599320027433684999

Zig言語はいかがですか?

参考

https://zenn.dev/tetsu_koba/articles/032d3a2f675f50

The Road to Zig 1.0 - Andrew Kelley
https://www.youtube.com/watch?v=Gv2I7qTux7g&ab_channel=ChariotSolutions

関連

https://zenn.dev/tetsu_koba/articles/c039b865114b93
https://zenn.dev/tetsu_koba/articles/a2558fc78b135f

脚注
  1. パッケージマネージャは次のリリースで出るかも。https://github.com/ziglang/zig/pull/14265 ↩︎

  2. kernelvm探検隊でこの話をします。https://kernelvm.connpass.com/event/256278/ ↩︎

Discussion