Program Code တွေ Computer ပေါ်မှာ ဘယ်လို အလုပ်လုပ်သွားလဲ
ဒီမေးခွန်းကို ကျွန်တော် Programming ရေးတတ်ခါစ ချာတိတ်ဘဝက အမြဲ စဉ်းစားဖူးတယ်
" Computer က Zero နဲ့ One ပဲ နားလည်တာဆိုပြီး ဘာကြောင့် Programming Language တွေက English စာတွေ ဖြစ်နေရတာလဲ ...
" Program တစ်ပုဒ်က Zero, One တွေပဲဆိုရင် ဘာကြောင့် Windows exe file က Mac OS ပေါ်မှာ အလုပ်မလုပ်ရတာလဲ ...
သိချင်တဲ့ မေးခွန်းတွေကသာ များနေတာ။ အဲ့တုန်းက Program run တာနဲ့ပတ်သက်ပြီး သိတာဆိုလို့ "IDE"မှာ ပါတဲ့ အစိမ်းရောင် run button လေးပဲ ရှိတယ်။ အဲ့ကောင်ကို နှိပ်လိုက်ရင် Code တွေ run သွားလိမ့်မယ်။ ဒါလေးပဲ။ ကျွန်တော်သိခဲ့တာ ဒါအကုန်ပဲ။
ဒါကြောင့် ကျွန်တော် ချာတိတ်ဘဝက မျက်လုံးမှိတ်ခေါင်းငြိမ့် လုပ်ခဲ့ရတဲ့ ဒီမေးခွန်းကို အခု တစ်ပိုင်းချင်းစီ လိုရင်းတိုရှင်း ပြန်ပြီး ဆွေးနွေးကြည့်ချင်လာတယ်။ ကိုယ် ဉာဏ်မှီသလောက်လေးပေါ့။
၁. Computer က Zero နဲ့ One ပဲ နားလည်တာဆို
-----
မှန်ပါတယ်။ အခု ကျွန်တော်တို့ Programming Language လို့ ခေါ်နေကြတဲ့ English စာတွေ၊ ဂဏန်းသင်္ချာတွေနဲ့ Program Code တွေက High-level Language များသာ ဖြစ်ပါတယ်။ လူတွေ ရေးရလွယ်အောင်၊ နားလည်လွယ်အောင် ဖန်တီးပေးထားခြင်းသာ။ နောက်ကွယ်မှာတော့ Computer ဆိုတဲ့ သတ္တဝါခင်မျာမှာ Zero (or) One သာ နားလည်ရှာတာ။ ဒီ Zero နဲ့ One အစုအဖွဲ့ကလေးတွေ ပေါင်းစပ်ထားတဲ့ Language ကို Machine code လို့ ခေါ်ကြတယ်။ တကြောင်းထဲပြောရရင် "Computer သည် Zero , One's Machine Code ကိုသာ နားလည်ပါသည်" လို့ ဆိုရမယ်။
ဒါကြောင့် Java , PHP , Python စသဖြင့် Program Code တွေကို Machine Code အဖြစ်ကို ပြောင်းလဲဖို့အတွက် ကြားထဲမှာ ဘာသာပြန်ပေးမယ့် Translator တစ်ကောင် လိုလာတယ်။ အခြေခံအားဖြင့် Translator ၂ မျိုး ရှိတယ်။ တစ်ခုက "Compiler"၊ နောက်တစ်ခုက "Interpreter"။
၂. Compiler က ဘယ်လို အလုပ်လုပ်သလဲ
-----
Compiler က High-Level Language နဲ့ ရေးထားတဲ့ Program Code တွေကို အကုန်လုံး တပြိုင်နက်တည်း အပြီးသတ် Machine Code အဖြစ်သို့ ပြောင်းလဲခြင်း ပြုလုပ်ပေးပါတယ်။
"ပြောင်းလဲခြင်း" လုပ်တယ်လို့သာ အလွယ်ပြောလိုက်တာ၊ နောက်ကွယ်မှာ သူ အဆင့်ဆင့်ဆောင်ရွက်ပေးသွားတဲ့ တာဝန်တွေက အများသား။ ယေဘုယျအားဖြင့် - Compiler တစ်ခုမှာ Frontend နဲ့ Backend ပိုင်း ဆိုပြီး ၂ ပိုင်း ရှိတယ်။ Frontend ပိုင်းမှာ Lexical Analysis, Syntax Analysis, Semantic Analysis, Intermediate code generation တို့ ပါဝင်ပြီး Backend ပိုင်းမှာတော့ Optimization နှင့် Low-level code generation တို့ ပါဝင်ပါတယ်။
ဥပမာ - နာမည်ကြီး gcc compiler ဆိုရင် Machine Code မထုတ်ခင် Assembly Code ကို ကြားခံတဆင့် အနေနဲ့ ထုတ်သေးတယ်။ နောက်ဆုံးအဆင့် ရရှိလာတဲ့ Machine Code files တွေကိုမှ Linker tool ကို အသုံးပြုပြီး Executable File တည်ဆောက်ပေးခြင်း ဖြစ်တယ်။ Machine Code ရလာပြီဆိုရင်တော့ Compiler ရဲ့ တာဝန်ဟာ ပြီးဆုံးသွားပါပြီ။
၃. Machine code ရဲ့ ဇီဇာကြောင်ပုံ
-----
Machine Code ထွက်လာပြီ၊ Executable File ရလာပြီ၊ run လို့ ရပြီ ဆိုပြီး ပျော်လို့ မရသေးဘူး။ Windows ပေါ်မှာ Compile လုပ်ထားတဲ့ Machine Code တွေကို Mac OS ပေါ်မှာ သွား Run ရင် ရမှာ မဟုတ်ဘူး။
ဘာကြောင့်ဆို Operating System တိုင်းမှာ သူ့ရဲ့ Native system function call တွေ ရှိတယ်။ ဥပမာ - disk access တို့၊ user input တို့ပေါ့။ OS မတူရင် system call API တွေ မတူဘူး။ ဒါကြောင့် Windows အတွက် ထုတ်ထားတဲ့ Machine Code တွေကို Mac OS ပေါ်မှာ သွား Run လို့ မရနိုင်ဘူး။ ဒါကြောင့် အခု Internet ကနေ Software တွေ download လုပ်ရင် Mac လား၊ Windows လား OS ရွေးပေးနေရတာ။
ဒါတင်ပဲလားဆိုတော့ မဟုတ်သေးဘူး။ CPU Architecture မတူလည်း သွား Run လို့ မရဘူး။ x86 CPU Architecture ပေါ်က Machine Code တွေက ARM Architecture ပေါ်မှာ သွား run လို့ မရဘူး။ အထင်ရှားဆုံးပြောရရင် x86 ကို PC တွေမှာ သုံးတယ်။ ARM ကို mobile devices တွေမှာ သုံးတယ်။
၄. Interpreter ဘယ်လို အလုပ်လုပ်သလဲ
-----
Interpreter နည်းလမ်းမှာတော့ တစ်ကြိမ်မှာ High-Level Program Code တစ်ကြောင်းချင်းစီကို Interpreter က လှမ်းဖတ်တယ်။ နောက် CPU ပေါ်မှာ အဲ့ဒီ Code Statement ကို Interpreter က Run ပေးပါတယ်။ Tourist Guide တွေလိုမျိုးပေါ့။ တစ်ခုချင်းစီ တစ်ကြောင်းချင်းစီကို ဘေးနားက ဘာသာလိုက်ပြန်ပေးနေတာ။
ဒီလိုနည်းနဲ့ Program တစ်ပုဒ်လုံး ပြီးဆုံးသည့်အထိ အလုပ်လုပ်ဆောင်စေပါတယ်။ ဒါက Interpreter ရဲ့ မူရင်းသဘောတရား။
Interpreted Program များမှာ Executable File ဆိုပြီး သီးသီးခြားခြား မရှိဘူး။ ကိုယ်ရဲ့ Program Source Code ကိုပဲ Executable လို့ ယူဆလို့ ရတယ်။ သူကို Run ဖို့ စက်ထဲမှာ Interpreter ရှိရင် ရပြီ။
၅. ခေတ်နောက်မကျတဲ့ Interpreter
-----
Interpret လို့ ဆိုကြပေမယ့် ခုခေတ် Programming Language တွေဖြစ်တဲ့ PHP, Python တို့ရဲ့ Interpreting Process တွေမှာတော့ Compile အဆင့် ပါဝင်ကြပါတယ်။ တနည်းဆိုရရင် သူတို့ရဲ့ Runtime Engine ထဲမှာ Compiler ပါ ပါတယ်။
ဥပမာ - Python ဆိုရင် ပထမဆုံး Program တစ်ပုဒ်လုံးကို ထုံးစံအတိုင်း Lexical Analysis, Syntax Analysis စတဲ့အဆင့်တွေပြုလုပ်ပြီး Abstract Syntax Tree ဆိုတဲ့ Data Structure တစ်ခု တည်ဆောက်တယ်။ ပြီးနောက် ပါဝင်တဲ့ Compiler ကို အသုံးပြုပြီး ByteCode ဆိုတဲ့ တဆင့်ခံ Code ကို ထုတ်တယ်။
ပုံမှန်ဆိုရင် Interpreter တွေက အဲ့ဒီ ByteCode ကို Cache ဖမ်းထားလေ့ ရှိပါတယ်။ Program run တဲ့ အကြိမ်တိုင်း Compile ပြန်လုပ်လေ့ မရှိဘူး။
ပြီးမှသာ ဒီ ByteCode တွေကိုမှ သက်ဆိုင်ရာ Interpreter က တကြောင်းချင်းစီ တန်းပြီး Execute ပြုလုပ်စေတာပါ။ PHP လည်း ဒီအတိုင်းပါပဲ။
-----
တကယ်တော့ Compiler တည်ဆောက်ပုံ မူကွဲတွေ အများကြီး ရှိသေးတယ်။ ထို့နည်းတူ Interpreter မူကွဲတွေလည်း အများကြီး ရှိပါတယ်။ အခုကတော့ ယေဘုယျ အများဆုံးတွေ့ရတဲ့ ပုံစံလေးတွေကို ပြောပြထားတာပါ။
စာဖတ်သူတို့တော့ မသိ။ စာရေးသူ ကျွန်တော်က တကယ်ဆို ရေးလို့ မပြီးသေးဘူး။ JIT Compiler အကြောင်းတွေ၊ Runtime Library အကြောင်းလေးတွေ၊ V8 engine လို Compiler နှစ်ခုနဲ့ အလုပ်လုပ်တဲ့ အကြောင်းလေးတွေ ပြောချင်သေးတယ်။ ဒါပေမယ့် စာကအတော်ရှည်နေပြီ။ ဒါကြောင့် ဒီနားမှာပဲ တဖြတ် ရပ်လိုက်ရတော့မယ်။
ဒီလောက်ဆို Program Code တွေ နောက်ကွယ်မှာ ဘယ်လို အလုပ်လုပ်သွားလဲဆိုတာ အခြေခံလောက်တော့ မျက်လုံးထဲ မြင်သွားလောက်မယ်လို့တော့ မျှော်လင့်မိပါတယ်။
Credit: Nay Lin Aung