Sunday, April 17, 2016

c හා c++ ප්‍රෝග්‍රැමිං - 1


හැඳින්වීම

කොම්පියුටර් ප්‍රෝග්‍රැමිං යනු සරල විනෝදාංශයක සිට අතිසංකීර්ණ ඉංජිනේරුමය කටයුත්තක් දක්වා විශාල පරාසයක විහිදී පවතින්නකි. එනිසාම පාසල් ළමුන්ගේ සිට මෘදුකාංග ඉංජිනේරුවන් දක්වා විවිධ වයස් හා බුද්ධි මට්ටම්වල අය ප්‍රෝග්‍රැමිං කරනවා. කොම්පියුටර් ප්‍රෝග්‍රැමිං මේ වන විට මෘදුකාංග ඉංජිනේරුවේදය (software engineering) යන නමින් ඉංජිනේරුමය ක්ෂේත්‍රයක් බවටද පත්ව තිබෙනවා. මෙම පාඩම් මාලාවේ අරමුණ C හා C++ යන ප්‍රෝග්‍රැමිං ලැංවේජ් දෙක ඉගැන්වීමයි. එකක් දැන සිටි විට, අනෙක ඉතා පහසුවෙන් උගත හැකියි. ඊට හේතුව C++ යන්න සාදා තිබෙන්නේ C පදනම් කරගෙනයි.

සටහන
සොෆ්ට්වෙයාර් ඉංජිනියරිං වේවා වෙනත් ඉංජිනේරු ක්ෂේත්‍රයක් වේවා, යම් අධ්‍යන ක්ෂේත්‍රයක් ඉංජිනේරුවේදයක් මට්ටමට සැලකීමට යම් යම් කොන්දේසි ගණනාවක් සැපිරිය යුතු වෙනවා. පළමුව එම අධ්‍යන ක්ෂේත්‍රය විද්‍යාත්මක ක්‍රමවේදයක් විය යුතුය (ඒ කියන්නේ කිසිදු කලා ක්ෂේත්‍රයක් හෝ විද්‍යා/ගණිතය මත පදනම් නොවූ කිසිවක් ඉංජිනේරුවේදයක් බවට පත් විය නොහැකියි). මෙහිදී, යමක් කිරීමට පියවරින් පියවර දැක්විය හැකි ක්‍රමවේද මිස පුද්ගලයාගේ නිර්මාණශීලිබවින් ලබා ගන්නා විසඳුම් නොවිය යුතුය. උදාහරණයක් වශයෙන් කවියක් නිර්මාණය කිරීමට අවශ්‍ය වන්නේ ක්‍රමවේද නොව, නිර්මාණශීලිත්වයයි; එහෙත් පාරක් සෑදීමේදී නිර්මාණශීලිත්වය නොව නිශ්චිත ක්‍රමවේදයි අවශ්‍ය වන්නේ. තවද ඉංජිනේරුවේදයක් වීමට නම්, සැලකිය යුතු දැනුම් පද්ධතියක්/සම්භාරයක් ඒ සතු විය යුතුය. ඒ නිසාම එය ඉගෙනීමට අවශ්‍ය කෙනෙකුට ඒ සඳහා අවුරුදු කිහිපයක් ගත කිරීමට සිදු වේ. තවද, එය රජය විසින් පිළිගත් ආයතනයකින් ඉගෙන ගත යුතුය.

එහෙත් ඔබ දැක ඇති සමහර ආයතන විසින් මාස හයේ සොෆ්ට්වෙයාර් ඉංජිනේරු පාඨමාලා පවත්වනවා. ඒ කියන්නේ එම ආයතන සිදු කරන්නේ වංචාවක්. යම් ප්‍රෝග්‍රැමිං ලැංවේජ් එකක් ඉගෙන ගත් පලියටත් සොෆ්ට්වෙයාර් ඉංජිනේරුවෙක් විය නොහැකියි. ඒ සඳහා තවත් බොහෝ දේවල් ඉගෙනීමට අවශ්‍ය කරනවා. එහෙත් ප්‍රෝග්‍රැමිං ලැංවේජ් එකක් හෝ කිහිපයක් හොඳින් දැන ගැනීම සොෆ්ට්වෙයාර් ඉංජිනේරුවෙකු වීමට අත්‍යවශ්‍යම කොන්දේසියද වන බව මතක තබා ගන්න.

පරිගණක ක්ෂ්‍රෙත්‍රයේ ඕනෑම පැතිකඩක් ඉගෙනීමේදී, පොදුවේ පරිගණක ගැන දැනගත යුතුය. පරිගණකයක් යනු කුමක්ද, එහි මූලිකාංග මොනවාද, එම මූලිකාංග අතර ඇති අන්තර්-ක්‍රියාකාරිත්වය කුමක්ද ආදී ලෙස යම් දැනුමක් ලබා ගත යුතුය. විශේෂයෙන් ප්‍රෝග්‍රැමිං ඉගෙන ගන්නා කෙනෙකුට එය අත්‍යවශ්‍ය වේ යැයි මා කල්පනා කරනවා. මෙම පාඩම් මාලාවේ පළමු අතිරේකය කියවා ඔබට එම දැනුම තිබේදැයි සොයා බලන්න.

තවද, යම් ප්‍රෝග්‍රැමිං ලැංවේජ් එකක් ඉගෙනීමට පෙර, පොදුවේ කොම්පියුටර් ප්‍රෝග්‍රැමිං ගැන ගත යුතු කරුණුද පළමුව ඉගෙනගත යුතු වෙනවා. ඇත්තටම මෙවැනි කරුණු නිසාම තමයි, "නිකංම ප්‍රෝග්‍රැමිං" යන්න සොෆ්ට්වෙයාර් ඉංජිනියරිං බවට පත්ව තිබෙන්නෙත් (නිකංම කේක් ගෙඩියට අයිසිං දැම්ම වගේ). කාලාන්තරයක් තිස්සේ විවිධාකාරයේ ප්‍රෝග්‍රැමිං සිදු කර ඉන් උගත් වැදගත් කරුණු තමයි න්‍යායන් බවට පත් කරගෙන අද අප ඉගෙන ගන්නේ. මුල් අවදියේ සිටි ප්‍රෝග්‍රැමර්ස්ලා සිදු කළ මෝඩ වැඩ, ඔවුන් ඉන් උගත් පාඩම්, ඉතා ඵලදායි විදියට ප්‍රෝග්‍රැමිං සිදු කරන ආකාර ආදිය මෙලෙස ඔබ ඉගෙන ගත් විට, එම වැරදි ඔබ විසින් සිදු නොවනවා පමණක් නොව, ඉතාම ගුණාත්මක තත්වයේ පරිගණක වැඩසටහන්ද ඔබ පහසුවෙන් නිර්මාණය කරාවි. පාඩම් මාලාවේ දෙවැනි අතිරේකයේ එවැනි පොදුවේ වැදගත් කරුණු කිහිපයක් පැහැදිලි කර ඇත.

