প্রোগ্রামিং ভাষা
প্রোগ্রামিং ভাষা (ইংরেজি ভাষায়: programming language) হচ্ছে এক ধরনের কৃত্রিম ভাষা (artificial language) যা কোন যন্ত্রের, বিশেষ করে কম্পিউটারের আচরণ নিয়ন্ত্রণ করার জন্য ব্যবহার করা হয়। মানুষের মুখের স্বাভাবিক ভাষাগুলোর মত প্রোগ্রামিং ভাষাগুলোও বাক্যতাত্ত্বিক (syntactic বা বাক্যস্থিত বিভিন্ন পদের মধ্যে সম্পর্ক কী হবে সে-সংক্রান্ত) ও আর্থ (semantic বা শব্দের অর্থসংক্রান্ত) নিয়ম মেনে চলে।
তথ্য সুবিন্যস্তকরণ ও প্রক্রিয়াকরণে এবং অ্যালগোরিদমসমূহ নির্ভুলভাবে প্রকাশ করতে প্রোগ্রামিং ভাষা ব্যবহার করা হয়। কিছু কিছু লেখক প্রোগ্রামিং ভাষা বলতে কেবল সেই সব ভাষাকে বোঝান যেগুলো সম্ভাব্য "সমস্ত" অ্যালগোরিদম প্রকাশে সক্ষম; কখনো কখনো সরল ধরনের কৃত্রিম ভাষাগুলোকে প্রোগ্রামিং ভাষা না বলে 'কম্পিউটার ভাষা" (computer language) বলা হয়।
এ পর্যন্ত বহু হাজার প্রোগ্রামিং ভাষা সৃষ্টি করা হয়েছে , এবং প্রতি বছরই নতুন নতুন প্রোগ্রামিং ভাষা উদ্ভাবন করা হচ্ছে।
প্রোগ্রামিং ভাষার বিভিন্ন বৈশিষ্ট্যের ওপর ভিত্তি করে এর সংজ্ঞা দেয়া যায়:প্রোগ্রামিং ভাষাগুলো কম্পিউটারকে নির্দেশ দেওয়ার জন্য ব্যবহৃত হয়। সে কারণে মানুষের মুখের ভাষা ও অন্যান্য অভিব্যক্তি থেকে এই ভাষাগুলোর প্রকৃতি আলাদা। প্রোগ্রামিং ভাষাতে সম্পূর্ণতা ও নির্ভুলতার মূল্য দেয়া হয়। স্বাভাবিক ভাষায় কথা বলে বা লেখার মানুষেরা একই শব্দের বহু অর্থ করতে পারেন এবং ছোটখাট ভুল করতে পারেন, কিন্তু তাদের মনের কথা প্রকাশ এতে তেমন ব্যাহত হয় না। অন্যদিকে, কম্পিউটার কেবল তা-ই পালন করে যা তাকে নির্দেশ দেয়া হয়, এবং কম্পিউটারের পক্ষে প্রোগ্রামার আসলেই কোন্‌ নির্দেশ দিতে চেয়েছিলেন তা বুঝতে পারা সম্ভব নয়। কোন প্রোগ্রামার প্রোগ্রামিং ভাষার সংজ্ঞা (language definition), প্রোগ্রাম, এবং প্রোগ্রামের ইনপুট – এই তিনের সমন্বয়ে সম্পূর্নরূপে নির্দেশ করে দেন প্রোগ্রামটি চালালে কী ঘটবে।
অনেক প্রোগ্রামিং ভাষা একেবারে শূন্য থেকে নকশা করা হয়েছে, তারপর এগুলোতে প্রয়োজন অনুসারে পরিবর্তন আনা হয়েছে, অন্য প্রোগ্রামিং ভাষার সাথে এদের সম্মিলন ঘটানো হয়েছে, এবং পরিশেষে এগুলো বাস্তব ব্যবহার থেকে পরিত্যক্ত হয়েছে। একটি “সার্বজনীন” কম্পিউটার ভাষা তৈরি করার অনেক চেষ্টা করা হয়েছে, যে ভাষা হবে যেকোন উদ্দেশ্যে ব্যবহারযোগ্য, কিন্তু কোন চেষ্টাই সফল হয়নি। কাজের প্রকৃতির বৈচিত্র‌্যের কারণেই বিভিন্ন বিচিত্র কম্পিউটার ভাষা উদ্ভাবিত হয়েছে:নিয়তই প্রোগ্রামিং ভাষাগুলোর উন্নতিসাধন করার চেষ্টা চলে এবং প্রায়ক্ষেত্রেই লক্ষ্য থাকে ভাষাতে উচ্চস্তরের বিমূর্তায়ন ব্যবহার করে সমস্যা সমাধানের ক্ষমতা বাড়ানো। একেবারে শুরুর দিককার প্রোগ্রামিং ভাষাগুলো কম্পিউটারের হার্ডওয়্যারের সাথে খুবই ঘনিষ্ঠভাবে জড়িত ছিল। নতুন প্রোগ্রামিং ভাষাগুলোতে অনেক নতুন ফিচার বা বৈশিষ্ট্য যোগ করা হয় যাতে প্রোগ্রামারদের কীভাবে তাদের প্রোগ্রামের হার্ডওয়্যার নির্দেশে রূপান্তরিত হবে তা নিয়ে চিন্তা করতে না হয়। ফলে প্রোগ্রামাররা এখন একই সময়ে আগের চেয়ে অনেক বেশি প্রোগ্রাম লিখতে পারেন
প্রোগ্রামিং-এর জন্য বিশেষায়িত ভাষার ব্যবহার দূর করে মানুষের স্বাভাবিক ভাষা ব্যবহারের জন্য স্বাভাবিক ভাষা প্রসেসরের ব্যবহার অনেকে প্রস্তাব করেছেন। কিন্তু এটা বাস্তবায়ন করা কঠিন। আর এর সুফল নিয়েও বিতর্ক আছে। এট্‌সখার ডেইক্‌স্ট্রা মনে করতেন বিধিবদ্ধ ভাষা অর্থহীন সংগঠনসমূহ দূর করতে অত্যন্ত জরুরি। তিনি স্বাভাবিক ভাষায় প্রোগ্রাম লেখাকে বোকামি বলে মনে করতেন। অ্যালান পেরলিস-ও এ ব্যাপারে নেতিবাচক অবস্থান নেন।
কোন প্রোগ্রামিং ভাষার বাইরের রূপকে তার সিনট্যাক্স বলা হয়। বেশির ভাগ প্রোগ্রামিং ভাষাই সম্পূর্ণ টেক্সট-ভিত্তিক। এগুলি শব্দ, সংখ্যা ও বিরামচিহ্নবিশিষ্ট টেক্সট ব্যবহার করে, অনেকটা স্বাভাবিক ভাষাগুলির মতই। তবে কিছু কিছু প্রোগ্রামিং ভাষা আছে যেগুলি চিত্রভিত্তিক। এগুলি বিভিন্ন প্রতীকের মধ্যকার অবস্থানগত সম্পর্ক কাজে লাগিয়ে প্রোগ্রাম লিখতে সহায়তা করে।
কোন প্রোগ্রামিং ভাষার প্রতীকগুলি কী কী উপায়ে একত্রিত হয়ে সিনট্যাক্সগতভাবে সঠিক প্রোগ্রাম তৈরি করতে পারে, ভাষাটির সিনট্যাক্সে তার বিবরণ থাকে। আর কোন প্রতীকসমষ্টির অর্থ কী হবে, তা নির্ধারণ করে ভাষাটির সেমান্টিক্‌স।
প্রোগ্রামিং ভাষার সিনট্যাক্স সাধারণত নিয়মিত এক্সপ্রেশন (regular expression) ([[আভিধানিক বিশ্লেষণ|আভিধানিক গঠনের জন্য) এবং [[বাকাস-নাউর রূপ]] (Backus-Naur Form) ([[প্রসঙ্গ-মুক্ত ব্যাকরণ|ব্যাকরণিক]] গঠনের জন্য) এই দুইয়ের সমন্বয়ে তৈরি করা হয়।
নীচে [[লিস্প প্রোগ্রামিং ভাষা|লিস্পের]] ওপর ভিত্তি করে লেখা একটি সরল ব্যাকরণ দেয়া হল:
codice_1
উপরের ব্যাকরণটি নীচের জিনিসগুলিকে সংজ্ঞায়িত করেছে:
এই ব্যাকরণ সঠিকভাবে অনুসরণকারী কিছু টোকেনের উদাহরণ: 'codice_2', 'codice_3', 'codice_4'
সিনট্যাক্সগতভাবে সঠিক প্রোগ্রাম মাত্রেই সেমান্টিক্‌স বা অর্থগতভাবে সঠিক হবে, তা নয়। অনেক সিনট্যাক্সগতভাবে সঠিক প্রোগ্রাম তাই অনুবাদ বা নির্বাহ করার সময় ত্রুটির সৃষ্টি করতে পারে। কোন কোন ক্ষেত্রে এরকম প্রোগ্রাম [[অসংজ্ঞায়ির আচরণ]] (undefined behavior) প্রদর্শন করতে পারে। আবার কোন প্রোগ্রাম প্রোগ্রামিং ভাষার সমস্ত নিয়মকানুন মেনে চললেও এটি প্রোগ্রামার যা করতে চেয়েছিলেন সেই অর্থে না-ও বাস্তবায়িত হতে পারে।
মানুষের মুখের [[স্বাভাবিক ভাষা|স্বাভাবিক ভাষাতেও]] এর উদাহরণ মেলে। কোন ব্যাকরণগতভাবে শুদ্ধ বাক্য অর্থহীন হতে পারে, যেমন:
নীচের [[সি প্রোগ্রামিং ভাষা|সি প্রোগ্রামিং ভাষায়]] লেখা কোডটি সিনট্যাক্সগতভাবে শুদ্ধ, কিন্তু এটি এমন একটি অপারেশন সম্পাদন করে যা সেমান্টিক্‌সগতভাবে বা অর্থগতভাবে সংজ্ঞায়িত নয়। (যেহেতু p একটি [[নাল পয়েন্টার]], p->real এবং p->im অপারেশনগুলি অর্থহীন):
যেকোন প্রোগ্রামিং ভাষা মান (values) ও এক্সপ্রেশনগুলিকে বিভিন্ন “টাইপে” শ্রেণিকরণ করে। এই শ্রেণিকরণ, কীভাবে টাইপগুলি ব্যবহার করা যাবে এবং টাইপগুলির একে অপরের সাথে সম্পর্ক কী, তা সংজ্ঞায়িত থাকে প্রোগ্রামিং ভাষাটির টাইপ ব্যবস্থায়। ভাষাটিতে কী ধরনের উপাত্ত কাঠামো ব্যবহার করা যাবে, টাইপ ব্যবস্থায় মূলত তারই বিবরণ থাকে। বিধিগত গণিত ব্যবহার করে টাইপ ব্যবস্থাগুলি ডিজাইন ও গবেষণা “[[টাইপ তত্ত্ব|টাইপ তত্ত্বের]]” আলোচ্য।
আধুনিক ডিজিটাল কম্পিউটারের ভেতরে সমস্ত [[উপাত্ত|উপাত্তই]] শূন্য বা এক আকারে রক্ষিত থাকে ([[দ্বিমিক সংখ্যা ব্যবস্থা]] দেখুন)। এই উপাত্ততে বাস্তব বিশ্বের নানা তথ্য যেমন নাম, ব্যাংক অ্যাকাউন্ট, পরিমাপ, ইত্যাদি প্রকাশ পেতে পারে। প্রোগ্রামিং ভাষা নিম্নস্তরের দ্বিমিক উপাত্তকে এই উচ্চ-স্তরের তথ্যের ধারণায় বাস্তবায়ন করে উপাত্ত টাইপের সাহায্য নিয়ে। এছাড়া আরও কিছু বিমূর্ত টাইপ আছে যেগুলি প্রোগ্রামের নিরাপত্তার সুবিধার্থে কিংবা প্রোগ্রামারকে অর্থহীন বিবৃতির ব্যাপারে সাবধান করে দেয়ার জন্য ব্যবহৃত হয়।
প্রোগ্রামিং ভাষাগুলিকে তাদের টাইপ ব্যবস্থাগুলির ওপর ভিত্তি করে শ্রেণীবিভাগ করা যায়।
কোন প্রোগ্রামিং ভাষার একটি উপাত্ত টাইপের জন্য সংজ্ঞায়িত অপারেশনগুলি যখন অন্য একটি উপাত্ত টাইপের ওপর প্রয়োগ করা যায় না, তখন সেই ভাষাটিকে “টাইপকৃত ভাষা” বলা হয়। উদাহরণস্বরূপ, "codice_5" একটি স্ট্রিং। বেশির ভাগ প্রোগ্রামিং ভাষায় স্ট্রিং-কে কোন সংখ্যা দিয়ে ভাগ করা অর্থহীন। তাই বেশির ভাগ ভাষাতে কোন প্রোগ্রামকে এই ধরনের অপারেশন সম্পাদন করতে বাধা দেয়া হয়। কিছু কিছু ভাষায় এই অর্থহীন অপারেশনটি প্রোগ্রামটি কম্পাইল করার সময় ধরা হয়; একে বলা হয় “স্থির টাইপ পরীক্ষা” (static type checking), এবং কম্পাইলার অপারেশনটি প্রত্যাখ্যান করে। আবার অন্য কিছু ভাষায় এই শরনের অপারেশন যখন প্রোগ্রামটি চালানো হয় বা “রান” করা হয়, তখন ধরা হয়; একে বলা হয় “চলমান টাইপ পরীক্ষা” (dynamic type checking), এবং এতে “রান-টাইম” [[এক্সেপশন ব্যবস্থাপনা|এক্সেপশন]] সৃষ্টি হয়।
নিম্নস্তরের ভাষা(low level language) সরাসরি কম্পিউটারের প্রধান মেমোরির উপর কাজ করতে পারে। অ্যাসেম্বলি ভাষা একটি নিম্নস্তরের ভাষা,এ ভাষায় সরাসরি কম্পিউটারের রেজিস্টারকে নিয়ন্ত্রণ করে কাজ করতে হয়। এ ভাষাগুলো হার্ডওয়্যারের উপর নির্ভরশীল,তাই এক কম্পিউটারে অ্যাসেম্বলি ভাষায় লেখা প্রোগ্রাম অন্য কম্পিউটারে কাজ নাও করতে পারে।
[[বিষয়শ্রেণী:কম্পিউটার ভাষা]]