Machine language

**Machine language** (စက်နားလည်သော သို့မဟုတ် စက်အသုံးပြုသော ဘာသာစကား) ဆိုသည်မှာ ကွန်ပျူတာ၏ CPU မှတိုက်ရိုက် အသုံးပြုသော ညွှန်ကြားချက် အစုအဝေးဖြစ်သည်။ ညွှန်ကြားချက်တစ်ခုချင်းစီသည် ကွန်ပျူတာမှတ်ဉာဏ်ပေါ်ဆွဲတင်ခြင်း၊ အခြားညွှန်ကြားချက်ရှိရာ နေရာသို့ သွားခြင်း တို့ကဲ့သို့သော သေချာစွာသတ်မှတ်ထားသော အလုပ်တစ်ခုကိုသာ လုပ်ဆောင်သည်။ CPU မှတိုက်ရိုက် အလုပ်လုပ်သော ပရိုဂရမ်တိုင်းသည် ယင်းကဲ့သို့သော ညွှန်ကြားချက်ကို စီတန်းထားခြင်းသာဖြစ်သည်။

ကိန်းဂဏန်းဖြင့် ဖွဲ့စည်းထားသော စက်အသုံးပြုသောကုဒ် (machine code)အား compiled code ( လူရေးထားသော ပရိုဂရမ်အား ကြားခံကုဒ် သို့ပြောင်းထားသောကုဒ်)၏ အနိမ့်ဆုံး ကိုယ်စားပြုထားသောကုဒ် ဟုယူဆနိုင်ပေသည်။ (ပရိုဂရမ်းမင်း တွင် လူသားများဖတ်နိုင်သော ရေးသားထားချက်များအား အမြင့်ဆုံး ဟုသတ်မှတ်ကာ စက်ကသာနားလည်နိုင်သော ရေးသားချက်များကို အနိမ့်ဆုံးဟု သတ်မှတ်သည်။) စက်အသုံးပြုသောကုဒ် မှာ ဟဒ်ဝဲပေါ်တွင် မှီခိုမှုရှိသည်။ ဆိုလိုသည်မှာ CPU တစ်ခုနားလည်သောကုဒ်သည် အခြားCPUနားလည်ချင်မှနားလည်မည်ဖြစ်သည်။ ပရိုဂရမ်များကို စက်နားလည်သောဘာသာစကားဖြင့် တိုက်ရိုက်ရေးရန်ဖြစ်နိုင်သော်လည်း ထိုသို့ပြုလုပ်ရန်မှာ ပျင်းရိငြီးငွေ့ဖွယ်ကောင်းပြီး နှေးကွေးရုံသာမက အသေးဆုံးယူနစ် (bit) တစ်ခုချင်းစီအလိုက်စီမံရခြင်း၊ တည်နေရာ (address)နှင့် ကိန်းသေတန်ဖိုးများကို (ပရိုဂရမ်ရေးသားသူကိုယ်တိုင်) တွက်ထုတ်ပေးရခြင်းတို့မှာ အမှားဖြစ်နိုင်ခြေ အင်မတန်များသဖြင့် စက်နားလည်သောဘာသာစကားကို အသုံးပြုပြီး ပရိုဂရမ် ရေးသားခြင်း မရှိသလောက်ပင်ဖြစ်သည်။

ယနေ့ခေတ် ပရိုဂရမ်အားလုံးလောက်နီးပါးမှာ အဆင့်မြင့် ပရိုဂရမ်းမင်း ဘာသာစကားများ (ဥပမာ Java programming) သို့မဟုတ် assembly language ကို အသုံးပြုပြီးရေးသားထားခြင်းဖြစ်သည်။ (assembly language ဖြင့်ရေးသားထားသောကုဒ်များသည် Java ကုဒ်များလောက်နားလည်ရမလွယ်သဖြင့် Java နှင့် assembly ကို ယှဉ်သော် Java ကပို၍အဆင့်မြင့်သည်၊ higher level ဖြစ်သည်ဟု ယူဆခြင်းဖြစ်သည်) ထိုသို့ရေးသားထားသောကုဒ်များကို compilers, assemblers နှင့် ) များကို အသုံးပြုကာ စက်နားလည်သောကုဒ်အဖြစ်သို့ ဘာသာပြန်ဆို (translate)ကြခြင်းဖြစ်သည်။ ဤနေရာတွင် Interpreted programမှာ ခြွင်းချက်ဖြစ်သည်။ Interpreted program ဆိုသည်မှာ မုလပရိုဂရမ်ကို စက်နားလည်သောကုဒ်အဖြစ်သို့ ဘာသာပြန်ဆိုထားခြင်း မရှိပါ။ သို့ပါသော်လည်း interpreter သည် မူလကုဒ်တွင်ပါဝင်သော ညွှန်ကြားချက်များ (မူလကုဒ်မှထုတ်လုပ်ထားသော အလုပ်လုပ်နိုင်သော စက်နားလည်သောကုဒ် များပါဝင်သည့် ညွှန်ကြားချက်များ) ကို လုပ်ဆောင်ပါသည်။

