- 数億人のユーザー向けにサービスを提供する会社(非公開)で、コアシステムに C と C++ を使用中
- 2023年の1年間を通じて、Rust と Zig のどちらの言語を採用するかについて議論を実施
- 主な検討事項:
- C 言語との相互運用性
- エンジニアのスケーラビリティ(採用、保守など)
- 最終的な選択: Zig
- この選択プロセスは、大規模な企業で「コードが多様な対象環境で実行され、数億人のユーザーに影響を与えるときに考慮する要素」をよく示していると思い、共有する
C 相互運用性の重要性
- 書き換えようとしているライブラリは、すべてのプラットフォーム(Web、モバイル、VR ヘッドセット、ゲームコンソール、デスクトップなど)で使われる可能性がある
- そのため、C API の提供と FFI を通じた利用が、すべてのプラットフォームでの実行を保証する唯一の方法
主な議論の論点
Rust
- 当時は Zig より 25 倍以上人気があった(アンケート調査およびサブレディット基準)
- より長い期間にわたって安定した状態を維持している
- Rust Foundation に対する産業界からの支援は安定しているように見える
- 優れた LSP と開発者体験
- Cargo: 業界最高水準のパッケージマネージャー
- メモリ安全性と「未定義動作がない」(完全に正しいわけではないが、議論の中で言及された)
- C++ から脱却するなら、メモリエラーや未定義動作の可能性がない Rust の方が適している
nightly バージョンで SIMD をサポート
- WASM サポートは Zig と同じくらいスムーズ
- 性能面では Zig と同等、または一部のケースでは「かなり高速」
Rust の C 相互運用性:
- Rust には独自の豊かなエコシステムがあり、C 相互運用性の重要度は相対的に低い
- Python バインディングなど、高水準言語との連携の可能性に優れる
- Rust を使う利点が、C バインディングを提供する欠点を相殺するという主張
Zig
- C/C++ または TypeScript を背景に持つ開発者が容易に学べる
- C を背景に持つ開発者に楽しいコーディング体験を提供
- Zig コンパイラは C と C++ のコンパイルも可能で、依存関係管理や C ABI ライブラリ構築に有利
- 多様な対象プラットフォームのサポートが非常に容易(
zig targets コマンドが高評価)
- 高速なソフトウェアを簡単に書ける(ネイティブな
Vector サポート、SIMD 活用など)
- 既存のデバッガと互換性がある
- 優れたビルドシステム(既存の Makefile より 100 倍改善)
- Zig Software Foundation の高い財務透明性
- 既存の C++ コードを段階的に移植し、「Zig 化」できる
- すべての対象プラットフォームにおけるリンク/コンパイルの問題解決が確実
結論
- Zig は既存コードベースの移植と、すべてのプラットフォーム互換性を保証するために必要な時間と労力を大きく削減する
- 予想外の決定要因:
- 学習のしやすさと採用が予想以上に大きな影響を与えた(Zig に有利)
- ツールチェーンに関する開発者体験が重要な役割を果たした
- Zig コンパイラとビルドシステムは、既存コードベースとの互換性のため大いに役立った
- Rust のエコシステム、コミュニティ、メモリ安全性の保証は、予想より影響力が小さかった
10件のコメント
とても面白い記事で、楽しく読みました! Node と Bun、そして Deno について調べていたところ、Bun が Zig という聞き慣れない言語で書かれていると知って、どんな言語なのか気になっていたのですが、いい入門になりました!
Zig の大きな問題のひとつは、コンパイル時にユーザーが書いたコードにエラーがある場合、正確な位置や情報を教えてくれないことです。標準ライブラリまでしか示されないようです。
検討事項や議論の論点、結論などを読んでみると、そもそも Rust が必要な環境ではなかったようですね。料理を配達するのにオフローダーを乗り回す配達員を見たことがありますか?
ネイティブ言語で開発する必要はあるにしても、memory-critical な作業でないなら開発しやすい方を選ぶのが正しいでしょう。これを何も1年間も議論するほどのことでは……
数億人のユーザーを対象にしている……
どの会社なのか気になりますね。認証という形式的な手続きに縛られない会社のようで……うらやましい……
年に一度くらいは Zig を見て回るのですが、ほぼ毎年 breaking change があった気がします;;
そのうえ、言語自体としてキューやスレッド間メッセージ受け渡しライブラリが用意されていないので、Rust の成熟度と比べると、まだ先は長い気がします。
もちろん、ユーザーが OS API に精通していれば大きな問題ではないかもしれませんが…
RustはZigより25倍以上人気がありますが、採用面ではZigのほうが有利なのですね。
1番目の項目である、C/C++ または TypeScript を背景に持つ開発者が学びやすいからだと思います
C言語バックグラウンドの開発者に楽しいコーディング体験を提供
高速なソフトウェアの作成が容易(ネイティブのVectorサポート、SIMD活用など)
初めてPythonを学んだときの感覚ですね
BunがZig言語で開発されているのを見て、なぜよりによってZigだったのだろうと気になっていましたが、Rustとの良い比較記事のおかげで理解できました。とはいえ、C言語は本当に永遠に不滅のようですね。