ප්‍රෝග්‍රැමිං යනු…

ඔබ දැන් දන්නවා පරිගණකය යනු මූලික කොටස් 3කින් සෑදුණු පද්ධතියක් - හාඩ්වෙයාර්, සොෆ්ට්වෙයාර්, ලයිව්වෙයාර්. හාඩ්වෙයාර් මත/තුලින් ලයිව්වෙයාර් විසින් යම් යම් වටිනා දේවල් (චිත්‍ර ඇඳීම, ගණන් සෑදීම, වීඩියෝ සංස්කරණ සිදු කිරීම, යන්ත්‍ර සූත්‍ර මෙහෙයවීම ආදී දේවල්) සිදු කළ හැකියි. මෙවැනි වටිනා දේවල් සිදු කිරීමට ලයිව්වෙයාර් විසින් හාඩ්වෙයාර්වලට නිසි ක්‍රමවත් උපදෙස් මාලාවක් ලබා දිය යුතුය. මෙම උපදෙස් මාලාව "ක්‍රමලේඛය" (program) යන නමින් හැඳින්වේ. ඇප් (app), ඇප්ලිකේෂන් (application), සොෆ්ට්වෙයාර්, පරිගණක වැඩසටහන් ආදී නම්වලින්ද හැඳින්වෙන්නේ ප්‍රෝග්‍රෑම් තමයි. ඉතිං මෙවැනි ප්‍රෝග්‍රෑම් සෑදීම "ක්‍රමලේඛ සෑදීම" (programming) ලෙස හැඳින්වෙනවා.

ප්‍රෝග්‍රැමිං සිදු කරන කෙනා programmer වේ. ප්‍රෝග්‍රැමර් පිළිගත් නිසි අධ්‍යාපනයක් නිම කර ඇත්නම්, ඔහුව මෘදුකාංග ඉංජිනේරුවා (software engineer) ලෙසද හැඳින්විය හැකියි. ප්‍රෝග්‍රැමිං කිරීමට යම් යම් මෙවලම් අවශ්‍ය වේ. වඩුවෙකුට ඔහුගේ කටයුතු සිදු කිරීමට කියත්, මිටි, යතුකැට ආදී උපාංග/මෙවලම් රැසක් අවශ්‍ය කරනවා වාගේ, ප්‍රෝග්‍රැමර් කෙනෙකුට පරිගණකයක් හා computer programming language එකක් අවශ්‍ය කරනවා. ඇත්තටම ප්‍රෝග්‍රැමර් කෙනෙකුගේ අවශ්‍යතා ඉතාම අඩුය. එනිසාම පරිගණකයක් ඇති ඕනෑම කෙනෙකුට කිසිදු වියදමක් නැතිවම එය සිදු කළ හැකියි.

ස්වාභාවික භාෂා හා කෘත්‍රිම භාෂා

කොම්පියුටර් ප්‍රෝග්‍රැමිං ලැංවේජ් එකක් යනු දළ වශයෙන් ඔබ අප එදිනෙදා භාවිතා කරන ස්වාභාවික භාෂා (natural language) වැනිමය. සිංහල, ඉංග්‍රීසි වැනි ස්වාභාවික භාෂාවකින් සිදු කරන්නේ පුද්ගලයන් අතර අදහස් හුවමාරු කිරීමයි. එය සම්මතයකි (standard). එනම්, “පුටුව" යන වචනය ඇසෙන විට, සිංහල දන්නා හැමෝම දන්නවා ඉන් හැඟවෙන දේ. එහෙත් සුද්දෙකුට පුටුව යන ශබ්දය ඇසුණු විට ඔහුට කිසිවක් නොතේරේවි. ඊට හේතුව පුටුව යනු අහවල් දේට කියන ශබ්දය යැයි අප විසින් "සම්මත" කර ගෙන ඇතත්, එම සම්මතය සුද්දා ඉගෙන ගෙන නැත. සුද්දා එම දේට "චෙයාර්" යන ශබ්දය සම්මත කර ගෙන ඇත. තවත් අය (එනම් වෙනත් භාෂා) විසින් ඒ දේටම තවත් ශබ්ද සම්මත කර ගෙන ඇත. මෙම සම්මත කර ගැනීම අද ඊයේ සිදු වූවක් නොවේ. උදාහරණයක් ලෙස, පුටුව යන ශබ්දය සම්මත කරගෙන තිබෙන්නේ ඔබ අප ඉපදෙන්නටත් පෙරය. අපේ ආච්චිලා සීයලා ඉපදෙන්නටත් පෙරය. අවුරුදු සිය දහස් ගාණකට පෙරය. මෙලෙස භාෂාවක වචන හා රීති සෑදීම ස්වාභාවිකව අවුරුදු දහස් ගණනක් මුලුල්ලේ සිදු වූවක් නිසා, සිංහල, ඉංග්‍රිසි, දෙමළ වැනි භාෂා ස්වාභාවික භාෂා වේ. ස්වාභාවික භාෂා ඉතාම සංකීරණයි. එතරම් සංකීර්ණ නිසානෙ අපට ඉංග්‍රීසි හෝ වෙනත් භාෂාවක් ඉගෙනීමට අවුරුදු ගණනාවක්ම ගත වන්නෙත්.

