課題1: Rustの設計思想の理解

マンダトリー要件

問題1:概念の理解(各2点、計10点)

以下の文が正しければ○、誤りであれば×で答え、×の場合は正しい説明を記述しなさい。

  • Rustはガベージコレクションを使用してメモリ管理を行う。
  • Rustの所有権システムにより、コンパイル時にメモリ安全性が保証される。
  • Rustは常にC言語よりも高速である。
  • Rustの学習曲線は他の言語より急である。
  • Rustはnull参照が存在しない。
  • 問題2:歴史の理解(15点)

    以下の質問に答えなさい。

  • Rustが誕生した背景(5点)
- Mozillaが直面していた問題は何か? - Firefoxのセキュリティバグの約何%がメモリ安全性の問題だったか?

  • Rustのタイムライン(5点)
- Rustが個人プロジェクトとして開始された年は? - Rust 1.0がリリースされた年は? - Rust 1.0以降、何が保証されるようになったか?

  • Rust作者について(5点)
- Rustの作者は誰か? - 作者がRustを作ろうと思ったきっかけは何か?

問題3:設計思想の説明(25点)

  • ゼロコスト抽象化(10点)
- ゼロコスト抽象化とは何か、簡潔に説明しなさい。 - Bjarne Stroustrupの原則を引用して説明すること。

  • Rustの3つの柱(15点)
- Rustの設計における3つの柱を挙げなさい。 - それぞれについて、従来の言語の問題点とRustの解決策を説明しなさい。

問題4:言語比較(20点)

以下の表を埋めなさい(各1点)。

特性 C C++ Rust Go Java
メモリ安全性 ? ? ? ? ?
GC不要 ? ? ? ? ?
ゼロコスト抽象化 ? ? ? ? ?
並行安全性(型) ? ? ? ? ?

それぞれの言語について、以下の質問に答えなさい(各2点):

  • Rustが最適なユースケースを3つ挙げなさい。
  • C/C++が依然として優位なユースケースを2つ挙げなさい。

問題5:コード理解(30点)

以下のC++とRustのコードを比較し、質問に答えなさい。

C++のコード

std::vector<int> vec = {1, 2, 3};
int* ptr = &vec[0];
vec.push_back(4);
std::cout << *ptr;

Rustのコード

let mut vec = vec![1, 2, 3];
let ptr = &vec[0];
vec.push(4);
println!("{}", ptr);

  • C++の問題点(10点)
- このC++コードは何が問題か? - 実行時にどのような問題が発生する可能性があるか? - なぜこの問題はコンパイル時に検出できないのか?

  • Rustの解決(10点)
- Rustはこの問題をどう解決しているか? - コンパイラはどのようなエラーメッセージを出すか? - 所有権システムがどう機能しているか説明しなさい。

  • 修正方法(10点)
- Rustで安全に実装する方法を2通り示しなさい。 - それぞれのトレードオフを説明しなさい。

---

ボーナス課題

> ボーナス: 以下はオプションです。マンダトリー要件を完了してから挑戦してください。

ボーナス1:産業界での採用調査(10点)

以下の企業のRust採用事例を調査し、レポートを作成しなさい:

  • Mozilla
- Servo、Styloプロジェクトについて調査 - 性能改善の具体的な数値を示すこと

  • AWS
- Firecracker、Bottlerocketについて調査 - これらのプロジェクトでRustが選ばれた理由を説明

  • Microsoft
- Windowsでのrust採用について調査 - セキュリティ面でのメリットを説明

提出形式

  • Markdown形式のレポート(1000文字以上)
  • 参照したソースを明記すること
  • ボーナス2:性能ベンチマーク実験(10点)

    以下の実験を行い、レポートを作成しなさい:

  • 実装
同じアルゴリズムを3つの言語で実装: - C言語 - Rust - Python(またはJava/Go)

推奨アルゴリズム: - フィボナッチ数列(再帰版と反復版) - 配列のソート - 文字列の検索

  • 測定
各実装について以下を測定: - 実行時間 - メモリ使用量 - バイナリサイズ

  • 分析
- 結果を比較し、考察を述べなさい - Rustの「ゼロコスト抽象化」が実際に機能しているか検証

提出物

  • ソースコード(3言語分)
  • ベンチマークスクリプト
  • 結果レポート(グラフ付き)
  • ボーナス3:Rust vs Go vs Zig 比較レポート(10点)

    Rust、Go、Zigの3言語について、以下の観点で比較レポートを作成しなさい:

  • メモリ管理戦略
- それぞれの言語のアプローチ - トレードオフ

  • 並行処理モデル
- goroutines vs async/await vs async(Zig) - 安全性の保証方法

  • エラーハンドリング
- それぞれの哲学 - 実用性の比較

  • 学習曲線と生産性
- 初学者にとっての難易度 - プロダクション投入までの時間

  • エコシステム
- パッケージマネージャー - コミュニティの成熟度

提出形式

  • 2000文字以上のMarkdownレポート
  • 実際にコードを書いて比較すること
  • 個人的な意見だけでなく、客観的なデータも含めること
  • ---

    評価基準

    マンダトリー部分(80点)

    項目 配点 評価ポイント
    問題1:概念理解 10点 正確な○×判定と適切な訂正
    問題2:歴史の理解 15点 重要な年代と出来事の把握
    問題3:設計思想 25点 3つの柱の深い理解
    問題4:言語比較 20点 各言語の特性の正確な把握
    問題5:コード理解 30点 実践的な問題解決能力

    ボーナス部分(20点)

    項目 配点 評価ポイント
    ボーナス1:産業界調査 10点 調査の深さと正確性
    ボーナス2:性能実験 10点 実験の厳密性と考察の質
    ボーナス3:3言語比較 10点 客観性と実践的な比較

    : ボーナスは最大20点まで加算されます。

    ---

    提出方法

    ファイル構成

    rust-foundations-01/
    ├── answers.md              # マンダトリー問題の回答
    ├── bonus1-report.md        # ボーナス1のレポート
    ├── bonus2/
    │   ├── fibonacci.c
    │   ├── fibonacci.rs
    │   ├── fibonacci.py
    │   ├── benchmark.sh
    │   └── results.md
    └── bonus3-comparison.md    # ボーナス3の比較レポート
    

    提出期限

  • マンダトリー:第1章学習後、1週間以内
  • ボーナス:第3章修了時まで(余裕を持って取り組む)

---

ヒント

問題3のヒント

ゼロコスト抽象化を理解するには:

  • 高水準な記述が低水準にコンパイルされる仕組みを考える
  • イテレータの例を理解する
  • rustc --emit=asm でアセンブリを確認してみる

問題5のヒント

Rustで安全に実装する2つの方法:

  • スコープを分ける(借用を先に終わらせる)
  • インデックスを保存する代わりに値をクローンする

ボーナス2のヒント

ベンチマークツール:

  • C: time コマンド、valgrind
  • Rust: cargo benchcriterion
  • Python: timeit モジュール
  • ---

    学習の確認

    この課題を通じて、以下を理解できたか確認してください:

  • [ ] Rustが誕生した歴史的背景
  • [ ] Rustの3つの柱(メモリ安全性、ゼロコスト抽象化、並行安全性)
  • [ ] 所有権システムの基本概念
  • [ ] 他の言語との比較とトレードオフ
  • [ ] Rustが最適なユースケース
  • [ ] 学習曲線とその価値

次の章では、実際にRustの開発環境を構築し、Cargoツールチェーンを学びます。