လွယ်လွယ်ပြောရရင် program တစ်ခု run နေတဲ့အခါ computer ရဲ့ memory (RAM) ကို အခန်းနှစ်ခန်း ခွဲသုံးထားတာ — တစ်ခုက Stack၊ နောက်တစ်ခုက Heap။ Data တိုင်းကို ဒီနှစ်ခန်းထဲက တစ်ခုခုထဲမှာ ထည့်သိမ်းထားတယ်၊ ဘယ်အခန်းထဲ ထည့်မလဲဆိုတာက data အမျိုးအစားနဲ့ အသုံးပြုပုံ ပေါ်မူတည်တယ်။

ကျွန်တော် programming စသင်တုန်းက ဒီနှစ်ခုကို ရောထွေးခဲ့ဖူးတယ်။ ဒီနေ့ ဥပမာတစ်ခုနဲ့ ရှင်းရှင်းလင်းလင်း မှတ်မိအောင် လုပ်ပေးမယ်။

ဥပမာ — စားသောက်ဆိုင်က ပန်းကန်စင်နဲ့ ကုန်လှောင်ရုံ

Stack က ပန်းကန်ဆေးတဲ့ စင်လိုပဲ။ စားသောက်ဆိုင်မှာ ပန်းကန်ဆေးပြီးရင် တစ်ခုပေါ် တစ်ခု ဆင့်ထည့်တယ် — အပေါ်ဆုံးက ပန်းကန်ကိုပဲ အရင်ယူသုံးလို့ ရတယ်။ အောက်ဆုံးက ပန်းကန် လိုချင်ရင် အပေါ်က အားလုံး အရင်ဖယ်ရမယ်။ ဒါကို LIFO (Last In, First Out) လို့ ခေါ်တယ်။

Program မှာ function တစ်ခုခေါ်တိုင်း သူ့ရဲ့ variable တွေကို Stack ပေါ် “တင်ထား” တယ်။ function ပြီးသွားရင် အလိုလို “ဖယ်ရှား” ခံရတယ် — သန့်ရှင်းရေး ဝန်ထမ်း လာစရာမလိုဘူး၊ သူ့အလိုလို ရှင်းသွားတာ။ မြန်တယ်၊ သပ်ရပ်တယ်၊ ဒါပေမယ့် နေရာအကန့်အသတ်ရှိတယ် (ပုံမှန်အားဖြင့် 1–8 MB လောက်ပဲ)။


def calculate():
    x = 10      # x ကို Stack ပေါ်တင်ထားတယ်
    y = 20      # y ကို Stack ပေါ်တင်ထားတယ်
    return x + y
# function ပြီးတာနဲ့ x, y တို့ အလိုလို ပျောက်သွားတယ်

Heap က ကုန်လှောင်ရုံကြီးလိုပဲ။ ပစ္စည်းတွေ ဘယ်နေရာမှာ ထားထား ရတယ် — စင်ပေါ်မှာ ဆင့်စရာ မလိုဘူး။ နေရာကျယ်တယ်၊ ဒါပေမယ့် ပစ္စည်းတစ်ခုကို ဖယ်ချင်ရင် ကိုယ်တိုင် (ဒါမှမဟုတ် garbage collector က) သွားဖယ်ရတယ်။


my_list = [1, 2, 3, 4, 5]   # ဒီ list ကြီးက Heap ထဲမှာ ရှိနေတယ်
# my_list ဆိုတဲ့ နာမည်လေးပဲ Stack ပေါ်မှာရှိပြီး
# တကယ့် data က Heap ထဲမှာ — နာမည်က လိပ်စာကတ်လိုပဲ

ဘာလို့ နှစ်ခု ခွဲထားတာလဲ?

Stack က မြန်တယ် — function ခေါ်တာ၊ variable သေးသေးလေးတွေ သိမ်းတာ ဒီမှာ လုပ်တယ်။
Heap က ကျယ်တယ် — ပုံကြီး၊ စာရင်းရှည်၊ object ကြီးတွေ ဒီမှာ ထားတယ်။ Size ကို ကြိုမသိတဲ့ data တွေအတွက်။

Stack Overflow ဆိုတာ ဘာလဲ?

နာမည်ကြီး Q&A site “Stack Overflow” ရဲ့ နာမည်က ဒီက လာတာပါ။ Recursion အကြောင်း ရေးတုန်းက ပြောခဲ့သလိုပဲ — function က ကိုယ့်ဟာကိုယ် အဆုံးမသတ် ပြန်ခေါ်နေရင် Stack ပေါ်မှာ ပန်းကန်တွေ ဆင့်တင်သလို အလွှာတွေ ထပ်လာပြီး နောက်ဆုံး စင်ပြိုကျသွားတယ်။ အဲဒါကို Stack Overflow လို့ ခေါ်တယ် — “ပန်းကန်စင် ပြည့်လျှံသွားပြီ” ပေါ့။


RecursionError: maximum recursion depth exceeded

Python မှာ ဒီ error မြင်ဖူးရင် — သင့်ရဲ့ Stack စင် ပြိုကျသွားတာပါ။ 🙂

ကိုယ့်အတွက် လက်တွေ့ အသိပညာ

Variable သေးသေးလေး (int, boolean) တွေက Stack မှာ — မြန်မြန် အလုပ်လုပ်တယ်။
List, dict, object ကြီးတွေက Heap မှာ — နာမည်လေးပဲ Stack ပေါ်မှာ ရှိပြီး တကယ့် data က Heap ထဲမှာ။
Memory leak ဆိုတာ Heap ထဲက ပစ္စည်း မလိုတော့ဘဲ ဖယ်မထုတ်မိလို့ နေရာပြည့်လာတာ။
Garbage collector (Python, Java မှာရှိတယ်) ဆိုတာ Heap ထဲက မလိုတော့တဲ့ ပစ္စည်းတွေ အလိုလို လိုက်ရှင်းပေးတဲ့ “သန့်ရှင်းရေးဝန်ထမ်း” ပါ — အဲဒီအကြောင်း အသေးစိတ် ရေးပြီးသားရှိတယ်၊ ပြန်ဖတ်ကြည့်ပါ။

Memory ကို ဒီလို အခန်းနှစ်ခန်း ခွဲထားတာ သိသွားရင် “ဘာလို့ program က နှေးနေတာလဲ” “ဘာလို့ crash တာလဲ” ဆိုတဲ့ မေးခွန်းတွေကို ပိုနားလည်လာမယ်။ နောက်တစ်ခါ RecursionError တက်ရင် ပန်းကန်စင်ပြိုကျတဲ့ ပုံကို သတိရလိုက်ပါ။ 🙂