### ကြိုတင်သိရှိထားရန်များ
ဤစာမျက်နှာတစ်ခုလုံးတွင် စက်နားလည်သောဘာသာစကား (machine language) နှင့် စက်နားလည်သောကုဒ် (machine code) ဟူ၍ နှစ်ခု အသုံးပြုထားသော်လည်း ယေဘုယျအားဖြင့် အတူတူပင်ဖြစ်သည်။ CPU နှင့် processor သည်လည်း အတူတူပင်ဖြစ်သည်။ အကယ်၍ သင်သည် software development or computer science terms နှင့် ရင်းနှီးခြင်းမရှိပါက system သို့မဟုတ် စနစ်ကို ကွန်ပျူတာ (ကွန်ပျူတာ အလုပ်လုပ်ပုံ) ဟုသာ ယူဆနိုင်သည်။ စက်ဟူသည်မှာ CPU သို့မဟုတ် processor ကိုသာရည်ညွှန်းပါသည်။

## Machine code instructions
Processorတိုင်း သို့မဟုတ် processor အစုအဝေးတိုင်းသည် ကိုယ်ပိုင် စက်နားလည်သော ညွှန်ကြားချက်(Machine code instructions) အစုအဝေးများရှိကြသည်။ ၎င်း ညွှန်ကြားချက်များသည် bits၏ပုံစံအမျိုးမျိုးပင်ဖြစ်သည်။ ထို bitsပုံစံများသည် စက်အတွက်ကွဲပြားခြားနားသောညွှန်ကြားချက် အမျိုးမျိုးကိုပေးနိုင်သည်။ ထို့ကြောင့် တူညီသောဖွဲ့စည်းတည်ဆောက်ပုံရှိသော processorများအတွက် သီးခြား စက်နားလည်သောညွှန်ကြားချက်များ ရှိနေခြင်းဖြစ်သည်။ ထိုကဲ့သို့သောprocessorများတွင် နောက်မျိုးဆက် processorများက ရှေ့မှ processorများ၏ စက်နားလည်သောညွှန်ကြားချက်များနှင့် အသစ်ထပ်မံထည့်သွင်းထားသော ညွှန်ကြားချက်များပါဝင်လေ့ရှိကြသည်။ ဖြစ်တောင့်ဖြစ်ခဲဆိုသော်လည်း တစ်ခါတစ်ရံတွင်မူ နောက်မျိုးဆက် processorများက ရှေ့မှ processorများ၏ညွှန်ကြားချက်များကို ဆက်လက်၍အသုံးမပြုတော့ခြင်း၊ အဓိပ္ပာယ်များကိုပြောင်းလဲခြင်းများလည်း ရှိသည်။ ယင်းသို့ပြုလုပ်ခြင်းသည် ယခင်စက်နားလည်သောရေးသားထားသောကုဒ်များ၏ လိုက်လျောညီထွေဖြစ်မှု(compatibility)၊ ကွဲပြားခြားနားသောလုပ်ဆောင်ချက်များကိုလုပ်ဆောင်ခြင်း တို့ကိုဖြစ်ပွားစေနိုင်သည်။ စနစ်(Computer system)များအနေဖြင့် ကွဲပြားခြားနားသော မန်မိုရီ(ကွန်ပျူတာမှတ်ဉာဏ်) စီစဉ်မှု, Operating system နှင့် အခြားသော ကိရိယာများ (Mouse, Keyboard)ရှိနိုင်သည်။ ကွန်ပျူတာစနစ်(Computer system)  အနေဖြင့်ယင်းကဲ့သို့သော အချက်များအပေါ်တွင်လည်း မှီတည်နေခြင်းဖြစ်ရကား မတူညီသောစနစ်များသည် တူညီသော Machine code (စက်နားလည်သောကုဒ်) များဖြင့် (အမျိုးအစားတူ processor ကိုသုံးထားစေကာမူ) အလုပ်လုပ်နိုင်လိမ့်မည် မဟုတ်ပါ။

