
2025/12/05 6:40
Thoughts on Go vs. Rust vs. Zig
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
著者は、Go、Rust、Zig の3つの言語を実験的に比較し、それぞれが得意とする点を把握しています。各言語は独自の設計哲学を持ち、信頼性・高性能コードを書くための強みとトレードオフが形成されています。
| 言語 | デザイン & 強み | トレードオフ |
|---|---|---|
| Go | 小規模な機能セットを備えた「モダンC」のようなミニマリスト設計。ガベージコレクション付きで安定性・可読性に重点を置く。ジェネリクスは 12 年の要望後、Go 1.18で初登場。企業内協力や並行プログラミング向きで、ボイラープレートは多いがコードは読みやすい。 | ボイラープレート; ジェネリクス遅延; メモリに対する細かな制御がない。 |
| Rust | 「ゼロコスト抽象化」のマキシマリスト設計。密な型体系とトレイトでコンパイル時に安全性(未定義動作なし)を保証し、実行時オーバーヘッドなしで高性能を提供。 | 学習曲線が急; 文法が複雑; 所有権・借用の深い理解が必要。 |
| Zig | 最新バージョン(v0.14)で手動メモリ管理、GCやOOP機能(プライベートフィールド、ダイナミックディスパッチ)は持たない。開発者はアロケータ経由でバイト数を明示的に割り当て、可変グローバルも簡単に作成できる。実行時安全性のためにチェック付き/無効化モードを選択可能。オブジェクトごとの RAII よりも、プログラムフェーズ(例:イベントループイテレーション)に合わせた大きなチャンク割り当てを好む。Go の抽象化と Rust の安全性のハードルへの反応として「あなたが宇宙を制御する」ことを掲げる。チームは安定版前に依存関係を書き換え、Linux カーネルに挑戦するなどの野心を抱えている。 | より多くの責任; 手動メモリ管理学習曲線; まだ進化中; 主にオブジェクト指向思考を排除したい開発者に訴求。 |
主な結論
- Go は可読性と安定性が原始的制御より優先される企業内・並行環境で人気。
- Rust は厳格な保証とゼロオーバーヘッドを求め、学習コストを受け入れる開発者に魅力的。
- Zig は GC や OOP 抽象化なしで細かな手動メモリ管理を望むチーム向けの代替案。成熟度はまだ成長段階だが、将来のシステムレベル開発に影響を与える可能性がある。
本文
2025年8月9日
最近、私は「仕事に合った正しいツールを使う」よりもむしろ「仕事でそのツールを使う」ということが多く、結果として私が知っているプログラミング言語はそれによって決まってきたと気づきました。過去数か月にわたり、職場では使えない言語を実際に試してみる時間を多く費やしました。その目的は習熟度を上げることではなく、それぞれの言語が得意とする領域について自分なりの見解を形成することです。
プログラミング言語は比較対象として「トレードオフがある」という結論に至らないと、どんな特徴を持つかを比較しにくいほど多様な軸で差異があります。もちろんトレードオフは存在します。重要なのは「なぜこの言語はこうしたトレードオフのセットを選んだのか?」という問いです。
その質問は、私がハンディキャップとして機能するような機能リストで言語を選びたくないから興味深いものです。ソフトウェア構築とツールへのこだわりを大切にしている私は、言語が取るトレードオフを通じて表す価値観を知りたいのです。
また、機能セットが重なる言語同士の違いを明確化するためにも役立ちます。たとえば「Go vs Rust」や「Rust vs Zig」のような質問数が多いという事実は、人々が混乱している証拠と言えるでしょう。ある言語XがWebサービス構築に優れている理由を「機能a,b,cが備わっているから」と覚えるよりも、「Yはインターネットを嫌う設計者によるものだから」という価値観で記憶した方が容易だと私は思います。
以下では、最近試してきた3つの言語 ― Go、Rust、Zig ― に対する印象をまとめました。各言語の経験から、その言語が何を重視し、それにどれだけ忠実に実装されているかという総合的な結論へと統合しています。これは簡略化してしまうかもしれませんが、こうした偏見を固めること自体が目的です。
Go
Goはミニマリズムで際立っています。「モダンC」と称されることもあります。ガベージコレクションと実行時環境を備えている点ではCとは異なりますが、頭に収められるほどシンプルという意味で似ているのです。
Goは機能数が極端に少ないため、一度理解すれば全体像を把握できます。長い間、Goはジェネリクスを持たないことで悪名高かったですが、12年もの間多くの人々から求められた結果、Go 1.18で実装されました。タグ付きユニオンやエラーハンドリング用の構文糖といったモダン言語にありがちな機能は追加されていません。
Go開発チームは機能追加に対して高い基準を設けているようです。その結果、ロジックを他言語よりも冗長に書く必要がある一方で、安定した可読性の高いコードを書くことができます。
例としてGoのスライスタイプを挙げます。RustやZigにもスライスはありますが、両者は肥大ポインタのみです。一方Goでは、連続メモリ領域への肥大ポインタでありながら自動的に伸長できるため、Rustの
Vec<T>やZigのArrayListを統合した機能を持ちます。Goはメモリ管理を任せてくれるので、スライスのバックエンドがスタックかヒープかを考える必要はありません。
起源としては、Rob PikeがC++プロジェクトのビルド待ちにうんざりし、Googleで働く他の開発者が同じC++コードベースでミスを繰り返すことに不満を抱いていたと聞きます。GoはC++が複雑なところを簡素化した言語であり、並行処理を書きやすいよう設計されています。
職場ではGoを使っていませんが、企業内の協調性を重視するならGoは十分に適していると感じています。組織でソフトウェアを開発する際に直面する課題を解決してくれます。
Rust
Rustはミニマリズムの対極に位置します。「ゼロコスト抽象化」がよく語られる言語ですが、実際には「ゼロコスト抽象化が大量にある」ことが特徴です。
学習曲線の高さで知られています。Jamie Brandon の意見に同意し、「ライフタイムが難しいわけではなく、言語に詰め込まれた概念の数が多い」ことを指摘します。GitHub 上のコメント例もその密度を示しています。
Rustは「安全性」と「パフォーマンス」という二つの目標を両立させようとするため、複雑になっています。パフォーマンスは自明ですが、「安全性」が何を意味するかは曖昧です。私にとっては「メモリ安全性」、すなわち無効ポインタ参照や二重解放などが起こらないこと、さらに未定義動作(UB)を避けるという意味でした。
UBとはプログラムの実行中に予測不能な状態になることで、エラーが検知されずにヒステリックバグや脆弱性につながります。Rustはコンパイル時にチェックしてランタイムコストなしで安全性を保証しようとします。これには豊富な型システムとトレイトのメンバーシップが必要です。
結果として、Rustでは「こういうもの」を書く際にその名前(トレイト名など)を見つけて実装する必要があります。この手間は多いですが、成功すれば他言語では保証できない動作保証やライブラリ消費の容易さが得られます。
Zig
Zigは三者中最も新しく未成熟です。現在0.14版であり、標準ライブラリのドキュメントはほぼゼロです。使い方を学ぶにはソースコードを直接読むのが一番です。
私はZigをGoとRustへの反応だと考えています。Goは詳細を隠し単純化、Rustは多くのルールで安全性を強制します。Zigは「自由」を与える言語であり、誰もあなたに何をすべきか指示できません。
GoやRustではヒープへのオブジェクト割り当てが関数からポインタを返すだけで済みますが、Zigでは各バイトを明示的に確保します。Cよりもさらに制御力があり、最適なアロケータ実装を選択できます。
Rustでは可変グローバル変数の作成が困難ですが、Zigでは簡単です。不定義動作は「不正行為」と呼ばれ、ランタイムで検出してクラッシュします。パフォーマンスコストを気にする場合は、ビルド時に四種類のリリースモードから選べ、チェックが無効になるものもあります。これにより、チェック付きビルドで十分テストし、最終的に未チェック版で実行できるという実用的設計です。
Zigと他言語との大きな違いはオブジェクト指向への取り扱いです。GoやRustはクラス継承を排除しますが、OOPのその他の慣習をサポートしています。一方Zigはメソッドはありますが、プライベートフィールドも動的ディスパッチもありません。これはデータ指向設計に重点を置いた意図的な排除です。
手作業でメモリ管理する言語を2025年に作るのは奇抜に思えるかもしれませんが、OOP機能の除外と密接に関連しています。GoやRustではオブジェクトグラフ内の小さなオブジェクトごとに
malloc()/free()が発生し、多数のライフタイムを管理します(RAII)。Zigでは大きなメモリチャンクを必要に応じて確保・解放し、データをまとめて扱う方針を推奨しています。
「RustがすでにあるならZigは不要」という混乱があります。Zigは単なる簡易化ではなく、さらにオブジェクト指向的思考をコードから排除することを目指しています。
Zigは風変わりな感覚を持ち、企業の階層構造(オブジェクト)を打破したい人に響く言語です。私は好きで、安定版が早くリリースされることを願っています。現在Zigチームは依存関係全体を書き直すことに注力しているため、Linuxカーネルを再実装する前にZig 1.0が出るかどうかは未定です。