ඉතිං එවැනි බරපතල සංකීර්ණ භාෂාවක් යොදාගෙන අපට පරිගණකය වැනි යන්ත්‍රකයකට උපදෙස් දිය නොහැකියිනෙ. ඒ සඳහා ඉතාම සරල කරපු භාෂා නිර්මාණය කරගෙන තිබෙනවා. මෙවැනි භාෂාවක් අවශ්‍ය නම් කෙනෙකුට දවස් කිහිපයකින් ඉගෙන ගත හැකියි. ඔව්, එ්වා එතරම්ම සරලයි. ඔබ දැනටමත් යම් කොම්පියුටර් ප්‍රෝග්‍රැමිං ලැංවේජ් එකක් දන්නවා නම්, තවත් ලැංවේජ් එකක් සමහරවිට පැය කිහිපයකින් වුවද ඉගෙන ගැනීමට හැකියි. බොහෝ අය ප්‍රෝග්‍රැමිං ලැංවේජ් කිහිපයක් ඉගෙන ගන්නේ මෙම පහසුව නිසාය. එනිසා, මෙවැනි භාෂා කෘත්‍රිම භාෂා (artificial language) ලෙස හැඳින්වෙනවා.

ස්වාභාවික භාෂාවක් ගතහොත් එහි මූලික කොටස් දෙකක් ප්‍රමුඛ වේ. ඒවා නම් වචන හා ව්‍යාකරණයි. එලෙසම ප්‍රෝග්‍රැමිං ලැංවේජ් එකකත් එම ලක්ෂණ දෙක එලෙසම දක්නට ලැබෙනවා (එය පුදුම වන්නට කරුණක් නොව මොකද කෘත්‍රිම භාෂා නිර්මාණය කරන්නේද ස්වාභාවික භාෂා අනුකරණය කරමින්ය). එහෙත් ප්‍රෝග්‍රැමිං ලැංවේජ් එකකදී වචන වෙනුටව reserved words ලෙසද, ව්‍යාකරණය වෙනුටව semantics ලෙසද ව්‍යවහාර වේ. දළ වශයෙන් reserved words යන්න keywords ලෙසද හැඳින්වෙනවා. ස්වාභාවික භාෂාවක නම්, වචන ලක්ෂ ගණනක් ඇතත්, ප්‍රෝග්‍රැමිං ලැංවේජ් එකක ඇත්තේ කීවර්ඩ්ස් 30ක් 40ක් පමණය. එලෙසම, ස්වාභාවික භාෂාවක ව්‍යාකරණය ඉතා සංකීරණ හා බහුල වන අතර, ප්‍රෝග්‍රැමිං ලැංවේජ් එකක සෙමෙන්ටික්ස් ඉතාම සරල හා ස්වල්පයකි තිබෙන්නේ. ඉතිං, කීවර්ඩ්ස් හා සෙමැන්ටික්ස් ඉගෙනීමෙන් ඔබට ඕනෑම ප්‍රෝග්‍රැමිං ලැංවේජ් එකක් උගත හැකියි පහසුවෙන්ම.

භාෂා පරම්පරා

අද වන විට, ප්‍රෝග්‍රැමිං ඉතා දියුණු මට්ටමකට පත්ව ඇතත් එහි අද දක්වා විකාශය බැලූ විට එහි ආරම්භය ඉතාම ප්‍රාථමකයි. මුල්ම කාලයේ ප්‍රෝගැමිං සෑදුවේ 1 හා 0 යන සංඛේත දෙක පමණක් උපයෝගී කරගෙනයි. 1 හා 0 යන සංඥා දෙකෙන් පමණක් යම් යම් දේවල් නිරූපණය කරන විට, ඒවාට තාක්ෂණ ලෝකයේදී ද්වයාංගික (binary) යන නම භාවිතා කෙරෙනවා (එයම ඩිජිටල් ලෙස හැඳින්විය හැකියි). එනිසාම මීට බයිනරි ප්‍රෝග්‍රැමිං (binary programming) යන නම පටබැඳුණා. එකල පරිගණක අද තිබෙන කැල්ක්‍යුලේටරයක් තරම්වත් ප්‍රබල නැති අතර, හැම අතින්ම පරිගණක තාක්ෂණය ළඳුරු වියේ පසුවිය. ඉතිං, එවැනි "ළඳුරු" පරිගණක සඳහා සාදපු ප්‍රෝග්‍රෑම්ද ඉතා කුඩා හා සරල විය. එවැනි සීමිත හා ප්‍රාථමික අවශ්‍යතා නිසා, බයිනරි ප්‍රෝග්‍රැමිං ගැලපුණි. බයිනරි ක්‍රමයෙන් මෙලෙස පළමු ප්‍රෝග්‍රෑම් එක සාදපු පුද්ගලයා Ada Lovelace ලෙස හඳුනාගෙන තිබෙනවා. ඇය ඒ අනුව ලොව ප්‍රථම ප්‍රෝග්‍රැමර් වේ.



