- Rustは今年で10周年を迎え、今後は基盤(Foundational)ソフトウェア開発の中核言語としての地位を確立しつつある
- 基盤ソフトウェアとは、OSカーネル、クラウドプラットフォーム、組み込みデバイス、CLIツールなど、あらゆるものの土台となる層を指す
- RustはC/C++級の性能と信頼性を提供しつつ、メモリ安全性を保証する型システムによって参入障壁を下げた
- Rustの使命は単に基盤領域にとどまらず、Dioxus, Tauri, Leptosのようなプロジェクトを通じて上位アプリケーション開発にも波及効果をもたらしている
- 今後は言語間相互運用性、型システムの拡張、エコシステム強化などを中核的な投資領域として計画している
Rustのビジョン: 基盤ソフトウェア
- Rustの中核ビジョンは、基盤ソフトウェアをより簡単に書き、保守できるようにすることにある
- 基盤ソフトウェアには、あらゆるシステムの土台となるOSカーネル、クラウドインフラ、組み込みデバイス、CLIツールなどが含まれる
- すでにWindowsとLinuxカーネル、VSCodeの検索エンジンripgrep、Deno、Pythonのuvパッケージマネージャーなど、さまざまな場所で採用されている
- この種のソフトウェアでは、性能・信頼性・生産性のすべてが同時に重要となる
- 土台が崩れると上位レイヤー全体に影響が及ぶため、安定性は不可欠
- 性能低下は上位レイヤーの性能限界につながるため、オーバーヘッドは最小限である必要がある
基盤ソフトウェアの性能、信頼性、生産性
- 基盤ソフトウェアには他のすべてのソフトウェアと同様に多様な要求があるが、どの要素もいっそう重要になる
- 信頼性は最優先課題である。土台が崩れれば、その上にあるすべてが失敗する構造だからだ
- 性能オーバーヘッドは上位レイヤー性能の限界を左右するため、最小化しなければならない
- 従来、こうした要件を満たすには2つの選択肢があった
- C/C++: 大きな自由を与えるが、それに見合う完全性が求められる
- Java、Goなどの高水準言語: 性能維持のために特別なコーディング方式が必要で、抽象化や利便性の活用に制約を受ける
- Rustはゼロコスト抽象化とメモリ安全性を保証する型システムの組み合わせによって、従来のやり方を変えた
- 高水準のコードを安全に書きながら、低水準の性能とメモリ安全性を同時に実現するための道具となっている
参入障壁を下げることと開発者の力を引き出すこと
- Rustの発表では、型システムと静的検査を**「ほうれん草」**(良いものだが食べたくないもの)にたとえることがよくある
- しかし現実には、型システムは開発者にとって強力な武器である
- 初心者は型システムを学ぶことで、成功するソフトウェア構造を学べる
- 熟練者は自分の構造設計におけるミスをより早く発見できる
- Yehuda Katzの「集中している状態で作る抽象化が、疲れた未来の自分を助けてくれる」という発言も、これをよく要約している
非基盤ソフトウェアの領域
- Rustのミッションが基盤ソフトウェアに焦点を当てているからといって、それ以外の領域が無視されるわけではない
- Dioxus, Tauri, Leptosなどのプロジェクトは、Rustを活用してGUIやWebページのような高水準アプリケーション領域へも広げている
- Rustの主な強みは本質的に基盤ソフトウェアに集中しているが、こうした試みも軽視すべきではない
ストレッチ目標と成長
- 基盤ソフトウェアは低水準の詳細な制御を必要とするため、一般には**アクセシビリティと使い勝手(ergonomics)**は重要ではないと見なされがちである
- しかし、必要な詳細制御があるからこそ、むしろ使い勝手が重要になる
- 開発者が本当に重要な部分だけに集中できるよう支援すれば、生産性は大きく向上する
- Rustの高水準適用を推進するプロジェクトは、Rustプログラミングをさらに快適に改善する機会を提供している
- こうした改善点は基盤ソフトウェア開発にもそのまま反映される
- 核心は、制御権と信頼性を失わずに使い勝手を高めること
フルスタック支援の重要性
- Rustで高水準アプリケーション開発を快適にするもう1つの理由は、フルスタックを1つの技術で構築できることにある
- 当初はRustをデータプレーンサービスなど一部にだけ使おうとしていた開発者が、全領域へ拡大するケースが増えている
- Rustは生産性が高く、1つの言語でライブラリやコードを共有できるためである
- 本質的に単純なコードは、どの言語で書いても単純である
段階的な深化(Iterative Deepening)の体験
- 理想的には、Rust利用者の最初の体験はシンプルであり、プロジェクトが進むにつれて、より多くの制御を局所的に段階的拡張できるべきである
- これは単純に見えて、実際には非常に難しい課題である
- 多くのプロジェクトは、初心者の参入障壁が高すぎたり、高度な制御段階を学ぶのに多くの知識を要求したりして失敗する
- Rustが常に成功しているわけではないが、これを改善するために継続的に努力している
今後の計画
- 本稿はこのシリーズの第1回であり、この後4回にわたってRustが基盤ソフトウェアにより適したものになるために必要な投資領域を提示していく予定である
- 言語間相互運用性(smooth language interop) と 拡張性(extensibility)
- 型システムを通じた目的の明確化(clarity of purpose)
- エコシステム強化: より良いガイドライン、ツール、Rust Foundationの活用
- 最後の記事では、Rustオープンソース組織の運営について、貢献と保守ができるだけ参加しやすく楽しい活動になるための方法を扱う予定
15件のコメント
Rustは何だか良さそうに見えても、厄介なファンダム(?)のせいで敬遠してしまう唯一の言語のように思います。
CやC++にも標準的なパッケージマネージャーがあればよかったのに、と思います。Cargoを見るといつもそう感じます。
ほうれん草ってすごくおいしいのに……
最近は、Rustが使われていない場所はないですよね
一応大企業に勤めていますが、Rustを使う分野がありません。煽らないでください。
いちゃもんをつけないでください
うわ;;;;;;;;
煽らないでくださいね ブルブル
うわ;;
うわぁぁぁぁぁ;;;
何はともあれ、最近のRust信者のせいでうんざりしそうです。オフラインではマイナーな中でもかなりの少数派なのに、オンラインではほとんどISIS状態……。ああ、どこか一か所に集まって、自分たちだけでやっていてほしい……
Rust原理主義者にしては、実際に本人がちゃんと使っているのか疑問な場合も多いですよね。
それでも…Rustはお好きですよね?
ラスラムは嫌ってもいいですが、Rustは愛してください(泣)
FFmpegのときに痛い目に遭っても、すべてのコードをRustで書かなければならないとか何とか
Hacker Newsの意見
中核ソフトウェアを論じる際、Rustで最も惜しい点はABIだという指摘。RustでOSを作り豊富なサービスを提供するには、OSがアップグレードされてもアプリケーションがライブラリを再コンパイルせずに使える必要がある。WindowsはCOM、AppleはかつてObjCのdynamic dispatch(現在はSwift ABI)、AndroidはJVMとバイトコードでこの問題を解決している。Rustは実質的に
extern "C"しかサポートできないため、動的ライブラリの活用が制限される。VM層(JVM、.NET)なしでABIを提供するのは非常に難しく、いったん決めた実装詳細を絶対に変えられないため、優先順位が下がるのも理解できる。実際にこのモデルで成功したのはSwiftとCOMくらいだという。Rustに完全なABIが導入されれば、ほぼ完璧な言語に近づくはずだという意見。(依存関係をバイナリ形式で管理できれば、コンパイル時間も大きく減る)dlopen)する用途には、stabbyやabi_stableなどのツールがあり、かなりうまく動く。より汎用的な言語間相互運用のためには、crABI(crABI提案書)が将来の代替案になりうる。ただしこれはRustだけで解決できる問題ではなく、他言語やLinuxディストリビューションなど複数コミュニティの支持と協力が必要だという。RustはI/Oやメモリ割り当て方式を明示的に選ぶ言語なので、Swiftのようにすべてを共有ライブラリだけで解決する構造は合わないかもしれない点にも触れている。repr(wasm)/extern "wasm"のように簡単ではないが、wit-bindgen や wasm32-wasip2 ターゲットを活用すれば、それほど難しくなく使える。Wasm Components紹介動画extern "C"ABIだけでも必要なことは一通りできる。そしてextern ABIをより多くの型へ拡張する提案も見たことがあるという。Rustは本当に好きだが、いくつかのいら立たしい慢性的問題にももっと注目が集まってほしい
“Smooth, iterative deepening”という表現をかみしめつつ、Rustがcross-language互換性を重視しすぎると、かえって複雑さを増し安全性を損なうリスクがあるという見方。こういう場合は、むしろlibcのようにシステムの最下層を置き換える形のほうが有益だろうという。Goはcross-language呼び出しをほとんどしない。Googleは中核ライブラリを自前で開発して基盤を固めたが、Rustではさまざまなバージョンの基礎ライブラリが乱立し、多くが未完成だという指摘。
「割り当てを避ける、GCをトリガーさせない」という発想は、最新のGCやJITの考え方に合っていないという指摘。現代のGCはstop-the-world latencyがほとんどない場合も多く、GC全体のCPU使用量はresident setとheapサイズの比率が主要な変数になる。JITはAOTより最適化の機会が多く、より積極的に探索できる(投機的最適化のおかげ)。実際に重要なのは、起動/ウォームアップ遅延、メモリオーバーヘッド、悪化した最悪時性能ではなく、平均性能だという。さらに手動メモリ管理が必ずしもより効率的とは限らず、実際のRAM使用量が3倍になってもコスト差がゼロということすらありうる。このテーマをうまく扱った ISMM学会発表 も勧めている。
フラグ付きコメントと議論は論点をよく押さえていたという評価。「公式仕様を持つ言語標準を作ろう」「複数実装が必要だ」といった現実的に重要な問いだ。特に@infogulchは、言語が産業の基盤になるなら公式仕様が不可欠だという点を的確に指摘していた(参照コメント)。
人々はしばしばRustに仕様が必要かという問い自体に疑問を呈するが、そのこと自体がソフトウェアエンジニアリングに本物のエンジニアリングがあまりに少ないことの証左だという指摘。
Rustを「プログラマに見られたい人だけが使う言語」と評したコメントに対し、自分は実際にプログラミングを愛する人間で、Rustは新鮮な衝撃だったという反応。あれほど苦痛だったC++の時代には到底戻りたくない。そして言語標準(ferrocene仕様の寄贈)や実装数はそれほど重要ではないと考えている。PythonやJavaも中心となる単一実装に大きく依存しつつうまく回っている。C++は複数コンパイラ対応を追求した結果、かえってプラットフォームごとの複雑な問題ばかり増えた。cargoの「めちゃくちゃ」とは具体的に何なのかわからず、C++のほうがよほど不便だったという。