ヒープとスタック
MoonBitっていう新言語のことを調べてたら出てきたよぃ
Value type and bits pattern in MoonBit, 30% faster than Rust!
MoonBitはRustより早いって謳ってるコンパイル型言語
Rustより早い理由の一つが、普通「ヒープ」を使う場面で「スタック」を使えるから、ということらしい
↓ #valtypeでスタックになる
#valtype
pub(all) struct Complex {
real : Double
imag : Double
}
ヒープ?スタック?なんじゃそれ?と思って調べてみたら
ヒープもスタックも、プログラム実行中に使われるメモリ上の領域らしぃ
┌──────────────────────────────────────────────┐
│ 🧠 メインメモリ(RAM) │
│──────────────────────────────────────────────│
│ 📦 スタック領域 ← 関数呼び出し・ローカル変数用 │
│ 📦 ヒープ領域 ← 動的に確保するデータ用 │
│ 📦 グローバル領域← 定数・静的変数など │
│ 📦 コード領域 ← 実行中のプログラム本体 │
└──────────────────────────────────────────────┘
スタックは
- 速い
- スコープ終わると自動で削除される
- 関数内の変数など「その場限りで捨てる、軽いデータ用」
ヒープは
- ちょっと遅い
- 自動で削除されないからGC(ガベージコレクター)が掃除してる
- 「大きい・いつ消えるかわからない・柔軟に扱いたい」データ用
PHPの場合は、変数はスタックなのかな?と思いきや
PHPはインタプリタ言語(=Zend EngineというC製エンジン上で動く)だから、実際の変数はZend Engine上でヒープとして保存されているらしい
PHPレイヤー Zend Engine (Cレイヤー)
-----------------------------------------------
$x = 10; → zval構造体(10) がヒープに作られる
$y = "abc" → zval構造体("abc") がヒープに作られる
まさかの全ヒープ
各言語のメモリ管理ざっくり比較表
| 言語 | 管理方式 | GC(Garbage Collection) | ヒープ利用の主流度 | スタック利用の特徴 | 実行速度(体感) | メモリ安全性 | 一言でいうと |
|---|---|---|---|---|---|---|---|
| PHP 🐘 | 参照カウント + GC | ✅ あり(循環参照検知あり) | 高い(zval構造体すべてヒープ) | 関数スコープは管理テーブルのみ | 🐢(遅い) | 🟡 やや安全 | Web向け・全部お任せ型 |
| Python 🐍 | 参照カウント + 世代別GC | ✅ あり(複雑なGC) | 高い(ほぼすべてヒープ) | スタックは制御フレーム用のみ | 🐢(遅め) | 🟡 安全だが重い | 柔軟・人間に優しいが遅い |
| JavaScript 💫 | 自動GC(V8など) | ✅ あり(マーク&スイープ) | 高い(全オブジェクトはヒープ) | 関数スコープだけスタック | ⚡(中速〜高速) | 🟡 安全 | Web特化・GC強め |
| Go 🧃 | 自動GC(並行型) | ✅ 高性能GC(stop-the-worldほぼなし) | 中程度(構造体は一部スタック) | スタックは拡張可能&軽量 | ⚡⚡(かなり速い) | 🟢 強い安全性 | サーバー向けに超安定 |
| Rust 🦀 | 所有権 + 借用チェック | ❌ GCなし | 低(必要なときだけ) | 多用(値型重視) | 🚀(めっちゃ速い) | 🟢 最強クラス | 手動不要の手動管理✨ |
| MoonBit 🌙 | 値型 + 軽量GC(#valtype対応) | ✅ GCあり(最小限) | 低〜中(Value Typeはスタック) | 多用(#valtypeで最適化) | 🚀(Rustより速いケースも) | 🟢 安全&柔軟 | Rust+Goの中間的存在 |
亀の絵文字やめろw
うーんなるほど
言語ごとの速い遅いの理由ってこういうところにもあるんだねぃ