පහත දැක්වෙන්නේ එවැනි බයිනරි ප්‍රෝගැම් එකකි. බලන්න එහි සියල්ල 1 හා 0 වලින් පමණක් ඇත. ඔබට සියල්ල 1 හා 0 ලෙස පෙනුනත්, ඇත්තටම මෙම 1 හා 0 වලින් යම් යම් සංඛේතාත්මක තේරුම් සාදා ගත හැකියි. උදාහරණයක් ලෙස, යම් සංඛ්‍යා දෙකක් එකතු කිරීම (Add) සඳහා 10001111 යන බයිනරි කෝඩ් එක සම්මත කරගෙන ඇතැයි සිතන්න. එවිට “10001111 00000001 00000010” යන කුඩා කෝඩ් එකෙන් කියන්නේ 1 (00000001) හා 2 (00000010) යන සංඛ්‍යා දෙක එකතු කරන ලෙසයි. එලෙසම 10001110 යන්නෙන් වැඩි කරන්න (Multiply) යන ගණිත කර්මය සංඛේතවත් කරනවා යැයි සිතමු. එවිට “10001110 00000001 00000010” යන්නෙන් දැන් කියන්නේ 1 හා 2 එකිනෙකට වැඩි කරන්න කියාය. බයිනරි ප්‍රෝග්‍රෑම්වල තිබෙන 1 හා 0 වලින් අන්න එවැනි සංඛේතාත්මක ක්‍රමයකින් තමයි පරිගණකයට උපදෙස් දෙන්නේ. එය ඉතා පහසුයි නේද?

 
පරිගණක තාක්ෂණය සීඝ්‍රයෙන් දියුණු විය. ඊට හේතුව අර්ධසන්නායක තාක්ෂණය (semiconductor technology) දියුණු වීමයි. කපාට වැනි විශාල ඉලෙක්ට්‍රොනික් උපාංග වෙනුවට දැන් සෙමිකන්ඩක්ටර් ට්‍රාන්සිස්ටර් හා අයිසී බිහි විය. කාමර තරම් අති විශාල පරිගණක වෙනුවට කුඩා පෙට්ටි තරම් පරිගණක නිර්මාණය විය. ප්‍රමාණය කුඩා වීම පමණක් නොව, පරිගණකයේ වේගය වැඩි විය; මතක ධාරිතාව වැඩි විය; විවිධාකාරයේ අමතර උපාංග පරිගණකයට සම්බන්ධ විය. ඉතිං තවදුරටත් බයිනරි ප්‍රෝග්‍රැමිංවලින් වැඩකටයුතු කරගෙන යෑමට නොහැකි තත්වයක් උදා විය. ඉතා සරල හා ඉතා කුඩා ප්‍රෝග්‍රෑම්වලට බයිනරි ඉතාම කාර්යක්ෂම හා පහසු වුවත්, ප්‍රෝග්‍රෑම් විශාල හා සංකීර්ණ වන විට, බයිනරි ප්‍රෝග්‍රැමිං සිදු කිරීම දැලි පිහියකින් විශාල ගසක් කපනවා වැනිය. මෙනිසා බයිනරි ප්‍රොග්‍රැමිං වෙනුවට ඇසෙම්බ්ලි (assembly) නම් ප්‍රොග්‍රැමිං ක්‍රමය කරලියට පැමිණුනා.

ඇසෙම්බ්ලි ප්‍රෝග්‍රැමිං යනු බයිනරි ප්‍රෝග්‍රැමිංවලම දියුණු අවස්ථාවකි. පෙර විස්තර කළ ලෙසම 10001110, 10001111 වැනි බයිනරි කේත (binary code) බැලූබැල්මට සරලයි. එක් එක් කේතය මතක තබා ගත හැකියි. පරිගණකයකින් සිදුකර ගත හැකි රාජකාරි ප්‍රමාණය අඩුයි නම්, ඒ කියන්නේ පරිගණකයට දිය හැකි උපදෙස ප්‍රමාණයත් අඩුයි කියන එකනෙ. ඉතිං මෙවැනි උපදෙස් (instructions හෝ commands හෝ statements) තිබෙන්නේ කුඩා ප්‍රමාණයක් නම්, බයිනරි කේතත් මතක තබා ගැනීමට තිබෙන්නේ ටිකකි. එහෙත් දැන් පරිගණක තාක්ෂණය දියුණු වී ඇත. ඊට ලබා දිය හැකි උපදෙස් ප්‍රමාණය සිය ගණනකි. ඉතිං එතරම් විශාල උපදෙස් ප්‍රමාණයක බයිනරි කේත මතක තබා ගැනීම කොතරම් අපහසුදැයි සිතා බලන්න. ඊට පිළියමක් ලැබුණි. ඒ තමයි ඒ සියලු උපදෙස් 10001110 වැනි බයිනරි කේත ක්‍රමයට නොලියා ADD, MULTIPLY වැනි ඉංග්‍රිසි වචනවලින් ලිවීමයි. 10001110 වැනි කේතයක් මතක තබා ගන්නද පහසු, ADD වැනි කෙටි වචනයක් මතක තබා ගන්නද පහසු? එහෙත් ඇත්තටම තාමත් යටින් ක්‍රියාත්මක වන්නේ බයිනරි කේත ක්‍රමයම තමයි. එ් කියන්නේ ඔබ ඉංග්‍රිසි වචනවලින් ලියන උපදෙස් යම් පරිවර්තකයක් විසින් බයිනරි ක්‍රමයට පත් කරනවා. උදාහරණයක් වශයෙන්,

Add 00000001 00000010 → 10001111 00000001 00000010

සටහන
මිනිස් මොලය සංඛ්‍යා මතක තබා ගන්නට දක්ෂ නැත. එනිසානෙ වර්ෂ, ටෙලිෆෝන් අංක වැනි ඉලක්කම්වලින් නිරූපණය කරන දත්ත මතක තබා ගන්නට බැරි. මේ නිසාම තමයි දැන් ෆෝන්වලට ෆෝන්බුක් එකක් තිබෙන්නේ. ඔබට ඉලක්කම මතක නැති වුවත්, කෙටි නමක් පහසුවෙන් මතක සිටිනවා. එනිසා ඔබ ටෙලිෆෝන් නම්බරයක් ෆෝන්බුක් එකේ යම් නමක් සමග ගබඩා කර ගන්නවා. දැන් ඔබ නොම්බරය මතක තබා ගන්නවා වෙනුවට නමයි මතක තබා ගන්නේ. එම නමට කෝල් එක ගන්න විට ෆෝන් එක විසින් ඔබට නොදැනී එම නමට අදාල නම්බරය ආදේශ කරනවා. ඒ අනුව, ඇසෙම්බ්ලි ලැන්වේජ් එක හරියට ෆෝන්බුක් එක වගේ. ඔබ විසින් දෙන ලද කමාන්ඩ්ස් ඔබට නොදැනී යම් පරිවර්තකයක් විසින් බයිනරි කේතවලට හරවනවා.

පහත දැක්වෙන්නේ එවැනි ඇසෙම්බ්ලි ප්‍රෝග්‍රෑම් එකක කොටසකි (එහි ; යන ලකුණට පසුව තිබෙන කොටස් අවශ්‍ය නැත). සාමාන්‍යයෙන් ඇසෙම්බ්ලි කේතවල සංඛේත ඉංග්‍රිසි අකුරු 3කින් (හෝ 4කින්) යුක්ත වන අතර, ඒවා එම කමාන්ඩ්වල ඉංග්‍රිසි වචනයෙන් මුල් අකුරුවලිනුයි සාදා ගන්නෙත්. උදාහරණය ලෙස Add යනු එකතු කිරීම වන අතර, Mul යනු ගුණ කිරීම (multiply) වේ. ඇසෙම්බ්ලි කේතවල හමුවන මෙවැනි Add, Mul වැනි වචනවලට mnemonics කියා කියනවා (නෙමොනික්ස් යනු යමක් මතක තබා ගන්නට යොදාගන්නා කෙටි ක්‍රමය යන තේරුම සහිත ඉංග්‍රිසි වචනයයි). ඇසෙම්බ්ලි නෙමොනික්ස් බයිනරි කේතවලට හරවන පරිවර්තකය (translator) හඳුන්වන්නේ assembler ලෙසයි.



