Noesworthy

ヒープとスタック

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)                 │
│──────────────────────────────────────────────│
│ 📦 スタック領域 ← 関数呼び出し・ローカル変数用   │
│ 📦 ヒープ領域  ← 動的に確保するデータ用           │
│ 📦 グローバル領域← 定数・静的変数など               │
│ 📦 コード領域  ← 実行中のプログラム本体           │
└──────────────────────────────────────────────┘

スタックは

ヒープは

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

うーんなるほど

言語ごとの速い遅いの理由ってこういうところにもあるんだねぃ

#tech