Mastering Elements of programming ဆိုတဲ့ခေါင်းစဥ်နဲ. ပြောခဲ့တာလေးပြန်ရေးပေးလိုက်ပါတယ်။
Programming ကိုလေ့လာတာဆိုရင် ၂ပိုင်းခွဲလို.ရပါမယ်။ တပိုင်းက Programming language ကိုလေ့လာတာပါ။ နောက်တပိုင်းက problem solving ကိုလေ့လာတာပါ။ Programming language ကိုလေ့လာတာက ဘာသာစကား တခုကိုလေ့လာတာနဲ. သဘောတူပါတယ်။ ဥပမာ မြန်မာစာကိုလေ့လာသလိုပေါ့။ မြန်မာစာ ရေးတတ်ဖတ်တတ်တဲ့လူတိုင်း ကဗျာ ဆရာ စာရေး ဆရာတော့ မဖြစ်ကြဘူး ။ ဘာလို.လဲဆိုတော့ စာရေးဆရာ ကဗျာ ဆရာတွေကျတော့ သူတို.က ပိုပြီး ဘာသာစကားကို ကျွမ်းကျင်တာထက် ဖော်ပြပု expression, abstraction မတူလို. ဥပမာ မြန်မာစာ Professor ကြီးက မြန်မာစာကိုတော့ သေချာနားလည်မယ်။ ဒါပေမဲ့ သူက စာရေးဆရာ ဖြစ်ချင်မှဖြစ်မှာ။ Programming မှာလဲ ဒီလိုပဲ ဘာသာစကား အပြင် problem solving လိုသေးတယ် ။ အဲ့တော့မှသာ programming ကိုနိုင်နင်းမယ်။
ဘာသာ စကားဘက်ကနေကြည့်ရင် programming langauge တွေမှာ လေ့လာရမှာ သုံးမျိုးရှိတယ်။
Syntax
သူ.ကို ဘာသာစကားအရဆိုရင် သဒ္ဒါပေါ့။ ဘာတွေပါလဲဆိုရင် statement တကြာင်းကို ဘယ်လိုရေးရမလဲဆိုတဲ့ သဒ္ဒါနည်းအရ ဘယ်လိုမှန်မှန်ကန်ကန်ဖွဲ့မလဲဆိုတာပါတယ်။ ဥပမာ assignment statement ဆိုရင် Grammar rule အနေနဲ.ဒါမျိးသတ်မှတ်ထားတယ်။
<assignment> ::= <left hand side> <assignment operator> <assignment expression>
<left hand side> ::= <expression name> | <field access> | <array access>
<assignment operator> ::= = | *= | /= | %= | += | -= | <<= | >>= | >>>= | &= | ^= | |=� <assignment expression> ::= <conditional expression> | <assignment>
BNF လို.ခေါ်တယ်။ ရှင်းရအောင်ပြောရရင် assignment statemt ဖြစ်ဖို. left hand side မှာ assign လုပ်လို.ရတဲ့ variable လိုမယ် နောက် assignment operator တွေထဲက =,+=,-=, အဲ့လိုကောင်တွေလိုက်ရမယ် နောက်ပြီးရင် ညာဘက်မှာ value ကိုထုတ်ပေးနိုင်တဲ့ expression ဖြစ်ရမယ်။ နောက်ဆုံးမှာ semicolon နဲ.အဆုံးသတ်ရမယ်
ဥပမာ a = 10;
ဒါသည် assignment statement ကို syntax အရရေးတာ။ Programming language တွေအားလုံးမှာ Grammar မှန်မှသာ ကျန်တဲ့အလုပ်ကို ဆက်လုပ်ပေးကြတယ်။
Syntax ကိုနားလည်ဖို. programming စာအုပ်တော်တော်များများကိုဖတ်ရင် နားလည်ပါတယ်။ သူတို.က အများစုက ဒါကိုပဲ ပတ်ရှင်းနေကြတာ။
Semantics
သူကတော့ ရေးထားတဲ့ statement တွေ expression တွေက ဘာအဓိပ္ပာယ်ကို ဆောင်သလဲဆိုတာကို ပြောတာ။ Programming language တွေရဲ. semantic ကိုနားလည်ဖို.ကျတော့ ထင်သလောက်မလွယ်ပြန်ဘူး။ ဥပမာ C,C++ မှာ
a ++
ဆိုပါတော့ အဓိပ္ပာယ် က a ကို တစ်ပဲ ပေါင်းပေးမယ် တိုးပေးမယ်ဆိုရင် မဟုတ်သေးဘူး။ Context အပေါ်မူတည်သေးတယ်။ Context ဆိုတာ ဥပမာ
ဟေ့ ဘယ်အချိန်ရှိပြီလဲ ဆိုတဲ့စကားပေါ့ သာမာန်ရိုးရိုး အချိန်မေးရင် ဒါနာရီကိုသိချင်လို.မေးတာ။ အဲ့လိုမဟုတ်ပဲ ဆရာက စာသင်နေမယ် ကျောင်းသားက နောက်ကျ၀င်လာမယ်ဒါကိုခုနက စကားနဲ.ပြန်မေးရင် သူ.ကိုနာရီကိုမေးတာမဟုတ်ဘူး။ မင်းနောက်ကျတယ်နော် သိတယ်မို.လားဆိုတဲ့ အဓိပ္ပာယ်ကိုပြောတာ။
ဆိုချင်တာက semantics သည် syntax ကနေတိုက်ရိုက်ယူလို.မရဘူးဆိုလိုတာ။ Context ရှိမယ်။ ခုနက a++ ကိုဆက်ရမယ်ဆိုရင် a သည် သာမာန် number ဆိုရင် ၁ တိုးမယ်။ ဒါပေမဲ့ pointer type ဖြစ်နေမယ်ဆိုရင် သူ.ကို point လုပ်ထားတဲ့ type ရဲ. size အလိုက်တိုးမယ်။ ဥပမာ a က integer pointer ဆိုရင် integer သည် 4 bytes နေရာယူတဲ့အတွက် pointer address ကို 4 ထပ်ပေါင်းပေးမှာ။ တကယ်လို. double pointer ဆိုရင် 8 ထပ်ပေါင်းတာဖြစ်သွားမယ်။ Semantics သည်မတူတော့ဘူး။ Dynamic programming langauge တွေမှာဆိုရင် type သည်ပြောင်းလို.ရတဲ့အတွက် အဲ့ကောင်သည် ပိုသိသာတယ်။
Division operator / ဆိုပါစို. သူ.ကို 3/2 ဆိုရင် Java မှာ 1 ရမယ် ဒါပေမဲ့ JS မှာ 1.5 ပဲ ဆိုချင်တာက မတူဘူး။ C++ လို operator overloading ပေးထားတဲ့ကောင်တွေမှာဆိုရင် / သည် တခြား အဓိပ္ပာယ်ပါရှိနိုင်သေးတယ်။ Semantics သည် language တွေကွာတဲ့အပေါ်မှာလဲကွာနိုင်တယ်။ နောက် same langauge မှာတောင် အထားအသို whitespace စတာတွေပေါ်မူတည်ပြီးပါ ကွာနိုင်သေးတယ်။
ဥပမာ
int x = 10;
x += ++x;
သည် Java မှာ 21 ထွက်မယ်။ C မှာ 22 ထွက်မယ်။ အဲ့အကြာင်းရေးထားတာ သက်သက်ရှိတယ်။ ရှာဖတ်ကြည့်ပါ။ ဘာလို. 1 ကွာသွားတာလဲနားလည်ဖို. language implementation တွေထိနားလည်ဖို.လိုတယ်။
အောက်က JS example ကိုကြည့်ရအောင်။
function funcOne()
{
return {
name : ‘TK’
};
}
function funcTwo()
{
return
{
name : ‘TK’
};
}
funcOne သည် object ကို return ပြန်ပြီး funcTwo သည် undefined ကို return ပြန်လိမ့်မယ်။ Carriage return လေးကွာတာနဲ. semantics ကွာသွားတယ်။ ဘာလို.ဖြစ်တာလဲဆိုရင် JS မှာ automatic semicolon insertion ထဲ့ပေးထားလို.။
ခုနကကောင်တွေက language ကွာလို. whitespace ဘာညာကွာလို. ကဲ နောက် အဲ့ကောင်တွေ မကွာပဲ value လောက်ကွာတာကိုကြည့်ရအောင်။
Integer a = 127;
Integer b = 127;
�System.out.println(“a==b ” +(a == b) );
�Integer c = 128;
Integer d = 128;
�System.out.println(“c==d ” +(c == d) );
Java code ပေါ့ ပထမ print အတွက် true ထုတ်ပေးမယ် a==b ကို ဒုတိယကောင်ဖို.ကျတော့ false ကိုထုတ်ပေးမယ် ။ ဘာဖြစ်တာလဲဆိုရင် a, b, c,d သည် wrapper အဲ့တော့ == သည် reference equality ကိုစစ်တယ်။ ဒါဆို ဘာလို. a==b သည် true ဖြစ်လဲ 127 ခြင်းတူလို. (Object တူတာ)ဒါဆို ဘာလို. 128 ကျမတူတာလဲ။ ဒါကိုနားလည်ဖို. Java ရဲ. Integer class ကိုဘယ်လိုရေးထားလဲဆိုတာ နားလည်ရမယ် အဲ့အထဲမှာ -128 ကနေ +127 အထိကို cache လုပ်ထားတယ်ဆိုချင်တာက အဲ့ range ထဲဆောက်တဲ့ Integer wrapper တွေသည် Object အသစ်မရဘူး same object ဒါမို. a==b သည် true တာ။ c==d ကျတော့ cache ထဲက ကောင်သုံးလို.မရတော့ဘူး အသစ်ဖြစစ်တယ် ဒါမို. falseဖြစ်တယ်။
အဲ့တော့ Semantics ကိုနားလည်ဖို.ကျ Syntax ထက်ပိုခက်သွားတယ်။ Langauge implementation, Specification, library စတာတွေလိုသွားမယ်။
Pragmatic
သူကျတော့ language feature တွေကိုဘယ်လို အသုံးတည့်အောင်သုံးလဲဆိုတာ။ ဥပမာ Java လို OO language ကို သုံးမယ်ဆိုရင် Object Oriented Programming concept, design pattern အစရှိတာတွေ နားလည်ရမယ်။ မဟုတ်ရင် အဲ့တာသည် pramantic အရ အဆင်မပြေဘူး။
var arr = [120,10,20,7,90,];
var max = arr[0];
for(var i=1;i< arr.length;i++)
{
if( max < arr[i])
{
max = arr[i]
}
}
console.log(“max “,max);
ခုနက အပေါ်က code သည်JS မှာ array ထဲက maximum element ကိုရှာတာ။ Pragmatic အရကြည့်ရင် အဆင်မပြေဘူး။သူ.ကို အောက်ကလို တကြောင်းထဲရေးလို.ရတယ်။ ဒါဆို pragmatic ပိုကျတယ်။
console.log(“Max is ”,Math.max.apply(null,arr));
သူ.ကိုနားလည်ဖို.ကျတော့ သုံးနေတဲ့ programming language ရဲ. paradigm ရယ် concept , idiom တွေရယ် နားလည်ဖို.လိုတယ်။ Design pattern လိုကောင်တွေ language specific feature တွေနားလည်ရမယ်။
နောက်ဆုံproblem solving ဖို.ကတော့ algorithm လိုကောင်တွေ နားလည်ဖို.လိုတယ်။
ဒါကတော့ power point ပါ။
https://www.dropbox.com/s/kcjl80q2vuad791/ElementOfProgramming.pptx?dl=0
Original link