SICPや nand2tetrisで扱う分野をまとめる.
メモリ管理
📝ヒープメモリ、動的メモリ獲得.
- 手動で頑張る!: C/C++
- 📝ガベージコレクション: GC
- 📝所有権(rust): Rust
メモリ獲得
Memoery Allocator.
Explicit allocator
C の malloc や free で動的に取得・開放される.
Inplicit allocator
アプリケーションによって獲得されるが, 開放されない.
Java のガベージ・コレクション.
📝スタックメモリ
スタックメモリ, stack領域.
ソフトウェアが起動時に静的に確保するメモリ領域. 対義語は📝ヒープメモリ.
📝ヒープメモリ
ヒープ領域, ソフトウェアが実行時に動的に割り当てることができるメモリ領域.
- 📝ヒープ構造と区別するために, heap memoryと呼ぶことが多い.
- 📝ガベージコレクションはヒープ領域の解放を自動化.
💣セグメンテーション違反
Segmentation Fault.
ソフトウェアがアクセス許可のないメモリ領域にアクセスしようとしたり、許可されていない方法でメモリにアクセスしようとするときに発生するエラー.
- OSが占有しているメモリ領域に書き込もうとすること.
- リードオンリーのメモリ領域に書き込もうとすること.
- 配列の範囲外にアクセスすること.
- すでに解放されたメモリ領域にアクセスすること.
即時Painic
- NULLポインタアクセス: 🔖ヌルポ
💣ヌルポ
- 📝JavaのNullPointerExceptionのネットスラング.
出現するとウザいので, クソみたいな人間をヌルポやろうという.
メモリ二重解放
同じメモリを二回解放
ダングリングポインタ
解放済みメモリへのアクセス.
💣Buffer Overflow
メモリ破壊. プログラムが意図しない方法でメモリの内容を変更してしまうこと.
バッファオーバーフロー. バッファオーバーランともいう. 設計者が意図していないメモリ領域の破壊が起こされるバグ.
Heap Overflow
💣Stack Overflow
スタックオーバーフロー (stack overflow) は, プログラム中での関数呼び出しが多すぎる時に発生する.
C 言語は末尾再帰未サポート
再帰による無限ループで発生する. ただし, 末尾最適化を実装した言語では末尾再帰をループへ展開することができ, 末尾再帰ではスタックオーバーフローは起こらない.
C 言語のような副作用と構造化を基本とする手続き型言語では, 言語処理系による自動的な末尾呼び出しへの変換やその最適化 (末尾最適化) は難しい.
🌊メモリリーク
メモリ解放漏れ. 確保したメモリを解放し忘れ.
これはじわじわとメモリが枯渇するので、システム緊急停止というわけではない.
📝ガベージコレクション
ガベージコレクション(garbage collection, GC)とは, プログラムが動的にメモリを獲得した領域のうち, 不要になった領域を自動で解放する機能.
- ジョン・マッカーシーが📝Lispにて初めての実装.
- 📝JVMガベージコレクションが有名.
- ガベージコレクション - Wikipedia