Syntax, Semantic and Pragmatic of Programming Languages
Natural language တွေ(ဥပမာ Myanmar,English) ကို လေ့လာတဲ့နေရာမှာ ဘာသာဗေဒ အနေနဲ.ကြည့်ရင် အရေးပါတဲ့ အချက်သုံးခု ကိုလေ့လာရပါတယ်။ အဲ့ဒါတွေက Syntax,Semantic, Pragmatic ပါပဲ။ အဲ့ဒီသုံးချက်က Artificial Language တွေဖြစ်တဲ့ Programming Language တွေမှာလဲ ထိုနည်းလည်းကောင်းပါပဲ။ Programming Language တခုကိုလေ့လာတဲ့အခါမှာ အထက်ပါ သုံးခုကို သေသေချာချာနားလည်ထားမှသာလျှင် ထို programming language ကိုသေသေချာချာနားလည်နိုင်ပါလိမ့်မယ်။ Syntax ဆိုတာ တနည်းအားဖြင့် Grammar သို.မဟုတ် ရေးထုံး ရေးနည်းကိုဆိုလိုတာပါ။ Valid program တွေဖြစ်ဖို.အတွက် အနည်းဆုံး requirement ဖြစ်ပ့ါတယ်။ ဥပမာ syntax ရေးထုံး မှားနေတဲ့ ဘယ် program ကိုမှ compiler ကဖြစ်စေ interpreter ကဖြစ်စေ လက်ခံမှာမဟုတ်ပါဘူး။ Compile or execute လဲပေးလုပ်မှာမဟုတ်ပါဘူး။ Semantic ကတော့ meaning (အဓိပ္ပာယ်) ကိုဆိုလိုတာပါ။ ရေးလိုက်တဲ့ programming statement သို.မဟုတ် expression တခုဟာ ဘယ်လိုအကျိုးသက်ရောက်မှူ (side effect).တွေရှိမယ် သူ.enviroment ကိုဘယ်လို ပြောင်းလဲစေမယ်(environment ဆိုတာ ဒီနေရာမှာ memory အစရှိသဖြင့်ပေါ့) ဆိုတာတွေကို semantic ကပြဋ္ဌာန်းပါတယ်။ Pragmatic ဆိုတာကတော့ လက်တွေ.ကျ တာကိုပြောတာပါ။ ဆိုလိုချင်တာက ဘယ်လိုအခြေအနေမျိုးအတွက်ဆို ဘယ်လို language construct ကိုသုံးရမယ်ဆိုတဲ့အယူအဆပါ။
Programmer တော်တော်များများက programming language တခုခုကိုလေ့လာတဲ့နေရာမှာ Syntax ကိုသာလျှင် အဓိကထားလေ့လာကြတာကို တွေ.ရပါတယ်။ ဒါကလဲ programming language တခုရဲ. သိသိသာသာမြင်နိုင်တဲ့ အရာဖြစ်လို.ပါပဲ။ Semantic, Pragmatic တွေကတော့ Syntax လိုသိပ်သိသာထင်ရှားခြင်းမရှိပါဘူး။ Programmer ကောင်းတယောက်အတွက်ဆိုရင်တော့ syntax,semantic ရော pragmatic ပါ မသိလို.မဖြစ်ပါဘူး။
Syntax
မြန်မာစကားမှာ သဒ္ဒါမတတ် စာမတတ်လို. ဆိုရိုးရှိပါတယ်။ Syntax ဆိုတာ သဒ္ဒါကို ဆိုလိုတာပါ။ Grammar ပေါ့ဗျာ။ Grammar ဆိုတာ ဝါကျ တကြောင်း ဒါမှမဟုတ် clause တခုကို ဘယ်လို မှန်ကန်အောင် ရေးရမယ်ဆိုတာကို ပြဋ္ဌာန်းထားတဲ့ စည်းမျဉ်းတွေကိုဆိုလိုတာပါ။ Programming language မှာဆိုရင် Grammar သို.မဟုတ် Syntax ဆိုတာ Programming Language မှာရှိတဲ့ statement တွေ, expression တွေ declaration တွေကို ဘယ်လိုရေးရမယ် ဆိုပြီး ပြဋ္ဌာန်းထားတဲ့ စည်းမျဉ်း ဥပဒေသတွေပါ။ ဥပမာ Java,C,C++, C# မှာဆိုရင် variable တခုကိုကြေငြာမယ်ဆိုရင် အောက်ပါအတိုင်းကြေငြာရပါတယ်။
int variableName;
Java,C,C++,C# တို.ရဲ. language grammar အရ variable တလုံးကိုကြေငြာတော့မယ်ဆိုရင် အရှေ.ဆုံးက datatype နာမည်(ဒီမှာဆို int ပေ့ါ) နောက်က variableName လိုက်ရမှာပါ။ တခုထက်များတဲ့ variable တွေဆိုရင် comma operator ခံပြီးရေးနိုင်ပါတယ်။ variable ကိုကြေငြာ တဲ့အချိန်မှာ initialization လုပ်ချင်ရင်တော့ assignment operator( = ) ကိုသုံးပြီးတော့ initialize လုပ်နိုင်ပါတယ်။ variable declaration ဟာ statement တကြောင်းဖြစ်တဲ့အတွက် statement တွေရဲအဆုံးမှာ semicolon (;) ကိုထဲ့ကိုပေးရပါမယ်။ ဒါဟာ C,C++,Java,C# တို.ကပြဋ္ဌာန်းထားတဲ့ grammatical rule တွေပါ။ Syatax အရတော့ C family language (ဥပမာ C,C++,Java,JavaScript,C#,PHP) အစရှိတာတွေက C နဲ.အတော်ဆင်ပါတယ်(ဆင်တယ်လို.ပြောရတာ သေချာပေါက် ၏ သည် မရွေး မတူလို.ပါ)။ အကျိုးဆက်အနေနဲ. C ရဲ. Grammar ကိုနားလည်တဲ့ programmer တယောက်ဟာ C++,Java,C#,JavaScript ကို လေ့လာရတာ အတော်လွယ်ကူသွားပါတယ်။ ဒါကြောင့်လဲ language designer တွေ က သူတို.ရဲ. programming language ကို design ထုတ်တဲ့အချိန်မှာ ရှိပြီးသား programming language တွေနဲ. မတိမ်းမယိမ်းတူတဲ့ Grammar ကိုသုံးမလား ဒါမှမဟုတ် နောက်ထပ်ကိုယ်ပိုင်ဖန်တီးထားတဲ့ grammar ကိုသုံးမလားဆိုပြီးတော့ စဉ်းစားရတာပါ။ ရှိပြီးသား programming language တွေရဲ. Grammar ကိုသုံးမယ်ဆိုရင်တော့ သူ. Language ဟာ learning curve ပိုနည်းသွားပါလိမ့်မယ်။ Syntax Similarity တွေကြောင့်ပါ။
Syntax အရဆိုရင် programming language တွေကို case sensitive language နဲ. case insensitive language ဆိုပြီးထပ်ခွဲလို.ရပါတယ်။ Case sensitive language ဆိုတာ ရေးလိုက်တဲ့ character တွေအကြီးအသေး သည် ကွာခြားချက်ရှိတာကို ဆိုလိုချင်တာပါ။ ဥပမာ int num နဲ. int Num မတူတာမျိုးပါ။ (num နဲ. Num စာလုံးအကြီးအသေး)ကွာတာမျိုးပါ။ Case insensitive language ဆိုတာကတော့ ဘယ် Case (small letter, capital letter) နဲ.ရေးရေး မကွာဘူး အတူတူပဲလို.သတ်မှတ်တဲ့ language မျိုးပါ။ ဥပမာ VB,VB.NET ဆိုရင် case insensitive ပါ။ Num လို.ရေးတာနဲ. num လို.ရေးတာအတူတူပါပဲ။ ကျန်တဲ့ language တွေကတော့ case sensitive language တွေပါ။ case insensitive language တွေရဲ.အားသားချက်ကတော့ readability ကိုပိုကောင်းစေနိုင်တာပါပဲ။
Variable name တွေရဲ.စာလုံးအကြီးအသေး naming convention အပေါ်မူတည်ပြီး variable ကို local,global, field,class variable ဆိုပြီး ပိုင်းခြားသတ်မှတ်ထားတဲ့ programming language တွေလဲရှိပါတယ်။ ဥပမာ Ruby, PHP ပါ။ ဥပမာ သာမာန် letter နဲ.စတဲ့ variable (eg, myCar) ကို Ruby မှာ local variable လို.သတ်မှတ်ပါတယ်၊ $ နဲ.စရင် global variable ပါ(eg $total) @ နဲ.စရင် instance variable ပါ(eg @age)၊ double @ (@@) နဲ.စရင် class variable အဖြစ်သတ်မှတ်ပါတယ်။ အဲ့လိုသတ်မှတ်ထားတဲ့အတွက် readability ကို အတော်ကောင်းမွန်စေပါတယ်။ ဥပမာ Java,C++,C# မှာဆိုရင် variable တလုံးကိုကြည့်လိုက်တာနဲ. Local,global, instance variable ဆိုတာ ခွဲဖို.မလွယ်ပါဘူး။
Indentation အပေါ်မူတည်ပြီးတော့ meaning ကွာခြားတဲ့ language တွေလဲရှိပါတယ်။ ဥပမာ Python ပါ။ အောက်က java code(C,C++,C#,JavaScript,Dart ဆိုရင်လဲအတူတူပါပဲ) ဆိုပါစို.
if( expression )
<space>if(expression)
<space> statement
else
statement
အပေါ်က program မှာ else statement ဟာ သူနဲ.အနီးဆုံးဖြစ်တဲ့ ဒုတိယ if နဲ.သာတွဲပါလိ့မ်မယ်။ ဒါပေမဲ့ Python program သာဖြစ်ခဲ့မယ်ဆိုရင် အောက် else statement ဟာ ပထမဆုံး if နဲ.ပဲ တွဲပါလိမ့်မယ်။ ဘာလို.လဲဆိုတော့ indentation ပေါ်မူတည်ပြီးတော့ တွဲလို.ပါ။ Python မှာဆိုရင် block တွေကို indentation နဲ.ပဲသတ်မှတ်ပါတယ်။ ဒါကြောင့် program readability ကိုပိုမိုကောင်းမွန်စေပါတယ်။
C family language တွေမှာ semicolon ကို statement တကြောင်းကိုအဆုံးသတ်ဖို.အတွက်သုံးပါတယ်။ ဒါပေမဲ့ modern programming language တွေဥပမာ (Dart,Scala,JavaScript) မှာ automatic semicolon insertion, ဒါမှမဟုတ် semicolon inference ဆိုပြီးပါလာပါတယ်။ ဒါကြောင့် တချို.နေရာတွေမှာ semicolon မပါပဲရေးခွင့်ရှိပါတယ်။
Programming Language တွေရဲ. Syntax သို.မဟုတ် Grammar ကို formal method အရဆိုရင်တော့ BNF(Backus-Naur Form) , EBNF (Extended Backus-Naur Form) အနေဲ.ပြလေ့ရှိပါတယ်။ အောက်က ဥပမာ က Java Language Specification ထဲကနေ ထုတ်နှုတ်ထားတာပါ။ BNF production rule တခုကို ကိုယ်စားပြုပါတယ်။ IfThenStatment ဆိုတာ production rule နာမည်ပါ : အနောက်ကလိုက်တာကတော့ သူ.မှာပါလာတဲ့ အစားထိုးလို.ရတဲ့ syntax ကိုပြောတာပါ။ ဥပမာ IfThenStatment အတွက်ဆို if ဆိုတဲ့ keyword ရယ် () ရယ် အထဲမှာ Expression ပါရပါမယ် နောက်ပြီး Statement တခုလိုက်ရပါမယ်။ Capaital Letter နဲ.ရေးထားတာတွေက another production rule တွေပါ။ ဆိုလိုချင်တာက Expression အတွက်လဲ production rule တခုရှိဦးမယ် လို.ဆိုလိုတာပါ။
IfThenStatement:
if ( Expression ) Statement
Semantics
Semantic ဆိုတာကတော့ program တခုရဲ. Meaning အဓိပ္ပာယ်ပါ ။ Semantic က program ဘာလုပ်မယ်ဆိုတာကို ပြဋ္ဌာန်းပါတယ်။ အဲ့လိုပြဋ္ဌာန်းဖို.အတွက် syntax ကိုမှီခိုနေရပါတယ်။ Syntax မရှိပဲ semantic ကိုရေးလို.မရပါဘူး။ လိုချင်တဲ့ semantic ရဖို.အတွက် သင့်တော်တဲ့ syntax ကိုသုံးပြီး ရေးရမှာပါ။ ဥပမာ number type ဖြစ်တဲ့ variable တခုရဲ.တန်ဖိုးကို 1 တိုးစေချင်တယ်ဆိုရင် ( ၁တိုးစေချင်တယ်ဆိုတာက semantic အရပါ) ကျွန်တော်တို.ဟာ ++ operator ဒါမှမဟုတ် (compound assignment operator ဥပမာ variable +=1 ) သုံးပြီးရေးလို.ရပါတယ်။ Semantic ဟာ syntax အပေါ်မှီခိုနေပေမဲ့ semantic ကို syntax ကိုတိုက်ရိုက်ကြည့်ပြီးပြောလို.မရပါဘူး ဥပမာ
a++ ; ဆိုတဲ့ statement ဟာ C,C++ လို programming language မှာ ၁ ကြီးပဲတိုးမယ်လို. ပြောချင်တာမဟုတ်ပါဘူး။ ဥပမာ a ဟာ သာမာန် numerical type variable ဖြစ်မယ်ဆိုရင် ၁ ပဲတိုးမှာပါ။ ဒါပေမဲ့ pointer variable ဖြစ်နေရင်တော့ သူဟာ pointer variable က ညွှန်တဲ့ type (ဥပမာ integer pointer, float pointer) အပေါ်မူတည်ပြီး data type ရဲ. size အတိုင်း တိုးပါလိမ့်မယ်။ ဒါဟာ semantic ပါ။
Programmer တော်တော်များများက syntax တူတာနဲ. Semantic ပါလိုက်တူမယ်လို. ထင်ကြပါတယ်။ ဒါဟာ အမှားကြီးမှားပါတယ်။ ဥပမာ C,Java,C++,C# မှာရှိတဲ့ logical OR operator (||) နဲ. JavaScript မှာရှိတဲ့ logical OR operator ဟာ syntax အရတော့ double vertical bar( || ) ပေမဲ့ semantic အရတော့ language တွေကြားထဲမှာ ကွာပါတယ်။ ဥပမာ C,C++ က || နဲ. Java က || ဆိုရင် ဘာကွာလဲမေးရင် C,C++ မှာ Boolean data type ကို (0 ကို false လို.သတ်မှတ်ပြီး 0 မဟုတ်တာ မှန်သမျှကို true လို.သတ်မှတ်တဲ့အတွက်) logical OR operator( || ) မှာလိုိက်နိုင်တဲ့ operand တွေက Boolean data type တင်မကပဲနဲ. တခြား data type တွေပါ (ဥပမာ integer type) တွေပါလိုက်လို.ရနိုင်ပါတယ်။ Java,C# လို strongly typed ဖြစ်တဲ့ programming language တွေမှာကျတော့ logical OR operator ( || ) ရဲ. Operand တွေကို Boolean data type တွေပဲဖြစ်ရမယ်လို. သတ်မှတ်ထားပါတယ်။ logical OR operator ရဲ. Result type ကလဲ Boolean type ပဲဖြစ်ပြီး အဖြေဟာ true သို.မဟုတ် false ဖြစ်မှာပါ။ JavaScript မှာတော့ အဲ့လိုမဟုတ်ပါဘူး dynamic type programming language ဖြစ်တဲ့အတွက် type coercion ( implicit type conversion )ပေးထားတဲ့အတွက် || operator ရဲ. Operand တွေမှာ Object, literal , function, variable ကြိုက်တာအကုန်လိုက်လို.ရပါတယ်။
ဥပမာ အောက်ပါ JavaScript statement မှာဆိုရင်
window.MyNameSpace = window.MyNameSpace || {};
semantic အရ window.MyNameSpace သည် false ဖြစ်စေနိုင်သောတန်ဖိုး တခုခုဖြစ်ခဲ့ရင် window.MyNameSpace ထဲကို {} (Object Literal) တခုထဲ့ပေးမှာပါ။ ဒါဟာ ဘာကြောင့်လဲဆိုရင် JavaScript ရဲ. || operator ရဲ. Semantic ကြောင့်ပါ။ || operator ရဲ. Semantic ကဒီလိုပါ။ တကယ်လို. ပထမဆုံး first operand သည် true ကို evaluate လုပ်နိုင်သောတန်ဖိုးတခုခုဖြစ်ရင် first operand ကိုပြန်ပါ။ ဒါမှမဟုတ်ရင် second operand ကို ပြန်ပါဆိုတဲ့ menaing ပါ။
Semantic ကို formal method တွေအနေနဲ.ဆိုရင် axiomatic semantic, denotaional semantic တွေနဲ.သုံးပြီး ဖော်ပြကြပါတယ်။
Pragmatic
Pragmatic ဆိုတာက language တခုရဲ. Concept ,idiom တွေကို မှန်မှန်ကန်ကန် အသုံးပြုခြင်းကိုဆိုလိုတာပါ။ ဥပမာ ကျွန်တော်တို.က multi value decision ဆိုရင် switch ကိုသုံးတာ if ကိုသုံးတာထက်ပိုသင့်တော်ပါတယ်။ C မှာဆိုရင် thinking အရ functional decomposition( function လေးတွေ ခွဲခွဲပြီး ရေးရတာ မျိုး) နဲ.စဉ်းစားရမှာဖြစ်ပြီး Java,C++,C# မှာ functional decomposition သုံးတယ်ဆိုရင် မှားတယ်လို.ပြောရမှာပါ။ သူတို.က OO language ဖြစ်တဲ့အတွက် Object, message passing ဆိုတဲ့ concept မျိုးနဲ.ပဲစဉ်းစားရမှာပါ။ နောက်တခုက language construct တွေကို သူ.နေရာနဲ.သူ ဘာကြောင် ဘယ်နေရာ ဘယ်လိုသုံးသင့်တယ်ဆိုတာ သဲသဲကွဲကွဲ ကွဲကွဲပြားပြား သိဖို.ပါ။ ဥပမာ Interface နဲ. Abstract ကို ဘယ်နေရာ ဘယ်သူ.ကိုသုံးသင့်တယ်ဆိုတာမျိုးပါ။ နောက်ပိုင်း pragmatic အရဆိုရင်တော့ design pattern တွေပါ ပါလာပါတယ်။ ဘယ်လို design problem မျိုးအတွက်ဆို ဘယ်လို design pattern မျိုးသုံးသင့်တယ် ၊ဘယ်language အတွက်ဆို ဘယ် design pattern နဲ.ရေးသင့်တယ်ဆိုတာမျိုးကို pragmatic လို.ဆိုချင်တာပါ။ Framework တို. API တို.ကိုလဲ Pragmatic ထဲမှာ ထည့်သွင်းရမှာပါ။
ဥပမာ Array တခုထဲက max တန်ဖိုးကိုလိုချင်ရင် JavaScript မှာဒီလိုလေးရေးယုံပါပဲ.
var arr = [20,4,100, 120, -22];
var max = Math.max.apply( Max, arr );
pragmatic ဆိုတာ သူ. Language feature ကိုပိုင်ပိုင်နိုင်နိုင် သူ.နေရာနဲ.သူ အသုံးချတတ်တာကို ဆိုချင်တာပါ။
အထက်ပါ Syntax, Semantic နဲ. Pragmantic ကို ဟန်ချက်ညီညီ သိမှသာလျှင် programming language တခုကိုကျွမ်းကျွမ်းကျင်ကျင်နိုင်နိုင် နင်းနင်း ရေးသားနိုင်မှာဖြစ်ပါတယ်။
Original link