Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust vs. JavaScript でメモリ管理を比較してみた

Rust vs. JavaScript でメモリ管理を比較してみた

1/31(金) StepByCode vol.4 「StepByCode 新年LT会!」
https://step-by-code.connpass.com/event/339647/

Yoshiyuki Nakano

January 31, 2025
Tweet

More Decks by Yoshiyuki Nakano

Other Decks in Programming

Transcript

  1. JavaScript のメモリ管理 ガベージコレクション(GC )による 自動管理 オブジェクトは参照として扱われる 同じメモリ領域を複数の変数で共有 オブジェクトへの参照が再代入でき なくなるだけでプロパティの書き換 えは可能

    1 // 同じメモリ領域を参照 2 let obj1 = { data: "hello" }; 3 let obj2 = obj1; // 同じオブジェクトを参照 4 5 // obj2 経由で変更すると、obj1 も変更される 6 obj2.data = "world"; 7 console.log(obj1.data); // "world" 8 console.log(obj2.data); // "world" 9 10 // const でも参照先の値は変更可能 11 const obj3 = { data: "test" }; 12 obj3.data = "changed"; // OK 13 // obj3 = null; // エラー:再代入は不可
  2. JS とRust のメモリ管理の比較 項目 JavaScript Rust メモリ解放 自動(GC ) 自動(コンパイル時)

    値の共有 参照で共有 所有権移動 並行処理 データ競合の可能性 コンパイル時に防止 パフォーマンス GC による一時停止 予測可能な実行時間
  3. 所有権とは Rust のメモリ管理を実現 各値にはある時点でただ一つの所有者が存在 スコープを抜けると自動的にメモリ解放 1 fn main() { 2

    { 3 let s = String::from("hello"); // メモリ確保 4 println!("s = {}", s); 5 // ここでs のスコープが終わり、メモリが自動解放される 6 } 7 // println!("s = {}", s); // コンパイルエラー:s は解放済み 8 9 let s1 = String::from("world"); 10 let s2 = s1; // s1 の所有権がs2 に移動 11 println!("s2 = {}", s2); // OK 12 // println!("s1 = {}", s1); // コンパイルエラー:s1 は無効 13 }
  4. 所有権の移動 Memory 移動前 v1 データ [1,2,3] Memory 移動後 v1 (無効)

    v2 データ [1,2,3] 所有権の移動とは 値のメモリ所有権が別の変数に移る 元の変数は無効になる(使用不可) 同時に2 つの変数が同じメモリを操 作できない コンパイル時にメモリの安全性を保 証 1 // ヒープメモリに[1, 2, 3] を確保 2 let v1 = vec![1, 2, 3]; 3 4 // v1 の所有権がv2 に移動 5 // - メモリの所有者がv1 からv2 に変更 6 // - v1 は無効になる 7 let v2 = v1; 8 9 // ここでv1 を使おうとするとコンパイルエラー 10 // println!("{:?}", v1) 11 12 // v2 は有効なので使用可能 13 println!("{:?}", v2);
  5. 所有権の借用 借用とは 所有権を移動せずに値を参照する仕 組み & で不変の参照(読み取りのみ) &mut による可変参照 借用中は所有者が値を手放さない 関数に値を渡す際によく使用する

    1 // &Vec<i32> は「Vec<i32> の参照」を表す 2 // 所有権は移動せず、一時的に借用する 3 fn print_vec(v: &Vec<i32>) { 4 println!("{:?}", v); 5 // 関数を抜けると借用が終了 6 } 7 8 let v = vec![1, 2, 3]; 9 10 // & を付けて参照を渡す(借用) 11 print_vec(&v); 12 // v の所有権は移動していないので使える 13 println!("{:?}", v);