බයිනරි ප්‍රෝග්‍රැමිංවල පරිවර්තක තිබුණේ නැත. ඊට හේතුව බයිනරි ප්‍රෝග්‍රෑම් එක ලියා තිබෙන්නේ බයිනරි කේතවලින්වීමයි. ඩිජිටල් ඉලෙක්ට්‍රෝනික්ස් වැඩ කරන්නේ බයිනරි ක්‍රමයටයි. ඉතිං බයිනරි කේත කෙලින්ම කොම්පියුටර් හාඩ්වෙයාර්වලට (ප්‍රොසෙසර් එකට) තේරෙනවා. එහෙත් ඇසෙම්බ්ලිවලදී යොදා ගන්නේ ඉංග්‍රිසි අක්ෂරවලින් සාදා තිබෙන කේතයි. ප්‍රොසෙසර් එකට ඒවා නොතේරේ. ඉතිං, එම නොතේරෙන කේත තේරෙන බයිනරි කේත බවට පරිවර්තනය කිරීමට අවශ්‍යයි. අදත් හෙටත් නිපදවන හැම පරිගණකයක් සඳහාම කොතරම් උසස් හා සංකීර්ණ ප්‍රෝග්‍රෑම් සෑදුවත්, අවසානයේදී ඒ සියලු ප්‍රෝග්‍රෑම් බයිනරි කේතවලට හැරවිය යුතුය. ඒ සඳහා පරිවර්තක ඇත (මොහොතකින් මේ ගැන වැඩි විස්තර සලකා බලමු).

බයිනරි ප්‍රෝග්‍රැමිං මේ අනුව පළමු පරම්පරාවේ ප්‍රෝග්‍රැමිං ලැංවේජ් (first generation programming language) ලෙසත්, ඇසෙම්බ්ලි ප්‍රෝග්‍රැමිං දෙවන පරම්පරාවේ ප්‍රෝග්‍රැමිං ලැංවේජ් (second generation programming language) ලෙසත් හැඳින්වෙනවා.

පරිගණක තාක්ෂණය තව තවත් දියුණුවට පත්විය. එවිට ඉබේම ඉන් කරගත හැකි වැඩකටයුතු සංකීර්ණ විය. සිතාගත නොහැකි දේවල් අද පරිගණික විසින් සිදු කරන බව ඔබ ඕනෑ තරම් අත්දැක ඇති. ඒ කියන්නේ ප්‍රෝග්‍රැමිං තවදුරටත් සංකීර්ණ විය. ඇසෙම්බ්ලි පවා ප්‍රමාණවත් නොවීය. ඊටත් වඩා දියුණු ක්‍රමවේද ඇතුලත් කොට තුන්වන පරම්පරාවේ ප්‍රෝග්‍රැමිං ලැංවේජ් ගණනාවක් බිහිවිය. BASIC, Pascal, Fortran, COBOL, C යනු ඊට උදාහරණ කිහිපයකි.

ඇත්තටම මෙම තෙවන පරම්පරාවේ භාෂාවන් බිහි කර ගැනීමට අතීතයේ ප්‍රෝග්‍රැමිං සිදු කළ විට ලබා ගත් දැනුම ඉවහල් විය. පහසුවෙන් හා ඉක්මනින් ප්‍රෝග්‍රැමිං කිරීමේ ක්‍රම ඊට ඇතුලත් විය. උදාහරණයක් ලෙස, බයිනරි හා ඇසෙම්බ්ලිවලදී යම් වැඩක් කිරීමට පියවරවල් (එනම් උපදෙස්) 50ක් යම් පිලිවෙලකට කිරීමට අවශ්‍ය වූවා යැයි සිතමු. එවිට එම උපදෙස් එම පිළිවෙලට ලිවූ විට අවශ්‍ය කාරණය සිදු විය. එම ක්‍රියාවලියම නැවත නැවත සිදු කිරීමට අවශ්‍ය වූ විට, නැවත නැවතත් එම උපදෙස් සියල්ල එලෙසම ලිවීමට අවශ්‍ය විය. එනම්, එම ක්‍රියාවලිය 10 පාරක් කරන්නට අවශ්‍ය විට, එකම දේ 10 සැරයක් ලිවිය යුතු වූවා. එහෙත් තෙවැනි පරම්පරාවේ භාෂා විසින් ඊට යම් උපක්‍රමයක් හඳුන්වා දුන්නා. එනම්, නැවත නැවත ක්‍රියාත්මක කළ යුතු යම් උපදෙස් මාලාවක් එක් වරක් පමණක් නිසි පිළිවෙලට ලියා ඉන්පසු එම කෝඩිං "සෙට් එකට" යම් නමක් ලබා දෙනවා. දැන් දෙවැනි තෙවැනි ආදී ඕනෑම වාර ගණනක් එය ක්‍රියාත්මක කිරීමට අවශ්‍ය වූ විට, නැවත නැවත පෙර සේ සම්පූර්ණ කේත/උපදෙස් ලිය ලියා ඉන්නේ නැතිව, නිකංම අර ලබා දුන් නම පමණක් ලියනවා. බලන්න එය කොතරම් පහසුවක්ද? (මෙම උපක්‍රමය ෆන්ක්ෂන්/සබ්රූටින්/ප්‍රොසීඩියර් වැනි නමකින් ලැංවේජ් එක තුළදී හැඳින්වේ.) මෙවැනි වටිනා ලක්ෂණ/උපක්‍රම ගණනාවක්ම ඇතුලු කරලා තමයි තෙවැනි පරම්පරාවේ භාෂා සාදා තිබෙන්නේ.

