🔮

RustBookを読んでRust言語のセンターピンは波括弧を抜けたらメモリ開放する所だと思った件

2024/08/06に公開

先にRustBook自体の感想(2024-08-05時点の感想)

  • 英語版が最新っぽいが、それをGoogle翻訳すると日本語がおかしく混乱する場面があった
  • 日本語版もあるがそちらはバージョンが古かった。だが、大きく英語版と違っているわけでもないし、変な翻訳で混乱しながら読むよりは良いと思った
  • Rustの説明としては冗長な記述が多く、全部読んだり実行したりするのはかなり時間がかかる
    • 時間は少なくとも24時間くらいは掛かる気がする(理解度次第ではもっと)
  • 冗長なだけで必要な情報は網羅してくれていると思った

最新で良質な日本語で学びたい場合、「プログラミングRust 第2版」などのRust関連の本を読んだ方が良いかもしれない。

「プログラミングRust 第2版」は、t-wadaさんも読み込んだらしい。
https://speakerdeck.com/twada/programming-rust-techramen24conf-lt

playground

コードは下記のplaygroundで試せる
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021

波括弧を抜けたらメモリ解放する

fn main() {
    // 不要な波括弧だが、説明のため使用
    { 
        let s1 = String::from("aaa");
        println!("中身={}", s1);
    }
    // ここの時点で波括弧を抜けたので、s1のメモリが解放される
}

仮に、メモリ解放後に変数s1にアクセスしてしまうとダングリングポインターとなる。

それを防ぐために、所有権などのルールが作られている。

関数も波括弧使っているから解放する

fn main() {
    let s1 = String::from("aaa"); // スタックではなくヒープに確保する
    view(s1);

    // s1が解放されているので出力できない(コンパイルエラーとなる)
    println!("これは出力できない={}", s1);
}

fn view(s1: String) {
    println!("s1={}", s1);
} // ここでs1が解放される

結構衝撃的だが、関数に渡した値まで解放するという。

この辺がRust初心者キラーな気もするが、波括弧で解放するルールを知っているなら違和感はないはず?

無理やり直すなら関数の返却値にs1を設定すれば開放されない。
(所有権をmoveしていく方法)

だが、もっと一般的な方法がある。

関数で開放されないようにするには参照渡しする

fn main() {
    let s1 = String::from("aaa");
    view(&s1); // 参照を渡しているため、参照が開放されて本体は無事となる
    println!("これは出力できる={}", s1); // s1が解放されていないので出力できる
}

fn view(s1: &String) {
    println!("s1={}", s1);
}

プリミティブ型だとコピーが渡されるから大元は開放されない

fn main() {
    let num1 = 1;
    view(num1); // ここではコピーが渡されるので解放されるのはコピーとなる
    println!("これも出力できる={}", num1); // num1が解放されていないので出力される
}

fn view(num: u32) {
    println!("num={}", num);
}

Rustは多機能

最近の言語の機能をたくさん持ってきていると思う。

機能を制限したGo言語とは対照的だなと思う。

なので、Rustに慣れてくるとスタイリッシュに書ける方法が見つかると思われる。

がしかし、機能を沢山使おうとすると、新参者が辛いと思われるので、ある程度書き方を絞って書いていった方がチームで作業する分には良いと思う。

Rust良いところ

  • Googleの調査では約8割のエンジニアがコードに自信がある状態となった
  • 最速クラスの速度が出る
  • 実行バイナリになるのでRustが入っていない環境でも動く
  • OSの開発もできる
  • ガベージコレクションが無いので実行時間の揺らぎが無くなる
  • 低水準言語を学んだり書くことによりエンジニアの技術力向上が見込まれる
  • 実行速度が遅い言語から置き換えればサーバのコスト削減が期待できる

もし業務で導入するなら

  • とりあえずエース級エンジニアに勉強と基盤の作成をお願いする
    • 学習コストを下げたいので、Rustの機能をある程度絞った書き方で統一して基盤を作成する
  • 最低限の説明ドキュメントを用意してメンバーに読んでもらう
  • 説明ドキュメントをベースにした課題を用意してベテランとペアプロで課題をやる
  • 機能開発も最初はペアプロで実施する
  • 並行してRustBookか、Rustの技術書を読んでもらう

という手順を踏むと良いのでは?と思う。

最後に

低水準言語と言う割には多機能。

手動メモリ管理でもなく、ガベージコレクションでもない。

上記を実現するためのルールも多々あるが、他の言語をやったことがある人なら、学習コストが異常に高いとは思えない。

企業の採用があまり進んでいないが、セキュリティも問題ないし、エンジニアのスキルアップにも良いと思われる。

また、経験者が採用できるか?気になる方もいると思う。

私見では言語の経験年数よりも言語を深く理解して実装しているかどうか?のほうが重要だったので、ちゃんとしたエンジニアならRust未経験でも問題ないと思う。

これから採用企業が増えるといいなぁと思った。

Discussion