Thoughts on Go vs. Rust vs. Zig

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つの言語 ― GoRustZig ― に対する印象をまとめました。各言語の経験から、その言語が何を重視し、それにどれだけ忠実に実装されているかという総合的な結論へと統合しています。これは簡略化してしまうかもしれませんが、こうした偏見を固めること自体が目的です。


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が出るかどうかは未定です。

同じ日のほかのニュース

一覧に戻る →

2025/12/05 10:05

BMW PHEV: Safety fuse replacement is extremely expensive

## Japanese Translation: --- ## 要約 BMW の高電圧バッテリー安全ヒューズ(1件あたり約 €5 000)は、iBMUCP モジュール全体(約 €1 100+税)を交換する必要があります。iBMUCP は溶接で閉じられ、暗号的にロックされており、サービス前後に車両全体のフラッシュが必須です。ISTA で承認された手順を試みると、盗難防止ロックを作動させてモジュールを消去し、新しいバッテリーパック(約 €6 000+VAT)が必要になるリスクがあります。 BMW は公式 ISTA 診断へのアクセスをブロックし、オーストリアでのワークショップ認定要求を却下しているため、独立した修理はさらに困難です。対照的に、テスラのプロファイザー/ BMS リセットは €11–€50 だけです。 21F2A8 や 21F35B といったエラーコードは高電圧安全問題を示しています。OEM サービスは €4 000+税と見積もられ、iBMUCP の交換作業には通常 24–50 時間がかかり、ツール費用は €25 000 を超えます(ICOM、IMIB、AOS)。 著者のチームは iBMUCP 内にある Infineon TC375 MCU 上の JTAG/DAP 保護を突破する計画です。成功すれば回復が簡素化され、作業時間とツール費用が削減され、不必要なバッテリー交換が減り、自動車修理における CO₂ 排出量も低減します。 この作業を提供しているサービスセンターは、ザグレブ、ベルリン、スロベニア、およびセルビア(EV CLINIC)に所在しています。

2025/12/05 9:03

Trick users and bypass warnings – Modern SVG Clickjacking attacks

## Japanese Translation: ## Summary 本論文は、すべてのSVG `<fe*>` フィルタプリミティブをチェーン化することでチューリング完全なツールセットを構築できることを示し、高度なクリックジャッキングやクロスオリジンデータ外部流出攻撃を可能にします。 - 著者はまず、`feColorMatrix` と `feDisplacementMap` を用いて CSS/SVG で Apple の Liquid Glass 効果を再現し、クロスオリジン iframe 上でも動作することを証明しました。 - プリミティブ(切り取り・タイル化・算術合成・カラー行列変換・ガウシアンぼかし)を組み合わせて、外国オリジンから画像データを読み取るピクセル読取回路を構築しました。 - `feBlend` と `feComposite` を用いて NOT, AND, OR, XOR, NAND, NOR, XNOR の論理ゲートを実装し、SVG フィルタ内で任意のブール演算が可能になりました。 - これらのゲートを利用して、ダイアログ表示状態・読み込み状態・チェックボックス状態・赤文字検出に応じて画像を条件付きで表示するマルチステップクリックジャッキングシナリオ(「Securify」)を構築しました。 - この手法は Google Docs に適用され、攻撃者が「Generate Document」→ CAPTCHA 入力 → 提案選択 → ボタン押下 → 読み込み画面という一連の操作を SVG フィルタ内で自動化します。 - SVG フィルタ内(`feDisplacementMap` と Reed–Solomon エラー訂正表を使用)に QR コードジェネレータを構築し、生成されたコードは外部流出データをエンコードしており、ユーザーにスキャンさせて攻撃者のサーバへ送信されます。 クリックハイジャックや SVG フィルタタイミング攻撃に関する既存研究では、マルチステップロジックとクロスオリジンデータ読取を組み合わせたものはなく、本論文は新規かつ自動化された攻撃ベクターを提示しています。 調査結果は、攻撃者が他のウェブサービスに対して同様のシーケンスを自動化し、マルウェアやフィッシングキャンペーンに埋め込む可能性があることを示唆しています。ユーザーは意図しないクリックとデータ漏洩のリスクにさらされ、サードパーティ iframe を組み込む企業は侵害リスクが高まります。本研究は、ウェブエコシステム全体で SVG フィルタ使用時のオリジン境界保護を強化する必要性を訴えています。

2025/12/05 10:15

NeurIPS 2025 Best Paper Awards

## Japanese Translation: > **概要:** > 本会議の論文賞授与式では、プログラムチェアとデータベース&ベンチマークトラックチェアが指名した委員会により選ばれた優秀な7件の論文が表彰されました。最終承認は総合チェア、新世代チェア、およびアクセシビリティチェアから行われました。賞には、Datasets & Benchmarkトラックから1件を含む4件のベストペーパーと3件のレナーアップが含まれます。 > > *ベストペーパー*: > 1. **「Artificial Hivemind: The Open‑Ended Homogeneity of Language Models」** – Infinity‑Chat(26 Kクエリ、31 K人間アノテーション)とオープンエンドプロンプトの分類法を紹介し、モデル内部での反復とモデル間での均質性を明らかにします。 > 2. **「Gated Attention for Large Language Models」** – SDPA後にヘッド特異的シグモイドゲートを追加すると性能・安定性が向上し、密結合およびMoEトランスフォーマーの注意サンク問題を緩和することを示します。コードはGitHub/HuggingFaceで公開されています。 > 3. **「1000 Layer Networks for Self‑Supervised RL」** – 1024層という深さが目標条件付きタスクで性能を向上させ、他のベースラインを上回ることを実証します。 > 4. **「Why Diffusion Models Don’t Memorize」** – 2つの時間スケール(初期一般化と後期記憶)を特定し、暗黙的な動的正則化が過学習を防ぐことを示します。 > > *レナーアップ*: > - 「Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?」 – RLVRはサンプリング効率を改善するものの、推論能力を拡張しない;蒸留により新たなパターンが導入される可能性があります。 > - 「Optimal Mistake Bounds for Transductive Online Learning」 – Ω(√d) の下限と O(√d) の上限を証明し、以前の結果を指数関数的に改善し、転移学習と標準オンライン学習との間に二次的ギャップがあることを示します。 > - 「Superposition Yields Robust Neural Scaling」 – 表現の重ね合わせがニューラルスケーリング法則を駆動することを示し、強い重ね合わせは多様な周波数分布にわたってモデル次元に逆比例して損失を縮小します。 > > これらの賞は拡散理論、自律学習RL、LLMの注意メカニズム、LLMにおける推論、オンライン学習理論、ニューラルスケーリング法則、および言語モデル多様性のベンチマーク手法を網羅しています。これらは会議が実証的ブレイクスルーと理論的洞察の両方にコミットしていることを示しています。 > > この改訂版概要は、Key Points List のすべての主要ポイントを忠実に列挙し、裏付けのない推測を避け、読み手に優しい明確なオーバービューを提供します。