භාෂා පරිවර්තක - ඉන්ටර්ප්‍රීටර් හා කම්පයිලර්

මෙම තෙවැනි පරම්පරාවේ භාෂාවලද පරිවර්තකයක් තිබිය යුතුමයි (ඒවා බයිනරි කේත බවට පරිවර්තනය කිරීමට). දෙයාකාරයේ පරිවර්තක මෙහිදී හමුවෙනවා. එකක් නම්, interpreter (ඉන්ටර්ප්‍රීටර්) වන අතර, අනෙක compiler (කම්පයිලර්) ලෙස හැඳින්වෙනවා. මේ දෙකෙන්ම අවසානයේදී බයිනරි කේතවලට පරිවර්තනය කළත්, එය සිදු කරන ආකාරයේ වෙනසක් තිබෙනවා.

කම්පයිලර් එකකදී, ප්‍රෝග්‍රෑම් එක ලියූ පසු, එම කෝඩිං ටික කම්පයිලර් එකෙන් පරිවර්තනය කළ යුතු වෙනවා (මෙම පරිවර්තනය කිරීම compile කරනවා යනුවෙන් හැඳන්වෙනවා). ඒ කියන්නේ ඔබ භාවිතා කරන ප්‍රෝග්‍රැමිං ලැංවේජ් එකට ගැලපෙන කම්පයිලර් එකක් පරිගණකයේ තිබිය යුතුයි (සියලුම කම්පයිලර් නොමිලේ නීත්‍යානුකූලව ලබා ගත හැකියි). කම්පයිල් කළාට පසුව ලැබෙනවා පරිගණකයේ "රන්" කළ හැකි ෆයිල් එකක්. මෙවැනි ෆයිල් executable file ලෙස හැඳින්වෙනවා. සාමාන්‍යයෙන් එවැනි එක්සික්‍යුටබල් ෆයිල්වල නමෙහි කෙලවර exe යන ෆයිල් එක්ටෙන්ෂන් එක දක්නට ලැබේවි. එක්සික්‍යුටබල් ෆයිල් එකක් මත ඩබ්ල් ක්ලික් කළ විට (එනම් එය රන් කරන විට), වෙනත් සොෆ්ට්වෙයාර් එකක උපකාරය නොමැතිව එය විසින්ම එය ඕපන්/රන් වේ. එනම්, තමන් විසින්ම තමන්ව කෙලින්ම රන් කර ගනී. executable යන්නෙහි තේරුම එයයි.

ඉන්ටර්ප්‍රීටර් එකකදී, පරිගනක ප්‍රෝග්‍රෑම් එක ලියූ පසු, කෙලින්ම රන් කළ හැකියි. එහෙත් ඔබ දන්නවා පරිගණකයට තේරෙන්නේ බයිනරි කේත. එනිසා ඉංග්‍රිසි වචන සහිත කොඩිං එක එකපාරටම රන් වෙන්නට බැරි නිසාත්, එම ප්‍රෝග්‍රෑම් එක බයිනරි කෝඩිං බවට මීට පෙර පරිවර්තනය නොකළ නිසාත්, ප්‍රෝග්‍රෑම එක රන් වන මොහොතේම එය පරිවර්තනය වෙමින් තමයි රන් වන්නේ. මෙම හපන්කම සිදු කිරීමට නම්, අදාල ලැංවේජ් එකට ගැලපෙන ඉන්ටර්ප්‍රීටර් එකක් පරිගණකය තුළ ස්ථාපනය කරගෙන තිබිය යුතුය.

c හා c++ යන භාෂා දෙකම කම්පයිලර් ක්‍රමයට ක්‍රියාත්මක වන ලැංවේජ් දෙකකි. Java යනු ඉන්ටර්ප්‍රීටර් ක්‍රමයට ක්‍රියාත්මක වන ලැංවේජ් එකකි. කම්පයිල් ක්‍රමයේදී යම් ප්‍රෝග්‍රෑම් එකක් සෑදුවාට පසුව කම්පයිල් කරන්නේ එක්වරක් පමණි. එම අතරමැදි (එහෙත් අත්‍යවශ්‍ය) කටයුත්ත සඳහා යම් කාලයක් ගත වේ. එහෙත් එය ගැටලුවක් නොවේ මොකද එක් වරයි එය සිදු කරන්නේ. ඉන්පසුව ඉන් ලැබෙන එක්සික්‍යුටබල් ෆයිල් එක පරිගණකය මත කිසිවෙකුගේ උදව් නොමැතිව රන් කළ හැකියි. ඉන්ටර්ප්‍රීට් ක්‍රමයේදී නම් අමුතුවෙන් කම්පයිල් කර කර ඉන්නට අවශ්‍ය නැත (එනම් ඒ සඳහා කාලයක් ගත නොවේ). එහෙත් එය රන් කරන හැම වාරයකදීම ඉබේම එය පරිවර්තනය වේ. ඒ සඳහා නම් අමතර කාලයක් ගත වෙනවා. ඒ කියන්නේ ඉනටර්ප්‍රීට් ක්‍රමයට වැඩකරන ප්‍රෝග්‍රෑම් එකක් කම්පයිල් ක්‍රමයේ ප්‍රෝග්‍රෑම් එකකට වඩා මන්දගාමී වේ. තවද, ඉන්ටර්ප්‍රීට් ක්‍රමයේ ප්‍රෝග්‍රෑම් එකක් තමන් විසින්ම රන් වීමට බැරිය; ඊට රන් කරන මොහොතේදීත් වෙනත් කෙනෙකුගේ (එනම් ඉන්ටර්ප්‍රීටර් එකේ) උදව් අවශ්‍ය කරනවා (කේත පරිවර්තනය කිරීමට). මේ අනුව මෙම ක්‍රම දෙකෙහි වෙනස්කම් වටහා ගන්න.

