Compiler

ကွန်ပိုင်လာသည် ပရိုဂရမ်စုဖွဲ့မှုတစ်ခုဖြစ်ပြီး ပရိုဂရမ်မင်းဘာသာစကားတစ်ခုခုဖြင့်ရေးသားထားသော ဆို့ဖ်ကုတ်ဒ်များကို ကွန်ပြူတာနားလည်သောဘာသာစကား(object code ဟုခေါ်သော ၁ နှင့် ၀ သာလျှင်ပါသောပုံစံ)သို့ ပြောင်းလဲပေးသည့်အရာဖြစ်သည်။ အဓိကအချက်မှာ ဆို့ဖ်ကုတ်ဒ် ကို executableပရိုဂရမ်သို့ပြောင်းခြင်းပင်ဖြစ်သည်။
ကွန်ပိုင်လာဟူသော အမည်မှာ အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကား ဖြင့်ရေးသားထားသော ဆို့ဖ်ကုတ်ဒ်များကို အဆင့်နိမ့်ပရိုဂရမ်မင်းဘာသာစကား သို့
(assembly languageသို့machine code)ပြောင်းခြင်းဖြစ်သည်။ ကွန်ပြူတာတွင် ကွန်ပိုင်လာဖြင့်ပြောင်းထားသော ပရိုဂရမ်ကို မောင်းနှင်နိုင်မည်ဆိုပါက အဆိုပါကွန်ပြူတာ၏ စီပီယူသို့ စက်မောင်းနှင်စနစ်သည် ကွန်ပိုင်လာလုပ်ဆောင်နေသော   စက်မောင်းနှင်စနစ်နှင့် မတူညီပါက   ထိုကွန်ပိုင်လာကို cross-compilerဟုခေါ်ဆိုသည်။ အဆင့်နိမ့်ပရိုဂရမ်မင်းဘာသာစကားမှ အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကားသို့ ပြောင်းသည့်အရာကို decompiler ဟုခေါ်ဆိုကြသည်။ အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကားအချင်းချင်း ပြောင်းလဲခြင်းကို
(language translater ,source to source translater or language converter )ဟုခေါ်ဆိုကြသည်။rewriter သည်လည်း ပရိုဂရမ်တစ်ခုဖြစ်ပြီး ဘာသာစကားပြောင်းလဲခြင်းမရှိဘဲ ဖော်ပြမှုပုံစံကိုသာ ပြောင်းလဲပေးသောအရာဖြစ်သည်။
ကွန်ပိုင်လာသည် lexical analysis, preprocessing, parsing,  (Syntax-directed translation), code generation, and code optimization စသော လုပ်ငန်းများ လုပ်ဆောင်မှုပြုသည်။
ကွန်ပိုင်လာကြောင့်ဖြစ်သော ပရိုဂရမ်၏အမှားများသည် ရှာဖွေရာတွင်ခက်ခဲသဖြင့် ကွန်ပိုင်လာရေးသားသူများမှ၎င်းတို့၏ ဆော့ဖ်ဝဲအား ကောင်းမွန် စေရန်အထူးလုံ့လပြုကြိုးစားကြရသည်။

## သမိုင်း
အစောပိုင်းတွင် ကွန်ပြူတာများအတွက် ဆော့ဝဲများကို assembly language ဖြင့်သာရေးသားကြရသည်။ ကွန်ပိုင်လာတည်ထွင်ရေးသားခြင်းထက် စီပီယူအမျိုးအစားများစွာတွင် ဆော့ဖ်ဝဲများပြန်လည်အသုံးပြုနိုင်စွမ်းသည် တနဖိုးကြီးလှသော်လည်း အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကားကို တီထွင်နိုင်ခြင်း မရှိကြသေးချေ။ ထိုကြောင့် ထိုခောတ်အခါက ပထမဆုံး ကွန်ပိုင်လာ ဒီဇိုင်းဆွဲနိုင်ရန်
အတွက် ကန့်သတ်မှုဖြစ် နေသောမန်မိုရီ(memory)သည် ကွန်ပြူတာများအတွက် နည်းပညာစိန်ခေါ်မှုသဖွယ် ဖြစ်နေခဲ့သည်။၁၉၅၀နှစ်ကုန်အရောက်တွင် 
မရှင်းပေါ်တွင်မှီခိုခြင်းမရှိသော ပထမဆုံး ပရိုဂရမ်းမင်းဘာသာစကား အဆိုပြုချက်ထွက်ပေါ်လာသည်။ တစ်ဆက်ထဲမှာပင် စမ်းသပ်အဆင့် ကွန်ပိုင်လာများပေါ်ပေါက်ခဲ့သည်။ ပထဆုံး ကွန်ပိုင်လာကို ၁၉၅၂ ခုနှစ်တွင် Grace Hopper မှ A-0 programming languageအတွက် ရေးသားခဲ့သည်။
IBM တွင် John Backus ဦးဆောင်မှုဖြင့် FORTRAN အဖွဲ့မှ ပြီးပြည့်စုံသော ကွန်ပိုင်လာကို ၁၉၅၇ ခုနှစ်တွင် ဂုဏ်ယူစွာ မိတ်ဆက်နိုင်ခဲ့သည်။
၁၉၆၀တွင် COBOLသည်များပြားလှသောဗိသုကာဖွဲ့စည်းပုံများပါသည့်  ကွန်ပိုင်လာတွင် ကွန်ပြူတာနားလည်သောပုံစံသို့ပြောင်းရန် အစောဆုံး ဘာသာစကားဖြစ်သည်။

