Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ハンズオン課題: プログラムを移植する

Rustの最も重要な構文と機能の大部分を取り上げてきました。 まだRustに慣れてはいないかもしれませんが、基本は理解できたはずです。

イディオムや癖も含めて新しい言語を学ぶ優れた方法の1つは、すでに慣れ親しんでいる言語で書かれた既存のプログラムを移植することです。 それがこの課題の目標です。

既存のツールに対する優れたRust製の代替がいくつか存在するとはいえ1、私たちは「Rewrite-It-In-Rust」(RIIR)というトレンドの支持者ではありません。 大規模なソフトウェアを書き直すことはリスクの高い提案であり、多くの文脈では、その見返りには疑問があります。

通常は、既存のコードと相互運用できるように、新しい機能、新しいサービス、または強化されたコンポーネントをRustで書くほうが賢明です。 第13章では、Rustを非Rustのコードベースに統合する方法を取り上げます。

この課題の動機は、対比を通じてRustをより深く理解することです。 他の言語のすべてのイディオムやパターンがそのまま容易に移せるわけではないため、そうした違いを直接体験することは有益です。

「失敗」しても構いません

移植を試みる途中でどこか行き詰まるかもしれません。 選んだプログラムによっては、そうなるでしょう。 それで問題ありません!

そうなった場合は、この課題を「個人的な到達点」として使ってください。どこまで進めたのか、どのようなエラーだったのかを記録しておきましょう。 Rustの経験をさらに積んだあとで、この課題に戻ってくることができます。 やる気が出たときにいつでも構いません。

好きなプログラムをRustに移植する

  • 自分が知っている言語で書かれた小さなプログラム(おそらく1,000行未満)を選び、それをRustでゼロから書き直してください。自分で書いたプログラムを選ぶことをお勧めします。特に、パフォーマンス上の制約にぶつかったことがあるものならなおよいでしょう。しかし、深い関心を持っているプログラムであれば、どんなものでもよい選択です。

    • 書き直しを始める前に、プログラムの依存関係を確認してください。Rustのcrates.ioに対応するものがないライブラリを1つ以上使用している場合は、別のプログラムを選ぶか、その依存関係も自分で書く必要があります。この課題のスコープを広げすぎないでください!

CからRustへの移植を半自動化する

  • すでに経験豊富なC開発者であれば、c2rust2ツールを使って既存のCプログラムの移植を試すことができます。これは非公式のオープンソースのベストエフォート型トランスパイラで、Cソースコードを取り込み、Rustソースコードを出力します。

    • ただし、出力されるRustはイディオムに沿っておらず、入力元のCと同じくらいunsafeです。Cを安全なRustへ変換することは、プログラムの意味論を推論する必要がある未解決の研究課題です3。そのため、依然として大規模なリファクタリングを行う必要があります。

    • CFFIとunsafeを取り上げる第13章のあとで、この課題に戻りたい読者もいるかもしれません。

    • Cを書いたことがないものの、非常に勇敢で、Cを学びたい、または学ぶ必要がある場合でも、この課題に取り組むことはできます!始めるにあたって、Effective C4を1冊手に取ることをお勧めします。



  1. Awesome Alternatives in Rust。Takayuki Maeda(2022年アクセス)。

  2. c2rust。Immunant(2022年アクセス)。

  3. Translating C to Safer Rust。Mehmet Emre、Ryan Schroeder、Kyle Dewey、Ben Hardekopf(2021年)。

  4. [個人的なお気に入り] Effective C: An Introduction to Professional C Programming。Robert Seacord(2020年)。