ඇත්තටම හතරවැනි පරම්පරාව ආදී ලෙස තවත් පරම්පරා සමහරුන් විසින් හඳුන්වාදී තිබෙනවා ප්‍රෝග්‍රැමිං ලැංවේජ් සඳහා. පළමු, දෙවැනි, තෙවැනි පරම්පරාවලදී මෙන් පැහැදිලි නිශ්චිත බවක් ඒවායේ මා දකින්නේ නැත. මා කල්පනා කරන්නේ අද තිබෙන සිය ගණනක් වූ පරිගණක භාෂාවන් සියල්ලම තෙවැනි පරම්පරාවේ භාෂා බවයි. ඒවායේ සමානකම් හා වෙනස්කම් එමට ඇත. එහෙත් ඒවා සියල්ල එකම පරම්පරාවේ භාෂා වේ. සමහරෙක් පර්යේෂණ කරනවා ඔබ අප සාමාන්‍යයෙන් ස්වාභාවික භාෂාවකින් අදහස් හුවමාරු කරන්නා සේ, අප හා පරිගණකය අතරද අදහස් හුවමාරු කරගන්නට හැකි පරිදි පරිගණක භාෂා නිපදවීමට. එවිට ඔබට අමුතුවෙන් පරිගණක භාෂාවක් ඉගෙනීමට අවශ්‍ය නැත. ඉංග්‍රිසියෙන් (හෝ සිංහලෙන් හෝ එවැනි ස්වාභාවික භාෂාවකින්) පරිගණකයට කතා කළ හැකියි. අරක කරන්න, මේක කරන්න කියා කෙලින්ම වචනයෙන් පරිගනකයට විධාන කළ හැකියි. චිත්‍රපටිවල නම් මෙවැනි දර්ශන ඔබ කොතෙකුත් දැක ඇති. මේ සඳහා කෘත්‍රිම බුද්ධිය (Artificial Intelligence – AI) ලෙස හැඳින්වෙන උසස් ක්‍රමවේද පර්යේෂණය වෙමින් පවතී. එවැනි පරිගණක භාෂාවක් අනිවාර්යෙන්ම වෙනමම පරම්පරාවක් ලෙසට නම් කළ හැකියි. මෙවැනි උසස් ගණයේ පරිගණක භාෂාවක් නිර්මාණය කළ හැකියි, ඔබට හැකි නම් අප සාමාන්‍යයෙන් කටින් කියන ශබ්ද (මයික් එකකින්) ග්‍රහණය කරගෙන, ඒවා බයිනරි කේත බවට පරිවර්තනය කළ හැකි ක්‍රමයක් සෑදිය හැකි නම්. එහෙත් එය හිතන තරම් පහසු නොවේ (ඒ ගැන කල්පනා කර බලන්න).

ප්‍රෝග්‍රැමිං කරන අයුරු…

සාමාන්‍යයෙන් ප්‍රෝග්‍රෑම් ලියන්නේ ටෙක්ස්ට් ආකාරයෙන් හෙවත් text format එකෙනි. එයටම ASCII format එක කියා කිව හැකියි (ASCII යනු American Standard Code for Information Interchange යන දිගු වචනයෙහි කෙටි කරපු වචනයයි). ඕනෑම පරිගණකයක තිබෙන සරලතම දත්ත ලියන ෆෝමැට් එක මෙයයි. වින්ඩෝස්වල නෝට්පෑඩ් (Notepad) මේ සඳහා යොදා ගත හැකියි. ලිනක්ස්වල Pluma වැනි සොෆ්ට්වෙයාර් එකක් යොදා ගත හැකියි. මෙවැනි අකුරු ලියන්නට භාවිතා කරන සොෆ්ට්වෙයාර් ටෙක්ස් එඩිටර් (text editor) ලෙස පොදුවේ හැඳින්වෙනවා. නොමිලේ මෙවැනි ටෙක්ස්ට් එඩිටර් සිය ගණනක් ඕනෑම ඔපරේටිං සිස්ටම් එකක් සඳහා සොයා ගත හැකියි. ටෙක්ස්ට් ෆෝමැට් එකකින් ෆයිල් එකක් සාදා සේව් කරන විට, සේව් වන්නේ අකුරු හා ඉලක්කම් පමණි. එම අකුරුවලට "වැඩ කෑලි" දැමිය නොහැකියි (එනම්, අකුරු තද කිරීම හෙවත් බෝල්ඩ් කිරීම, අකුරුවල වර්ණය වෙනස් කිරීම වැනි දේවල් සිදු කළ නොහැකියි). ඒ කියන්නේ ටෙක්ස්ට් ෆෝමැට් එක යනු "විච්චූරන නැති" පිරිසිදුවම අක්ෂර හා ඉලක්කම් පමණක් අන්තර්ගත වන ෆයිල් ෆෝමැට් එකයි. මයික්‍රොසොෆ්ට් වර්ඩ්, ලීබර්ඔෆිස් රයිටර් වැනි වදන් සැකසුම් (word processing) සොෆ්ට්වෙයාර් මේ සඳහා උචිත නොවේ මොකද මේවායේ ටෙක්ස්ට් එඩිටර් එකකට අනවශ්‍ය දේවල් ඉතාම වැඩියි. ඔබට මෙවැනි වර්ඩ්ප්‍රොසෙසර් සොෆ්ට්වෙයාර් එකක් භාවිතා කිරීමට අවශ්‍යම නම්, තමන්ගේ කෝඩිං ලියා (එහෙත් එම කෝඩිංවල අකුරුවලට වැඩ දාන්න එපා) text හෙවත් txt හෙවත් ASCII ෆෝමැට් එකෙන් පමණක් සේව් කරන්න (එය අනිවාර්යයි). එහෙත් ඉතිං පිහියෙන් කපන්න පුලුවන් දේට පොරොවක් මොකටද?

මෙහිදී තමන් දන්නා ලැංවේජ් එකේ කීවර්ඩ්ස් හා සෙමැන්ටික්ස් අනුගමනය කරමින් ටෙක්ස්ට් එඩිටර් එකේ ප්‍රෝග්‍රෑම් එක ලියන්න. මෙලෙස ටෙක්ස්ට් ෆෝමැට් එකෙන් ලියපු ප්‍රෝග්‍රෑම් එක "මූලකේත" (source code) ලෙස හැඳින්වේ. සෝස්කෝඩ් තිබෙන්නේ ප්‍රෝග්‍රැමර්ට පහසුවෙන් තේරෙන ආකාරයෙනි. එය කොම්පියුටරයට නොතේරේ. ඉතිං ඒ සඳහානෙ පරිවර්තක තිබෙන්නේ. දැන් තිබෙනවා පරිවර්තක දෙකක් - ඉන්ටර්ප්‍රීටර් හා කම්පයිලර්.

