5分でざっと理解するZig言語
Zig言語の話をするときに、初めての人にざっと読んでもらうためのページ。
Zig言語とは
静的型付きのコンパイル言語。C言語と同じ立ち位置。
本家
ziglang.org のoverview 日本語
Wikipedia
Wikipedia 英語版ドキュメント
標準ライブラリのリファレンス現在の状況
まだ開発中で正式リリースには至っていない。なのでまだ破壊的変更はあり得る。
記事を書いた時点の安定版タグは0.10.0。
公式なパッケージマネージャはまだない。[1](非公式なものは複数存在する)
** 2023/08/15 追記 **
安定版0.11.0のリリースとともに公式版パッケージマネージャが利用可能になりました。
私が考えたキャッチコピー
「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言語の次を探したい」
Zig言語はいかがですか?
参考
The Road to Zig 1.0 - Andrew Kelley
関連
-
パッケージマネージャは次のリリースで出るかも。https://github.com/ziglang/zig/pull/14265 ↩︎
-
kernelvm探検隊でこの話をします。https://kernelvm.connpass.com/event/256278/ ↩︎
Discussion