5月31日、Brown University Cognitive Engineering Labが「C++ to Rust Phrasebook」と題したドキュメントを公開した。
この記事では、C++プログラマがRustで同等の処理を書く際に役立つ翻訳パターン集について詳しく紹介されている。以下に、その内容を紹介する。
概要――C++コードをそのままRust思考へ
本書は、C++でおなじみのイディオムや設計パターンを、Rust流にどのように書き換えるかを体系的に示したリファレンスである。各章は具体的なコード例と、それに伴う設計上のトレードオフについての解説で構成される。前から順に読んでもよいが、「C++ならこう書くがRustでは?」と行き詰まった場面で索引的に参照する使い方も想定されている。
本書は Brown University の Cognitive Engineering Lab 所属の C++ と Rust の両方に精通した開発者によって手作業で執筆された。AI生成テキストは一切含まず、精度と適度な詳細さを両立した内容を目指している。
Rustを学ぶには、本書以外にも多くの有用なドキュメントがある。それらとの違いや使い分けは、以下のように想定されている。
参考書 | フォーカス | 本書との違い |
---|---|---|
The Rust Programming Language | Rustの公式入門 | C++のバックボーンを持たない読者向け。概念解説が中心。 |
The Embedded Rust Book | Rustによる組み込みプログラミング | 本書は、C/C++向けプログラマ向けの補完文書という位置づけ |
Rustonomicon | アンセーフなRust内部機構 | 言語の裏側に踏み込む深掘り書。 |
Learn Rust With Entirely Too Many Linked Lists | データ構造の実装で学ぶ | 具体題材のハンズオン。 |
本書 | C++からの置き換え | 「C++で知っている表現」をRustでどう書くかを解説 |
どんな内容か
本書の内容は、言語や利用シーンごとにセクションに分けられ、それぞれC++とRustによるコード例を併記してわかりやすく解説されている。
例えばコンストラクタについて解説されたページでは以下のようなサンプルコードとともに、ポイントを絞ってわかりやすく理解できるように工夫されている。
主なポイント
- C++: オブジェクトのストレージ確保後にコンストラクタが呼ばれ、初期化を担当。
- Rust: 「すべてのフィールドを一度に初期化する」のが基本で、
new
やwith_xxx
といった静的メソッドが“コンストラクタ”に相当する。 - レコード更新構文 (
..
) により、一部だけ変更した新インスタンスを簡潔に生成できる。 - 失敗する初期化: C++は例外、Rustは
Result
/Option
で表現する。
コード例(抜粋)
C++
class ThreadPool {
unsigned int num_threads;
public:
ThreadPool() : num_threads(std::thread::hardware_concurrency()) {}
ThreadPool(unsigned int nt) : num_threads(nt) {}
};
Rust
struct ThreadPool { num_threads: usize }
impl ThreadPool {
fn new() -> Self {
Self { num_threads: std::thread::available_parallelism().unwrap().get() }
}
fn with_threads(nt: usize) -> Self {
Self { num_threads: nt }
}
}
章の後半では**例外 vs
Result
**の対比や、Pin
/MaybeUninit
が必要となるセルフポインタ保持パターンの移植注意点まで踏み込んでいる。
このように、本書は具体的なC++コードを出発点として「Rustではこう書く」と示すため、ページを一目見ればすぐに応用方法が想像できる構成だ。Rustに興味のあるC/C++プログラマの方には、ぜひ一読をおすすめする。
詳細はC++ to Rust Phrasebookを参照していただきたい。