စက်နားလည်သော ညွှန်ကြားချက်(Machine code instructions) အစုအဝေးတစ်ခုတွင် တူညီသောအရွယ်အစားရှိသည့် ညွှန်ကြားချက် သို့မဟုတ် အရွယ်အစား ပြောင်းလဲနိုင်သော ညွှန်ကြားချက်များ ပါဝင်သည်။ bits ပုံစံများ ဖွဲ့စည်းထားပုံသည် processor ဖွဲ့စည်းတည်ဆောက်ပုံ ပေါ်မူတည်ပြီး အဓိကပြောင်းလဲသလို ရံဖန်ရံခါတွင်မူ ညွှန်ကြားချက် အမျိုးအစား ပေါ်မူတည်၍လည်း ပြောင်းလည်းနိုင်ပါသေးသည်။  ညွှန်ကြားချက်အများစုတွင် တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော opcode (ညွှန်ကြားချက်အမျိုးအစားကိုသတ်မှတ်ရန်)၊  အမှန်လုပ်ဆောင်ရမည့်လုပ်ငန်း (operation) နှင့် အခြားလိုအပ်သော အရာများ (operands, addressing mode, ကိန်းသေတန်ဖိုးများ) တို့ပါဝင်သည်။ 

## Programs
Programs ဆိုသည်မှာ CPU အလုပ်လုပ်မည့်(execute) ညွှန်ကြားချက်များ၏ အစုအဝေး(sequence)ပင်ဖြစ်သည်။ သာမန်CPUများအနေဖြင့် ညွှန်ကြားချက်များကို တစ်ခုပြီးမှတစ်ခု executeလုပ်သော်လည်း superscalar processor များကမူ ညွှန်ကြားချက်အမြောက်အမြားကို တစ်ချိန်တည်းမှာပင်executeလုပ်နိုင်သည်။ Program flow (program code  များ၏အလုပ်လုပ်ရန် အစီအစဉ်)ကို 'jump instructions' ကလွှမ်းမိုးထားသည်။ 'Jump instructions' ဆိုသည်မှာ နောက်ထပ်လုပ်ရမည့် ညွှန်ကြားချက်ကိုပြောင်းလဲပေးခြင်းဖြစ်သည်။  C++ coding များတွင်အသုံးများသော goto ကဲ့သို့သော statement မျိုးဖြစ်သည်။ Conditional jumps ဖြစ်ပေါ်ရန်ကမူ conditionကိုက်ညီခြင်း မညီခြင်း ပေါ်မူတည်သည်။ Conditional jumps ဆိုသည်မှာ Java programming ကဲ့သို့သော programming languageများတွင် သုံးသော if else statement များကို ဆိုလိုခြင်းဖြစ်သည်။ ဥပမာ line no. 25ကို executeလုပ်ပြီးသောအခါ line no. 26ကို executeလုပ်သင့်သော်လည်း if else အခြေအနေများ(conditions) နှင့်ကိုက်ညီသော အခြား ကုဒ်များကို executeလုပ်သွားခြင်း (jump ဖြစ်သွားခြင်း) ကိုဆိုလိုခြင်းဖြစ်သည်။

## Assembly languages
Assembly languageသည် စက်နားလည်သော ဘာသာစကား (Machine language) အားပိုမို ဖတ်ရလွယ်ကူအောင် ရေးသားထားခြင်းဖြစ်ပြီး ၎င်းသည်  Machine code instructions အားကိန်းဂဏန်းများဖြင့် ရည်ညွှန်းမည့်အစား  mnemonic codes ဖြင့်ရည်ညွှန်းခြင်းပင်ဖြစ်သည်။ ဥပမာအားဖြင့် Zilog Z80 processorတွင် Machine code(စက်နားလည်သောကုဒ်) 00000101သည် CPUအား processor register Bကို ၁ လျှော့ခိုင်းခြင်းဖြစ်သည်။ ၎င်း 00000101ကို Assembly languageဖြင့်ဆိုလျှင် DEC B ဟု ဖော်ပြနိုင်ပေသည်။

## ကိုးကား