সি (প্রোগ্রামিং ভাষা)

সি একটি প্রোগ্রামিং ভাষা। সি নির্মাণ করেন ডেনিস রিচি, বেল ল্যাবে '৭০এর দশকে কাজ করার সময়। ভাষাটি তৈরির প্রথম উদ্দেশ্য ছিল ইউনিক্স অপারেটিং সিস্টেম এর কোড লেখা, কিন্তু অচিরেই এটি একটি বহুলব্যবহৃত ভাষায় পরিণত হয়। সি++ ও জাভাসহ পরবর্তীকালের অনেক প্রোগ্রামিং ভাষার উপর সি'র গভীর প্রভাব পড়েছে। সি'র সবচেয়ে আকর্ষণীয় দিক হচ্ছে এর বহনযোগ্যতা (portability)। সি'তে রচিত প্রোগ্রাম যেকোনো অপারেটিং সিস্টেমের কম্পিউটারে চালানো যায়। ৭০ এবং ৮০র দশকের দিকে সি এর জনপ্রিয়তা বৃদ্ধি পাবার সাথে সাথে এর অনেকগুলো সংস্করণ তৈরি হয়। ১৯৮৩ সালে মার্কিন মাননিয়ন্ত্রক সংস্থা সি এর একটি আদর্শ সংস্করণ তৈরির জন্য কমিটি গঠন করে। দীর্ঘ ৬ বছর পরে ১৯৮৯ সালে সেই আদর্শ সি ভাষাটি তৈরি হয়, যা আমেরিকান মাননিয়ন্ত্রক সংস্থার সি (আনসি সি (ANSI C)) নামে পরিচিত। পরবর্তীতে আন্তর্জাতিক মাননিয়ন্ত্রক সংস্থা ১৯৯০ সালে সি এর এই আদর্শ সংস্করণটি গ্রহণ করে, যা সি৯০ নামে পরিচিত। মূলত "সি৮৯" এবং "সি৯০" একই ভাষা। যুগের প্রয়োজনে আন্তর্জাতিক মাননিয়ন্ত্রক সংস্থা ১৯৯৫ সালে এই সংস্করণকে বর্ধিত করে এবং পরবর্তীতে ১৯৯৯ সালে সম্পূর্ণ নতুন একটি সংস্করণ প্রকাশ করে যা সি৯৯ নামে পরিচিত। ২০১১ সালের ডিসেম্বরে সি প্রোগ্রামিং ল্যাঙ্গুয়েজের সংস্করণ সি১১ এবং ২০১৮ সালের জুনে সংশোধিত সি১৭ প্রকাশিত হয়। ১৯৬০-এর দশকে বেশ কিছু কম্পিউটার প্রোগ্রামিং ভাষা তৈরি করা হয়েছিল। মার্কিন কম্পিউটারবিদ গ্রেস হপার Mathematic, Flowmatic এবং A2 নামে তিনটি প্রোগ্রামিং ভাষা উদ্ভাবন করেন। এরপর জেম্‌স ব্যাকাস তৈরি করেন ForTran। তারও পরে ALGOL, COBOL, Ada ইত্যাদি প্রোগ্রামিং ভাষা উদ্ভাবন করা হয়। মূলত এই ভাষাগুলিই আধুনিক প্রোগ্রামিং ভাষাগুলির পূর্বসূরী। কিন্তু ঐ ভাষাগুলিকে ভিন্ন ভিন্ন কাজে ব্যবহার করা হত। তাই কম্পিউটার বিজ্ঞানীরা এমন একটি প্রোগ্রামিং ভাষার কথা ভাবতে থাকেন যার মাধ্যমে সব ধরনের সফটওয়্যার তৈরি করা সম্ভব হবে। এরই ফলশ্রুতিতে বিজ্ঞানীরা তৈরি করেন ALGOL 60 (Algorithmic Language) এবং এরপর Combined Programming Language (CPL), কিন্তু CPL শেখা এবং ব্যবহার করা ছিল বেশ কঠিন। তাই এটা জনপ্রিয়তা পায়নি। কেমব্রিজ বিশ্ববিদ্যালয় এর মার্টিন রিচার্ড CPL কে ভিত্তি করে ১৯৬৭ সালে তৈরি করেন Basic Combined Programming Language (BCPL) কিন্তু এটি ছিল মূলত Less Powerful to Specific এবং টাইপবিহীন একটি প্রোগ্রামিং ভাষা। এ সময়েই যুক্তরাষ্ট্রের বেল গবেষণাগারে বিজ্ঞানী টমসন তৈরি করেন বি (B) নামক একটি প্রোগ্রামিং ভাষা; এটি ছিল পূর্বের BCPL-এর একটি উন্নত সংস্করণ। ডেনিস রিচি পরবর্তীতে B এবং BCPL অনুসরণ করেন এবং নিজে থেকে আরো কিছু কৌশল ব্যবহার করে তৈরি করেন "সি" (C)। মূলত B-এর সীমাবদ্ধতা গুলো দূর করার উদ্দেশ্যেই "সি" এর উৎপত্তি। সি-এর উৎপত্তি, উনিক্স অপারেটিং সিস্টেমের বিকাশের সাথে অতোপ্রতোভাবে জড়িত, যা মূলত ডেনিস রিচি এবং কেন থম্পসন ও তাদের সহকর্মীদের বিভিন্ন ধারণাকে কাজে কাজে লাগিয়ে PDP-7-এ প্রয়োগ করা হয়। অবশেষে, তারা অপারেটিং সিস্টেমটিকে PDP-11-এ পোর্ট করার সিদ্ধান্ত নেয়। ইউনিক্সের আসল PDP-11 সংস্করণটিও অ্যাসেম্বল ভাষায় তৈরি করা হয়েছিল। থমসন নতুন প্লাটফর্মটির জন্য কার্যকারি কিছু তৈরি করতে চেয়েছিলেন। প্রথমে, তিনি একটি ফোরট্রান কম্পাইলার তৈরি করার চেষ্টা করেছিলেন, কিন্তু শীঘ্রই ধারণাটি বাদ দেন। পরিবর্তে, তিনি সম্প্রতিক আবিষ্কৃত বিসিপিএল সিস্টেম প্রোগ্রামিং ভাষা-এর সাহায্যে একটি স্বল্প খরচের সংস্করণ তৈরি করেন। তখনও বিসিপিএলের অফিসিয়াল বিবরণ পাওয়া যায়নি, এবং থম্পসন সিনট্যাক্স গুলোকে যতটা কম শব্দের সাহায্যে লেখা যায়, সেভাবে লিখেছিলেন যা সরলীকৃত ALGOL যা SMALGOL নামে পরিচিত, এর মতো ছিলো।  ১৯৭১ সালে, রিচি আরও শক্তিশালী পিডিপি-১১-এর বৈশিষ্ট্যগুলিকে কাজে লাগানোর জন্য বি-এর উন্নয়ন করতে শুরু করেন। একটি উল্লেখযোগ্য সংযোজন ছিল ক্যরেক্টার টাইপ নামক ডাটা টাইপ সংযোজন। তিনি এটিকে নতুন বি বলে ডাকতেন। থম্পসন ইউনিক্স কার্নেল লিখতে এনবি ব্যবহার করা শুরু করেন এবং এর প্রয়োজনীয়তা প্রোগ্রামিং ভাষার বিকাশের জন্য অপরিহার্য হয়ে ওঠে। ১৯৭২ সাল পর্যন্ত এনবি ভাষায় আরও সমৃদ্ধ ধরনের ডাটা টাইপ যোগ করা হয়েছিল। এনবি-এর int এবং char এর অ্যারে ছিল; কিন্তু তারপর পয়েন্টার যোগ করা হয়েছে, অন্যান্য ধরনের পয়েন্টার তৈরি করার ক্ষমতা, এই সবগুলির অ্যারে, ফাংশন থেকে ফলফল ফেরত দেওয়ার ধরন (return)। এক্সপ্রেশন মধ্যেকার অ্যারে পয়েন্টার হিসাবে কাজ করা শুরু করে। এর মাধ্যমে একটি নতুন কম্পাইলার লেখা হয়, এবং ভাষাটির নাম পরিবর্তন করে C করা হয়। সি কম্পাইলার এবং এটির সাথে তৈরি কিছু ইউটিলিটি ইউনিক্স সংস্করণ ২এ অন্তর্ভুক্ত ছিল।  ১৯৭৮ সালে, ব্রায়ান কার্নিঘান এবং ডেনিস রিচি দ্যা সি প্রোগ্রামিং ল্যাঙ্গুয়েজ এর প্রথম সংস্করণ প্রকাশ করেন। এই বইটি, যা সি প্রোগ্রামারদের কাছে K&R নামে পরিচিত, বহু বছর ধরে এই ভাষার একটি অনানুষ্ঠানিক নির্দেশিকা হিসেবে কাজ করেছে। এটিকে অনেকেই K&R C নামে চেনে।  এই বইটির দ্বিতীয় সংস্করণটি, সি ভাষার ANSI C মান্দন্ডকে মেনে চলে, যা নীচে বর্ণিত হয়েছে। K&R সি ভাষায় বেশ কিছু নতুন বৈশিষ্ট্য চালু করেছে: এমনিকি, ১৯৮৯ সালে ANSI মানদন্ড প্রকাশের পরও অনেক দিন ধরেই K&R C নির্দেশবলী হালনাগাদ করা হয়নি। ফলে, এটি কম্পাইল করতে এখনো অনেক পুরোনো কম্পাইলার ব্যবহৃত হয়। সি-এর প্রথম দিকের সংস্করণগুলোতে , যে ফাংশনগুলি শুধুমাত্র int ব্যতীত অন্য কোনো টাইপের ডাটা প্রত্যাবর্তন(return) করে তা ঘোষণা করা আবশ্যক, যদি তা ফাংশন লেখার আগে ব্যবহার করা হয়। পূর্বে ডাটা টাইপ ্না বলে দেওয়া হলে, ফাংশন টাইপ ও রিটার্ন টাইপ কম্পাইলার ডিফল্ট হিসাবে int ধরে নেয়। উদাহরণস্বরূপ: যে int গুলি কমেন্ট ব্লকের মধ্যে যুক্ত করা হয়েছে তা K&R C-তে বাদ দেওয়া যেতে পারে, কিন্তু পরবর্তীতে এগুলো প্রয়োজন হতে পারে। K&R C প্রকাশের পরের বছরগুলিতে, AT&T (বিশেষ করে পিসিসি) এবং কিছু অন্যান্য ভেন্ডার। এর অন্তর্ভুক্ত হলো: বিপুল সংখ্যক এক্সটেনশন এবং একটি স্ট্যান্ডার্ড লাইব্রেরি-এর শর্তের অভাব, সি ভাষার জনপ্রিয়তা এবং এটাও সত্য যে ইউনিক্স কম্পাইলাররাও K&R স্পেসিফিকেশন সঠিকভাবে প্রয়োগ করেনি, যা সংশোধনের প্রয়োজন। ১৯৯০-এর দশকের শেষদিকে সি কে আরও সংশোধিত আকারে প্রকাশ করা হয়। ফলে ১৯৯৯ সালে ISO/IEC 9899:1999 প্রকাশ করা হয়, যাকে সাধারণত "সি৯৯" বলা হয়। টেকনিক্যাল করিজেন্ডা দ্বারা এটি তিনবার সংশোধন করা হয়েছে। সি৯৯-এ বেশ কিছু নতুন বৈশিষ্ট্য যুক্ত হয়েছে, যার মধ্যে রয়েছে ইনলাইন ফাংশন, বেশ কয়েকটি নতুন ডেটা টাইপ (যেমন : long int) এব জটিল সংখ্যার জন্য (complex),পরিবর্তনশীল-দৈর্ঘ্যের অ্যারে এবং নমনীয় অ্যারের সদস্য, IEEE 754 ফ্লোটিং পয়েন্টের জন্য উন্নত ভ্যরিয়াবেল, (ভেরিয়েবলের ম্যাক্রো), এবং // দিয়ে শুরু হওয়া এক-লাইনের মন্তব্য ইত্যাদি। BCPL বা সি++ এর মতো অনেক প্রোগ্রামিং ভাষা ইতিমধ্যেই বেশ কয়েকটি সি কম্পাইলারে এটি এক্সটেনশন হিসাবে ব্যবহার করা হয়েছে। সি৯৯ অধিকাংশ যায়গায় সি৯০ এর সাথে মিলে যায়, কিন্তু কিছু বিষয়ে নিয়মগুলো আরো কঠোর করা হয়। বিশেষ করে, একটি ভ্যরিয়েবল যেখানে ডাটা টাইপ নির্দিষ্ট করা বলা নেই, সেটিকে আর int হিসাবে ধরে নেওয়া. সি৯৯ সমর্থন উপলব্ধ রয়েছে তা নির্দেশ করার জন্য একটি কোড ম্যাক্রো __STDC_VERSION__ মান 199901L দিয়ে সংজ্ঞায়িত করা হয়েছে।জিসিসি, সোলারিস স্টুডিও, এবং অন্যান্য সি কম্পাইলার এখন[কখন?] সি৯৯ এর অধিকাংশ বা সমস্ত নতুন বৈশিষ্ট্য সমর্থন করে।মাইক্রোসফট ভিজুয়াল সি++-এর সি কম্পাইলার, তবে, C89 স্ট্যান্ডার্ড এবং সি৯৯-এর সেই নিয়মগুলো মেনে চলে যেগুলো সি++11-এর সাথে সামঞ্জস্যপূর্ণ। ২০০৭ সালে, সি স্ট্যান্ডার্ডের আরেকটি সংশোধনের কাজ শুরু হয়, যাকে অনানুষ্ঠানিকভাবে "সি১এক্স" বলা হয়। ২০১১-১২-০৮ তারিখে ISO/IEC 9899:2011 এর আনুষ্ঠানিক প্রকাশনা প্রকাশের পূর্ব পর্যন্ত এটি একটি স্ট্যান্ডার্ড ছিলো। সি স্ট্যান্ডার্ড কমিটি নতুন বৈশিষ্ট্য সংযোজন সীমিত করার জন্য নির্দেশিকা গ্রহণ করেছে যা বিদ্যমান বাস্তবায়ন দ্বারা পরীক্ষা করা হয়নি। C11 স্ট্যান্ডার্ড C এবং লাইব্রেরিতে অসংখ্য নতুন বৈশিষ্ট্য যোগ করে, যার মধ্যে রয়েছে টাইপ জেনেরিক ম্যাক্রো, নামহীন কাঠামো, উন্নত ইউনিকোড, পারমাণবিক অপারেশন, মাল্টি-থ্রেডিং এবং বাউন্ড-চেকড ফাংশন। এটি বিদ্যমান C99 লাইব্রেরির কিছু অংশকে ঐচ্ছিক করে তোলে এবং C++ এর সাথে সম্পৃক্ততা বাড়ায়। সি১১ এ স্ট্যান্ডার্ড ম্যাক্রো __STDC_VERSION__ কে 201112L হিসাবে সংজ্ঞায়িত করা হয়েছে। সি প্রোগ্রামিং ভাষায় কীওয়ার্ড বলতে বোঝায় সেইসব সংরক্ষিত শব্দসমূহকে যেগুলো একটি বিশেষ অর্থ প্রকাশ করে। সি৮৯ এ এরকম ৩২টি কীওয়ার্ড আছে। সি৯৯ এ এরকম আরো পাঁচটি কীওয়ার্ড যুক্ত হয়। সি১১ তে যুক্ত হয় আরো সাতটি কীওয়ার্ড। সি এর অপারেটরগুলো হল - সি #প্রোগ্রামিং ভাষার উদাহরণ : Hello World হল একটি সাধারণ প্রোগ্রামিং হলো। সি প্রোগ্রামিং কোডের আদর্শ উদাহরণ সি তে উপাত্তের ধরন মুলত তিন প্রকারঃ ANSI কর্তৃক নির্ধারিত উপাত্তের ধরন সমুহ কে অন্তর্নির্মিত বা বিল্ট ইন উপাত্তের ধরন বা অপরিহার্য উপাত্তের ধরন বলে। অন্তর্নির্মিত উপাত্তের ধরন সাধারনত ৪ প্রকারঃ একই ধরনের বা সমপ্রকৃতির ডেটা টাইপের গুচ্ছকে অ্যারে বলা হয়। [তথ্যসূত্র প্রয়োজন] অ্যারের একটি নির্দিষ্ট নাম থাকে। '[ ]' তৃতীয় বন্ধনীর সাহায্যে অ্যারের নামের সাথে অ্যারে সাইজ লেখা হয়, যা অ্যারে ভেরিয়েবলের(Variable) সর্বোচ্চ ডেটার সংখ্যা নির্দেশ করে। এই সংখ্যাকে অ্যারের ইনডেক্স(Index) বলা হয়। যেমন, একটি অ্যারে— int num; এখানে  দ্বারা অ্যারের ইনডেক্স প্রকাশ করে। int num; অ্যারেটিতে মোট পাঁচটি চলক(Variable) আছে। যেমন, ১ম— num , ২য়— num , ৩য়— num , ৪র্থ— num , ৫ম— num একই ধরনের অনেকগুলো ভেরিয়েবলের জন্য অ্যারে ব্যবহার করা হয়। ধরা যাক, ৬টি সংখ্যার জন্য ৬টি ভেরিয়েবল ঘোষণা করতে হবে। যেমন, int num0, num1, num2, num3, num4, num5; এভাবে ভেরিয়েবল ঘোষণা করা বেশ সময়সাপেক্ষ এবং কষ্টকর। তাই এটাকে সহজ করার জন্য অ্যারে ব্যবহার করা হয়। যেমন, int num; অ্যারের উপাদানগুলো মেমোরিতে পাশাপাশি অবস্থান করে। প্রোগ্রাম নির্বাহের সময়ে স্টাটিক অ্যারের আকার কখনো পরিবর্তন করা যায় না। ইতিহাস অনুযায়ী সি কখনো কখনো ওয়েব ডেভেলাপমেন্টেও ব্যবহার করা হতো এবং সেক্ষেত্রে কমন গেটওয়ে ইন্টারফেস (সিজিআই) কে ওয়েব অ্যাপ্লিকেশন, সার্ভার এবং ব্রাউজারের মধ্যকার তথ্য আদানপ্রদানের "গেটওয়ে" হিসেবে ব্যবহার করা হতো। "ইন্টারপ্রিটেড" প্রোগ্রামিং ভাষাগুলোর থেকে গতি, স্থিতিশীলতা ও বৈশ্বিক প্রাপ্যতা বেশি হবার কারণে সি প্রায়ই প্রাধান্য পেয়ে এসেছে। বর্তমানে সিতে ওয়েব ডেভেলাপমেন্ট করা হয়না এবং ওয়েব ডেভেলাপমেন্টের জন্য প্রচুর সরঞ্জাম সি এর বদলে সহজলভ্য রয়েছে। সি এর সহজলভ্যতা ও কার্যকারিতার ফলাফল হিসেবে অন্যান্য প্রোগ্রামিং ভাষার কম্পাইলার, লাইব্রেরি ও ইন্টারপ্রেটার প্রস্তুতে প্রায়ই সি ব্যবহার করা হয়। উদাহরণ হিসেবে পাইথনের রেফারেন্স ইমপ্লিমেন্টেশন, পার্ল, রুবি এবং পিএইচপির কথা উল্লেখ করা যায়, যাদের প্রত্যেককেই সি ব্যবহার করে লেখা হয়েছে।