Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust vs. JavaScript でメモリ管理を比較してみた
Search
Yoshiyuki Nakano
January 31, 2025
Programming
0
78
Rust vs. JavaScript でメモリ管理を比較してみた
1/31(金) StepByCode vol.4 「StepByCode 新年LT会!」
https://step-by-code.connpass.com/event/339647/
Yoshiyuki Nakano
January 31, 2025
Tweet
Share
More Decks by Yoshiyuki Nakano
See All by Yoshiyuki Nakano
複雑なStep FunctionsをAWS CDKでコード管理するときに気にしたところ
drumnistnakano
3
830
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
420
Cursorでアプリケーションの追加開発や保守をどこまでできるか試したら得るものが多かった話
drumnistnakano
0
1.1k
フロントエンド技術の波を乗り越える!Vue2からReactへの移行とアーキテクチャ設計による堅牢化
drumnistnakano
0
1.3k
classmethod-slide-sample
drumnistnakano
0
2.4k
AWS テクニカルサポートから学ぶトラブルシューティングの極意 #devio2022
drumnistnakano
2
3.2k
Other Decks in Programming
See All in Programming
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
280
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
410
あのころの iPod を どうにか再生させたい
orumin
2
2.5k
書き捨てではなく継続開発可能なコードをAIコーディングエージェントで書くために意識していること
shuyakinjo
1
290
20250808_AIAgent勉強会_ClaudeCodeデータ分析の実運用〜競馬を題材に回収率100%の先を目指すメソッドとは〜
kkakeru
0
190
TanStack DB ~状態管理の新しい考え方~
bmthd
2
220
モバイルアプリからWebへの横展開を加速した話_Claude_Code_実践術.pdf
kazuyasakamoto
0
190
Google I/O recap web編 大分Web祭り2025
kponda
0
2.9k
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
230
バイブコーディングの正体——AIエージェントはソフトウェア開発を変えるか?
stakaya
5
990
AWS Serverless Application Model入門_20250708
smatsuzaki
0
110
Portapad紹介プレゼンテーション
gotoumakakeru
1
130
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Documentation Writing (for coders)
carmenintech
73
5k
RailsConf 2023
tenderlove
30
1.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
We Have a Design System, Now What?
morganepeng
53
7.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Music & Morning Musume
bryan
46
6.7k
Practical Orchestrator
shlominoach
190
11k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.6k
Building Adaptive Systems
keathley
43
2.7k
Transcript
Rust vs. JavaScript で メモリ管理を比較してみた 2025/1/31 StepByCode vol.4 「StepByCode 新年LT
会!」 中野ヨシユキ
自己紹介 名前:中野ヨシユキ (@engin_yo) 職種:ソフトウェアエンジニア 仕事:LINE ミニアプリ開発 会社:クラスメソッド株式会社 福岡オフィス 興味:ソフトウェアアーキテクチャ/TypeScript/AWS CDK/DevOps
趣味:ランニング、自作キーボード
2025 年の抱負
Rust できる人 になりたい
手始めに
メモリ管理を 理解したい
アジェンダ 1. そもそもメモリとは 2. JavaScript のメモリ管理 3. 束縛と代入の比較 4. Rust
のメモリ管理 5. Rust 所有権のメリット
そもそもメモリとは プログラムが実行時に使用する一時 的な記憶領域 変数や値を保持する場所 スタックとヒープの2 種類がある メモリ スタック 固定サイズのデータ ヒープ
可変サイズのデータ
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; // エラー:再代入は不可
代入の変数と値の割当 JavaScript Memory 変数 値のアドレス 別の変数 値のアドレスを共有 複数の変数が同じ値を参照可能 変更が全ての参照に影響
束縛の変数と値の割当 Rust Memory 変数 値 別の変数 値のコピー/ 移動 値は一つの変数にのみ紐付く 同時に複数の変数から変更不可
束縛という概念を利用してRust はメモリ管理を行う
JS とRust のメモリ管理の比較 項目 JavaScript Rust メモリ解放 自動(GC ) 自動(コンパイル時)
値の共有 参照で共有 所有権移動 並行処理 データ競合の可能性 コンパイル時に防止 パフォーマンス GC による一時停止 予測可能な実行時間
所有権とは 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 }
所有権の移動 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);
所有権の借用 借用とは 所有権を移動せずに値を参照する仕 組み & で不変の参照(読み取りのみ) &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);
所有権はなにがうれしいの? 1. メモリ安全性の保証 データ競合の防止 無効な参照の防止 2. 予測可能なパフォーマンス GC による停止がない リソースの即時解放
3. 並行処理の安全性 コンパイル時のチェック データ競合の防止
さいごに
2025 年の目標 Rust を理解してなにかつくる! サーバーサイドRust 、Webassembly やりたい
ご清聴ありがとうございました