ကွန်ပြူတာဘာသာစကားများအသစ်ပေါ်ပေါက်လာခြင်းနှင့်ကွန်ပြူတာဖွဲ့စည်းမှုဗိသုကာများ ရှုပ်ထွေးတိုးတက်လာခြင်းနှင့်အတူ ကွန်ပိုင်လာများသည်လည်း ပို၍ရှုပ်ထွေးလာခဲ့သည်။ အစောပိုင်း ကွန်ပိုင်လာများကို assembly language ဖြင့်သာရေးသားကြသည်။ ပထမဆုံး self-hosting ကွန်ပိုင်လာကို ၁၉၆၂ခုနှစ်တွင်
Lisp အတွက် MIT မှ Tim Hart နှင့် Mike Levin တို့ကဖန်တီးခဲ့သည်။၎င်းသည် ၁၉၇၀ ခုနှစ်အထိ ဘာသာစကားတို့တွင် ကွန်ပိုင်လာတို့ကိုပိုမိုကောင်းမွန်စေရန် အဓိကလက်တွေ့ကျခဲ့သော်လည်း Pascal နှင့် C တို့သည် ဘာသာစကားတို့အတွက် ရွေးချယ်ခဲ့ကြသည့်အတွက် ကျော်ကြားခဲ့ကြသည်။self-hosting ကွန်ပိုင်လာတည်ဆောက်ရာတွင် bootstrapping ဟုခေါ်သော ပြဿနာရှိသည်။ ဘာသာစကားများအတွက် အဆိုပါ ကွန်ပိုင်လာအားအသုံးပြုနိုင်ရန် ပထမဆုံးအနေဖြင့် အခြားဘာသာစကားများဖြင့်ရေးထားသော ကွန်ပိုင်လာဖြင့် ကွန်ပိုင်းလုပ်ခြင်း (သို့) interpreterတွင်မောင်းနှင်
နေသောကွန်ပိုင်လာဖြင့်(Hart and Levin's Lisp compiler) ကွန်ပိုင်းလုပ်ခြင်းကို ဦးစွာလုပ်ဆောင်ရသည်။

## Compilation
ပထမဆုံး အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကား FORTRAN (FORmula TRANslator) မတိုင်မီ assembly language ကိုသာတွင်ကျယ်စွာ အသုံးပြုခဲ့ကြသည်။
ကွန်ပြူတာဟာဒ်ဝဲဖွဲ့စည်းမှုဗိသုကာတူညီသည့်ပုံစံတွင် assembly language သည် ပရိုဂရမ်များကိုပြန်လည်နေရာချခြင်းများနှင့် ပြန်လည်အသုံးပြုနိုင်သော်လည်း
ကွန်ပြူတာဟာဒ်ဝဲဖွဲ့စည်းမှုဗိသုကာမတူညီသည့်ပုံစံတွင် ပရိုဂရမ်များကို ပြန်လည်ရေးသားပြုပြင် ကြရသည်။

FORTRAN နောက်ပိုင်းပေါ်လာသည့် အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကားများဖြစ်သော COBOL, C, နှင့် BASIC တို့တွင် ပရိုဂရမ်မာ များသည် မရှင်းပေါ်မှီခိုခြင်းမရှိသော ပရိုဂရမ်များကိုရေးသားနိုင်ကြသည်။ ကွန်ပိုင်လာများသည် အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကားများကို ဟာဒ်ဝဲများအတွက် မရှင်း
ဘာသာစကားတွင် ဦးတည်ချက်ထားသော ပရိုဂရမ်များဆီသို့ ပြောင်းလဲပေးသည်။ ထိုပရိုဂရမ်များကို အသုံးပြုသူများမှ အသုံးပြုနိုင်ပြီဖြစ်သည်။

### Structure of a compiler
ကွန်ပိုင်လာတွင် 
# ပရိုဂရမ်၏ စီစဉ်နေရာချထားခြင်း မှန်ကန်နိုင်မှုအား စစ်ဆေးခြင်း
#မှန်ကန်သော သို့ အကျိုးရလဒ်ကောင်းသည့် ကုတ်ဒ်များကိုထုတ်ပေးခြင်း
#လုပ်ဆောင်နေသာအခြေအနေတွင် စုစည်းမှုများပြုလုပ်ပေးခြင်း
#assembler နှင့်/သို့ linker တို့၏ လုပ်ထုံးလုပ်နည်းများအရ ထွက်ပေါ်လာသောအဖြေများအား စီစဉ်ပေးခြင်း တို့ပါဝင်သည်။

ကွန်ပိုင်လာတွင် အဓိကအစိတ်အပိုင်း (၃)ပိုင်းပါဝင်သည်။ ရှေ့ပိုင်း၊အလယ်ပိုင်းနှင့်နောက်ဆုံးပိုင်းတို့ဖြစ် ကြသည်။

ရှေ့ဆုံးပိုင်းသည် ရေးသားထားသော ပရိုဂရမ်များအား ပရိုဂရမ်မင်းဘာသာစကား၏ ရေးသားမှုပုံစံတို့နှင့် ကိုက်ညီမှုရှိမရှိစစ်ဆေးသည်။ အဆိုပါအချက်တွင် ဥပဒေနှင်ကိုက်ညီမှု ရှိသည်ဖြစ်စေ၊မရှိသည်ဖြစ်စေ အကျုံးဝင်သည်။ ရှေ့ဆုံးပိုင်းသည် ဆို့ဒ်ကုတ်များ၏ (intermediate representation or IR ) ကိုယ်စားပြုကြားခံ
ကို ထုပ်လုပ်ပေးသည်။
အလယ်ဆုံးပိုင်းသည် အဓိကလုပ်ငန်းဆောင်ရွက်ချက်များကို လုပ်ဆောင်ကြသည်။ အထူးသဖြင့် အသုံးပြု၍မရသောကုတ်ဒ်များကို ဖယ်ရှားပေးခြင်း၊ ကိန်းသေတန်ဖိုးများကို ရှာဖွေတိုးပွားစေခြင်း၊ကြိမ်ဖန်များစွာလုပ်ဆောင်ရသောနေရာ(looping ပတ်ခြင်း)တို့အား လျော့ချနိုင်ရန် နေရာသစ်သတ်မှတ်ပေးခြင်းတို့ကိုလုပ်ဆောင်ကြသည်။ နောက်ဆုံးအဆင့်အတွက် ကိုယ်စားပြုကြားခံကိုလည်း ထုပ်လုပ်ပေးသည်။
နောက်ဆုံးအဆင့်သည် အလယ်ပိုင်းအဆင့်မှ ထုတ်ပေးလိုက်သော ကိုယ်စားပြုကြားခံကို assembly ကုတ်ဒ်အဖြစ်ထုတ်လုပ်ပေးသည်။

## Compilier Output
ကိုင်ပိုင်လာများကို ၎င်းတို့ထုတ်လိုက်သော ကုတ်ဒ်များလုပ်ဆောင်ကြသည့် ပလက်ဖောင်း များပေါ်တွင်မှုတည်၍ အမျိုးအစားခွဲခြားထားကြသည်။
ပုံမှန်သမရိုးကျ ကွန်ပိုင်လာတို့၏ကုတ်ဒ်များသည် ၎င်းတို့လုပ်ဆောင်နေကြသော စက်လည်ပတ်စနစ်နှင့်တူညီသော ကွန်ပြူတာအမျိုးအစားတို့တွင်သာ လုပ်ဆောင်စေရန် ရည်ရွယ်သည်။cross compiler တို့၏ ကုတ်ဒ်များကိုမူ ခြားနားသော ပလက်ဖောင်းတို့တွင်လည်း လုပ်ဆောင်နိုင်စေရန် ဒီဇိုင်းပြုလုပ်ထားသည်။
virtual machineတို့အတွက် ကွန်ပိုင်လာမှထုတ်ပေးလိုက်သောကုတ်ဒ်များသည် တူညီသောပလက်ဖောင်းများတွင် လုပ်ဆောင်ကောင်းလုပ်ဆောင်ကြလိမ့်မည်။

### Compiled versus interpreted languages
အဆင့်မြင့်ပရိုဂရမ်မင်းဘာသာစကားများသည် အများအားဖြင့် ပြောင်းလဲပေးသည့်ပုံစံ(compiled language သို့interpreted language) ရှိသည်။