ඉන්ටර්ප්‍රීටර් ක්‍රමයේ ලැංවේජ් එකක් භාවිතා කර නම් ඔබ ප්‍රෝග්‍රෑම් එක සෑදුවේ, එම ලැංවේජ් එකට ගැලපෙන ඉන්ටර්ප්‍රීටර් එකක් දැන් එම ප්‍රෝග්‍රෑම් එක රන් කරන හැම පරිගණකයකම ඉන්ස්ටෝල් කර ගත යුතු වෙනවා (ඉන්ටර්ප්‍රීටර් ක්‍රමයේ ඇති එක් දුර්වලකමකි එය). එච්චරයි කරන්නට තියෙන්නෙ.

ඔබ භාවිතා කළේ කම්පයිල් ක්‍රමයේ ලැංවේජ් එකක් නම්, පෙර සේම ටෙක්ස්ට් එඩිටර් එකක් යොදා ගෙන සෝස්කෝඩ් ලියන්න. ඉන්පසු පරිගණකයක එම ලැංවේජ් එකට ගැලපෙන කම්පයිලර් එකක් ඉන්ස්ටෝල් කර ගන්න. දැන් එම කම්පයිලර් එකෙන් සෝස්කෝඩ් එක කම්පයිල් කර ගන්න. එවිට ලැබෙන්නේ එක්සික්‍යුටබල් ෆයිල් එකයි. එයම බයිනරි ෆයිල් (binary file) ලෙසද, binary code ලෙසද, machine code ලෙසද හැඳින්විය හැකියි. දැන් මෙම ෆයිල් එක ඕනෑම පරිගණකයක් මත රන් කළ හැකියි. එය රන් කිරීමට වෙනත් ප්‍රෝග්‍රෑම් ඉන්ස්ටෝල් කිරීමට අවශ්‍ය නැත. (මේ අනුව කම්පයිල් කරනවා යනු සෝස්කෝඩ් එකක් බයිනරි කෝඩ් එකක් බවට පත් කිරීම ලෙස අර්ථදැක්විය හැකියි.) මෙතැන් සිට c යන ප්‍රෝග්‍රැමිං ලැංවේජ් එක ගැන ඉගෙන ගමු. එය කම්පයිල් ක්‍රමයේ භාෂාවකි.


16 comments:

  1. pdf පොත දාන තෙක් බලාසිටිමි. :-) ඔබගේ අනෙක් ලිපිද එසේ පරිශීලනය කළෙමි. ජයවේවා !

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. thank you very much....! please continue...

    ReplyDelete
  4. ඔබේ ලිපි කියෙව්වම මට ලිනක්ස් ඉන්ස්ටෝල් කරගන්න වගේම ප්‍රෝග්‍රැමිං ලැන්වේජ් එකක් ඉගෙනගන්නත් ලොකු ආසාවක් ඇතිවුනා. බොහොම ස්තූතියි තමන්ගේ දැනුම නිර්ලෝභීව බෙදාදෙනවට.

    ReplyDelete
    Replies
    1. අනිවාර්යෙන්ම ආශාවක් තිබෙන ඕනම කෙනෙකුට ප්‍රෝග්‍රැමිං ඉගෙන ගත හැකියි.

      Delete
  5. මටනම් මොළේ amaruwak tyenawa hama kehelmalama igenaganime..dn mn programming igenagannai yannee..huree

    ReplyDelete
    Replies
    1. igena ganna eka moley amaruwak neme... eheth onama deyak onawata wadiya onama na kiyanawane... wedagath yai sithe nam dewal igena ganna... igena ganna hethu thiyenawane... me hethu walin ekakwath nathinam thawa paarak hithanna ai yamak igena ganne kiyala...
      1. pawrsaya (personality) wadi karaganna
      2. honda aadaayam maargayak labaa ganna
      3. thamntath anuntath prayojanayak weemata

      Delete
  6. 1>3>2 widiyata pela gessuwahaki... science ,maths walata mn asai..adyapanaya magadi kadakappal unata utsahaya atariye na mn..unique powerful akalpa,danum,kusalata walin පෝසත් wennai ona.mn dannaha kohen nataraweida kyala..but me dewal walin manasa suwapat wenawa bawanawakata wada.

    ReplyDelete
    Replies
    1. obe watinakam pelgasweema excellent... :) jeewithe awasan wena thanin ewa awasan wei... eheth thamanta pahasu thanin nopamaawa patan ganima wedagath... kalabala nowee semin steady gamanak arambanna... you can!

      Delete
  7. Obe ධෛර්යමත් kirimata hugak ස්තුති. Maths ha physics sambanada twa twa පාඩම් මාලාවන් ඉදිරිපත් karanna sir..

    ReplyDelete
  8. සර් ට සංකීර්ණ විෂය කරුණු සරල කරල ඕනෑම කෙනෙකුට ග්‍රහණය කරදීමේ හැකි මාර හැකියාවක් තියෙනව.අපිටත් ආසාවෙන් ඉගෙනගන්න පුලුවන්.arduino වල තියෙන්නෙ c ද එහෙමත් නැත්නම් arduino මතම පදනම් වුන භාශාවක්ද.c පාඩම් ටික නම් දිගටම දෙන්න සර්.

    ReplyDelete
    Replies
    1. arduino ප්‍රෝග්‍රෑම් කිරීම අයත් වන්නේ දළ වශයෙන් embedded programming කියන කොටසටයි. ඕනෑම එම්බෙඩඩ් ප්‍රෝග්‍රැමිං ක්‍රමයක අඩියේ තිබෙන්නේ එක්කෝ ඇසෙම්බ්ලි නැතහොත් සී ලැංවේජ් එකයි. එහෙත් අදාල මයික්‍රොකොන්ට්‍රෝලරයට සුවිශේෂි ලෙස විවිධ වෙනස්කම් සහිත සිවියකින් (layer) හෙවත් abstraction layer එකකින් අඩියේ තිබෙන ලැංවේජ් එක එකවර ඉස්මතු නොවන සේ පවතිනවා. arduino හිදිත් එසේමය.

      Delete