সি++

প্রোগ্রামিং ভাষা

সি++ (উচ্চারণ: সি প্লাস প্লাস) একটি সাধারণ-উদ্দেশ্য প্রোগ্রামিং ভাষা যা ১৯৮০ সালে সি ভাষার একটি বর্ধিতাংশ রূপ হিসেবে তৈরি করা হয়।বিয়ারনে স্ট্রোভস্ট্রুপ যুক্তরাষ্ট্রের এটিএন্ডটি বেল ল্যাবরেটরিতে এটি ডেভেলপ করেন। মূলত সিমুলা৬৭ এবং সি প্রোগ্রামিং ভাষার সুবিধাজনক বৈশিষ্ট্যগুলোর সমন্বয় সাধন করে সি++ তৈরি হয়।

সি++
প্যারাডাইমমাল্টি-প্যারাডাইম: প্রসিডিউরাল, ফাংশনাল, অবজেক্ট ওরিয়েন্টেড, মৌলিক
নকশাকারবিয়ারনে স্ট্রোভস্ট্রুপ
বিকাশকারী


প্রথম প্রদর্শিত১৯৮৩
স্থিতিশীল সংস্করণ
ISO/IEC 14882:2011 / ২০১১
টাইপিং পদ্ধতিStatic, unsafe, nominative
ওএসক্রস-প্ল্যাটফর্ম (বহু প্ল্যাটফর্ম)
ফাইলনেম এক্সটেনশন.h .hh .hpp .hxx .h++ .cc .cpp .cxx .c++
ওয়েবসাইটNews, status & discussion about Standard C++
মুখ্য বাস্তবায়নসমূহ
ক্ল্যাং, জিসিসি, মাইক্রোসফট ভিজুয়্যাল সি++, বোরল্যান্ড সি++ C++ Builder, clang, Comeau C/C++, GCC, Intel C++ Compiler, Microsoft Visual C++, Sun Studio
উপভাষাসমূহ
Embedded C++, Managed C++, C++/CLI, C++/CX
যার দ্বারা প্রভাবিত
C, Simula, Ada 83, ALGOL 68, CLU, ML
যাকে প্রভাবিত করেছে
Perl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#, Falcon, Seed7

এই ভাষা সময়ের সাথে উল্লেখযোগ্যভাবে সমপ্রসারিত হয়েছে। বর্তমানে আধুনিক সি++ এ  নিম্ন স্তরের স্মৃতি ম্যানিপুলেশন সুবিধা ছাড়াও অবজেক্ট-ওরিয়েন্টেড, জেনেরিক এবং বিভিন্ন কার্যকরী ফিচার আছে।এটি প্রায় সবসময় একটি সংকলিত ভাষা হিসেবে প্রয়োগ করা হয়, এবং অনেক বিক্রেতা যেমন মুক্ত সফটওয়্যার ফাউন্ডেশন, এলএলভিএম, মাইক্রোসফট, ইন্টেল, ওরাকল, এবং আইবিএম সহ সি++ কম্পাইলার সরবরাহ করে, তাই এটি অনেক প্ল্যাটফর্মে পাওয়া যায়। [১]

এটি একটি মধ্যম শ্রেণীর প্রোগ্রামিং ভাষা যাতে উচ্চ শ্রেণী এবং নিম্ন শ্রেণীর ভাষাগুলোর সুবিধা সংযুক্ত আছে।সি++ সিস্টেম প্রোগ্রামিং এবং এম্বেডেড, রিসোর্স-কনস্ট্রেইন্ড সফটওয়্যার এবং বৃহৎ সিস্টেম এর  কর্মক্ষমতা, দক্ষতা, এবং সহজ ব্যবহারের জন্য ডিজাইন করা হয়েছে.এছাড়াও সি++ কে অন্যান্য অনেক প্রসঙ্গে উপযোগী হিসেবে পাওয়া গেছে। এটি সর্বকালের অন্যতম জনপ্রিয় প্রোগ্রামিং ভাষা এবং সফটওয়্যার শিল্পে এটি বহুল ব্যবহৃত হয়। যেমন- সিস্টেম সফটওয়্যার, অ্যাপ্লিকেশন সফটওয়্যার, ডিভাইস ড্রাইভার, এম্বেডেড সফটওয়্যার, উচ্চ মানের সার্ভার ও ক্লায়েন্ট অ্যাপ্লিকেশন, বিনোদন সফটওয়্যার যেমন- ভিডিও গেম ইত্যাদি ক্ষেত্রে সি++ ব্যবহৃত হচ্ছে।

সি++ পরবর্তী সময়ে বিভিন্ন প্রোগ্রামিং ভাষাকে প্রভাবিত করেছে যার মধ্যে সর্বাপেক্ষা উল্লেখযোগ্য হচ্ছে জাভা

সি এর সাথে এখানে যা সংযুক্ত করা হয়েছে তার মধ্যে উল্লেখযোগ্য কিছু হল- প্রথমে শ্রেণী,পরবর্তীতে ভার্চুয়াল ফাংশন, অপারেটর ওভারলোডিং, মাল্টিপল ইনহেরিটেন্স, টেমপ্লেটস, ব্যতিক্রম গ্রহণ করার ক্ষমতা (exception handling), পলিমরফিজম ইত্যাদি।

সি++ ইন্টারন্যাশনাল অর্গানাইজেশন ফর স্ট্যান্ডার্ডাইজেশন (আইএসও) দ্বারা প্রমিত করা হয়।সি++ প্রোগ্রামিং ভাষা প্রাথমিকভাবে ১৯৯৮ সালে আইএসও/আইইসি ১৪৮৮২:১৯৯৮ হিসেবে প্রমিত করা হয়, যা পরে সি++০৩, সি++১১, সি++১৪ এবং সি++১৭ স্ট্যান্ডার্ড দ্বারা সংশোধন করা হয়। বর্তমান সি++২০ স্ট্যান্ডার্ড নতুন নতুন বৈশিষ্ট্য এবং একটি বর্ধিত আদর্শ লাইব্রেরী দ্বারা পূর্বের সকল স্ট্যান্ডার্ডকে ছাড়িয়ে গিয়েছে।  ১৯৯৮ সালে প্রাথমিক প্রমিতকরণের  আগে, সি ভাষার বর্ধিতকরণ হিসেবে ড্যানিশ কম্পিউটার বিজ্ঞানী বিয়ারনে স্ট্রোভস্ট্রপ সি++ কে ডেভেলপ করেন।তিনি সি এর মতো একটি দক্ষ ও নমনীয় ভাষা তৈরী করতে চেয়েছিলেন যেটি সি এর মতই উচ্চমানের ফিচারযুক্ত হবে।২০১২ সাল থেকে সি++ তিন বছরের মুক্তির সময়সূচীতে রয়েছে[২] এবং এর পরবর্তী মুক্তি সি++২৩ স্ট্যান্ডার্ড এর সাথে।[৩]

ইতিহাস সম্পাদনা

 
বিয়ারনে স্ট্রোভস্ট্রুপ

আশি ও নব্বইয়ের দশকে বেশিরভাগ সফটওয়্যার ডেভেলপাররা যে প্রোগ্রামিং ভাষাটা বেশি ব্যবহার করতেন, তা হলো "সি"। সি বের হবার পর থেকে এখন পর্যন্ত অ্যাপল কিংবা পিসিতে ম্যাক ওএস, ডস, উইন্ডোজ, লিনাক্স থেকে শুরু করে এসব অপারেটিং সিস্টেমে চালিত বেশিরভাগ প্রোগ্রাম লেখা হয় সি দিয়ে। সি দিয়ে যত বড় বড় প্রোগ্রাম লেখা হয়েছে, আর কোনও প্রোগ্রামিং ভাষায় তা হয়নি।এমবডেড সিস্টেম থেকে আরম্ভ করে অপারেটিং সিস্টেম, গ্রাফিক্স অ্যাপ্লিকেশন, ক্লায়েন্ট/সার্ভার ডেটাবেজ, থ্রিডি গেমস্, ডেটা কম্প্রেশন, নেটওয়ার্কিং, ভাইরাস, এন্টিভাইরাস সহ আরও অনেক ধরনের প্রোগ্রাম লেখা হয় সি দিয়ে। কিন্তু সি দিয়ে এতো কিছু করা গেলেও বড় প্রোগ্রাম তৈরী করতে গিয়ে কিছু সমস্যা ধরা পড়ে। যেমন কোনও প্রোগ্রাম যদি বেশি বড় মানে ১ লক্ষ লাইনের উপর হয়ে যায়, তাহলে সেই প্রোগ্রামের কিছু পরিবর্তন করতে গেলে কিংবা নতুন কিছু যোগ করতে গেলে অনাকাঙ্খিত কিছু ভুলও প্রোগ্রামে যোগ হতে পারে। কেননা সি তে প্রোগ্রাম লেখার জন্য স্ট্রাকচারড কিংবা প্রসিডিউরাল প্রোগ্রামিং পদ্ধতি অনুসরণ করা হয়। আর এই পদ্ধতিতে যেভাবে ডেটা এবস্ট্রাকশন করা হয়, সেক্ষেত্রে প্রোগ্রাম বড় হয়ে গেলে সব ডেটার প্রতি ঠিকমতো নজর দেয়া যায় না। ১৯৮০ সালে এটিএন্ডটি বেল ল্যাবরেটরিজইউনিক্স কার্নেল নিয়ে গবেষণা করতে গিয়ে বিয়ারনে স্ট্রোভস্ট্রুপ এ ধরনের কিছু সমস্যার সম্মুখীন হোন। তখন তিনি নতুন একটা প্রোগ্রামিং ভাষা তৈরী করার চেষ্টা করেন। এই প্রোগ্রামিং ভাষা তৈরী করার সময় এর প্রাথমিক উপাদানগুলোর জন্য নতুন সিনট্যাক্স তৈরী না করে সে সময়কার সবচেয়ে বেশি ব্যবহৃত ল্যাঙ্গুয়েজ সি-টাকে বেছে নেন এবং সেই সাথে আরও কিছু ল্যাঙ্গুয়েজের ভালো ফিচার তিনি এই নতুন ল্যাঙ্গুয়েজে যোগ করেন। যেমন সিমুলা থেকে নেন অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর ধারণা, অ্যাডা'র জেনেরিক এর ধারণাটা যোগ করেন টেম্পেলেট হিসেবে প্রভৃতি।[৪] আর এভাবে যে নতুন প্রোগ্রামিং ভাষা তৈরী করা হয়, শুরুতে তার নাম দেয়া হয়েছিলো "C with Classes"।

১৯৮৩ সাল পর্যন্ত নতুন এই ভাষাটা শুধুমাত্র এটিএন্ডটি বেল ল্যাবরেটরিজ এর ভেতরেই ব্যবহার করা হতো। ১৯৮৩ সালের জুলাই মাসে এটাকে প্রথম এটিএন্ডটি বেল ল্যাবরেটরিজ এর বাইরে প্রোগ্রাম তৈরী করার জন্য ব্যবহার করা হয়। এ বছরই "C with Classes" নামটা রিক মাসিত্তি পরিবর্তন করে রাখেন সি++। এই নামকরণের পেছনে যুক্তিটা হলো এরকম, সি তে ++ হলো ইনক্রিমেন্ট অপারেটর এবং "C with Classes" হলো সি এরই বর্ধিত ভার্সন। তাই নাম দেয়া হলো সি++।

প্রমিতকরণ সম্পাদনা

সাল সি++ স্ট্যান্ডার্ড অনানুষ্ঠানিক নাম
১৯৯৮ আইএসও/আইইসি ১৪৮৮২:১৯৯৮[৫] সি++৯৮
২০০৩ আইএসও/আইইসি ১৪৮৮২:২০০৩[৬] সি++০৩
২০০৭ আইএসও/আইইসি টিআর ১৯৭৬৮:২০০৭ সি++টিআর১
২০১১ আইএসও/আইইসি ১৪৮৮২:২০০৩[৭] সি++১১
২০১৪ এন৩৬৯০ (ওয়ার্কিং ড্রাফট সি++১৪)[৮] সি++১৪
২০১৭ আইএসও/আইইসি ১৪৮৮২:২০১৭[৯] সি++১৭

নামকরণ সম্পাদনা

সি++ নামটি এসেছে সি নামক প্রোগ্রামিং ভাষা থেকে। সি ভাষাতে পর পর দুটি যোগ চিহ্ন ব্যবহার করার অর্থ হলো কোন কিছুর মান এক বাড়ানো। অনেকটা সেই অর্থেই সি (প্রোগ্রামিং ভাষা)-এর এক ধাপ উপরের একটি প্রোগ্রামিং ভাষা হিসেবে সি++ নামকরণটি এসেছে।তবে সি এবং সি++ এর প্রোগ্রাম কোডে অনেকটা পার্থক্য বিদ্যমান। কেননা সি হল ফাংশন নির্ভর ভাষা এবং সি++ হল বস্তু সংশ্লিষ্ট ( অবজেক্ট অরিয়েন্টেড) ভাষা। এটি মূলত সি ভাষার বর্ধিত রুপ।

ভাষা সম্পাদনা

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    return  0;  
}

আউটপুট : Hello World!

অপারেটর এবং অপারেটর ওভারলোডিং সম্পাদনা

সি++ এর ৩৫টির অধিক অপারেটর আছে যাদের মধ্যে অন্যতম হল বেসিক অ্যারিথমেটিক, বিট ম্যানিপুলেশন, ইন্‌ডিরেকশন, কম্পারিজন, লজিকাল এবং অন্যান্য অপারেটর। প্রায় সব অপারেটরকেই ইউজার ডিফাইনড টাইপ এর ওপর ভিত্তি করে ওভারলোড করা যাবে কিছু ব্যতিক্রম ছাড়া। ব্যতিক্রমগুলো পাশের টেবিলে দেওয়া আছে। মূলত অপারেটর ওভারলোডিং এসেছে যেন ইউজার ডিফাইনড ডাটা টাইপকে বিল্ট্‌ ইন ডাটা টাইপ এর মত ব্যবহার করা যায়। এছাড়া ওভারলোডিং উচ্চতর সি++ এরও অনেক জায়গায় ব্যবহৃত হয়। যেমন, স্মার্ট পয়েন্টার। অপারেটর ওভারলোডিং করলেও ওভারলোডেড অপারেটরের হিসাব করার অগ্রগণ্যতার পরিবর্তন ঘটে না, এমনকি অপারেটরটির অপারেন্ড এর সংখ্যাও অপরিবর্তনীয় থাকে। ওভারলোডেড"&&" এবং "||" অপারেটর তাদের সর্ট-সার্কিট মূল্যায়ন ধর্ম হারিয়ে ফেলে।

যেসকল অপারেটর ওভারলোড করা যায় না
অপারেটর প্রতীক
স্কোপ রেজ্যুলেশন অপারেটর ::
কন্ডিশনাল অপারেটর ?:
ডট অপারেটর .
মেম্বার সিলেকশন অপারেটর .*
সাইজ-অফ (sizeof) অপারেটর sizeof
টাইপ-আইডি (typeid) অপারেটর typeid

ল্যামডা এক্সপ্রেশন সম্পাদনা

সি++ নিচের কোড ফর্ম এর মাধ্যমে ল্যামডা এক্সপ্রেশন সহায়তা দিয়ে থাকেঃ

[capture](parameters) -> return_type { function_body }

যদি ল্যামডা কোনো প্যারামিটার না নেয় তাহলে নিচের মতো করে () বাদ দেওয়া যায়ঃ

[capture] -> return_type { function_body }

সম্ভব হলে ল্যামডা এক্সপ্রেশনের রিটার্নকে স্বয়ংক্রিয় ভাবেই অনুমান করা যেতে পারে, উদাহরনঃ

[](int x, int y) { return x + y; } // inferred
[](int x, int y) -> int { return x + y; } // explicit

এক্সসেপশন হ্যান্ডেলিং সম্পাদনা

এক্সসেপশন হ্যান্ডেলিং হচ্ছে এমন এক ফিচার যেটি প্রোগ্রাম এর রানটাইম সমস্যা বা কোন ত্রুটির জন্য এর শনাক্তকারী স্থান হতে যে স্থানে এই সমস্যা গুলোর সমাধান করা যাবে সেই পর্যন্ত যে সংযোগ ব্যবস্থা গড়ে তোলে।

যদিও কিছু সি++ শৈলী সহায়িকা(C++ Style Guides) যেমন গুগলের[১০],এলএলভিএম(LLVM) এর[১১] এবং কিউটি(Qt) এর[১২] শৈলী সহায়িকা এই এক্সসেপশন এর ব্যবহার নিষিদ্ধ করেছে।

#include <iostream>
#include <vector>
#include <stdexcept>

int main() {
    try {
        std::vector<int> vec{3, 4, 3, 1};
        int i{vec.at(4)}; // Throws an exception, std::out_of_range (indexing for vec is from 0-3 not 1-4)
    }
    // An exception handler, catches std::out_of_range, which is thrown by vec.at(4)
    catch (std::out_of_range &e) {
        std::cerr << "Accessing a non-existent element: " << e.what() << '\n';
    }
    // To catch any other standard library exceptions (they derive from std::exception)
    catch (std::exception &e) {
        std::cerr << "Exception thrown: " << e.what() << '\n';
    }
    // Catch any unrecognised exceptions (i.e. those which don't derive from std::exception)
    catch (...) {
        std::cerr << "Some fatal error\n";
    }
}

স্ট্যান্ডার্ড লাইব্রেরি সম্পাদনা

সি++ এর স্ট্যান্ডার্ড দুইটি অংশ নিয়ে গঠিতঃ মূল ভাষা ও স্ট্যান্ডার্ড লাইব্রেরি। সি++ এর প্রায় সকল প্রধান বাস্তবায়নের ক্ষেত্রে প্রোগ্রামাররা দ্বিতীয়টিকেই বেশি সুবিধাজনক হিসেবে দেখে। এটি সমগ্র টাইপস(ভেকটর,লিস্ট,ম্যাপ,সেট,অ্যারে ইত্যাদি),অ্যালগরিদম,ইনপুট-আউটপুট সুবিধা,অ্যাটোমিক সাপোর্ট,ফাইল সিস্টেম লাইব্রেরি, টাইম ইউটিলিটিস( বর্তমান সময় নির্ধারণ),সি++ এক্সেপশন ব্যবহার করে না এমন ত্রুটি রিপোর্টিং গুলোকে সি++ এক্সেপশনে রুপান্তরের পদ্ধতি, হালকা পরিমার্জিত স্ট্যান্ডার্ড লাইব্রেরির ভার্সন ইত্যাদি নিয়ে গঠিত।

সি++ এর লাইব্রেরির বড় অংশই স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি এর  উপর নির্ভরশীল। STL কর্তৃক সরবরাহকৃত গুরুত্বপূর্ণ কিছু সরঞ্জাম হলো বিভিন্ন অবজেকট এর সংগ্রহশালা হিসেবে  কন্টেইনারস,অ্যারে দ্বারা কন্টেইনারস এক্সসেস করার জন্য ইটারেটর এবং অ্যালগরিদম যা দ্বারা বিভিন্ন ছোট ছোট কাজ যেমন সার্চিং ও সর্টিং সম্পাদিত হয়।

এছাড়াও মাল্টি ম্যাপ, মাল্টি সেট ও STL কর্তৃক সরবরাহ করা হয় এবং এসকল উপাদান একটি সামঞ্জস্যপূর্ণ ইন্টারফেস তৈরি করে।অর্থাৎ টেমপ্লেট ব্যবহার করে খুবই সাধারণ অ্যালগরিদম লেখা সম্ভব যা যেকোনো কনটেইনার এর সাথে বা ইটারেটর দ্বারা ডিফাইনকৃত যেকোনো ক্রমের সাথে কাজ করতে পারে।সি এর মতো করে লাইব্রেরির এই উপাদান গুলো উপলব্ধ করতে #include ডিরেক্টিভ ব্যবহার করে প্রোগ্রামে স্ট্যান্ডার্ড শিরোনাম যুক্ত করা হয়।সি++ স্ট্যান্ডার্ড লাইব্রেরি এমন ১০৫ টি স্ট্যান্ডার্ড শিরোনাম সরবরাহ করে।

উদাহরণ সম্পাদনা
#include<iostream> //#include is the directive and iostream is a standard header

স্ট্যান্ডার্ড এর সাথে লাইব্রেরির যে একীভূতকরণ সেটির আসল নকশা করেছিলেন আলেক্সানডার স্টেপানভ যিনি বহু বছর ধরে সাধারণ অ্যালগরিদম এবং কনেটেইনারস নিয়ে গবেষণা চালিয়েছিলেন। সি++ দিয়ে শুরু করার পর তিনি বুঝতে পারলেন যে তিনি এমন এক প্রোগ্রামিং ল্যাংগুয়েজ পেয়েছেন যেটা দ্বারা অতিসাধারণ অ্যালগরিদম তৈরি করা সম্ভব।[১৩]

সি++ মূল সহায়িকা সম্পাদনা

সি++ মূল সহায়িকা[১৪] হলো সি++ এর আবিষ্কারক  বিয়ারনে স্ট্রোভস্ট্রুপ এবং সি++ এর আইএসও গ্রুপের উদ্যোক্তা ও চেয়ারম্যান হার্ব শাটার এর নেতৃত্বে নেওয়া একটি উদ্যোগ যেটা দ্বারা প্রোগ্রামাররা আধুনিক সি++ লেখার জন্য সি++ ১৪ এবং এর পরবর্তী ল্যাংগুয়েজ স্ট্যান্ডার্ড এর কার্যকর অনুশীলনের মাধ্যমে উপকৃত হয়; এবং সেই সাথে ডেভেলেপররাও যেন ত্রুটিপূর্ণ প্রোগ্রামিং ধরার জন্য কম্পাইলার ও স্ট্যাটিক চেকিং সরঞ্জাম ব্যবহার করে নতুন নীতি তৈরি করতে পারে সেই দিকেও লক্ষ্য রাখা হয়।

সি++ মুল সহায়িকার প্রধান লক্ষ্য হলো দক্ষতার সাথে ধারাবাহিকভাবে সি++ লেখা এবং এর রিসোর্সগুলোকে নিরাপদ রাখা।

২০১৫ সালে সিপিপিকন(CPPCon) এর উদ্বোধনী মূল নোটে সি++ মূল সহায়িকা ঘোষণা করা হয়।[১৫]

উপোযোগিতা সম্পাদনা

কম্পাইলার বিক্রেতাদের বৃহত্তর স্বাধীনতা দেওয়ার উদ্দেশ্যে সি++ স্ট্যান্ডার্ড কমিটি নেম ম্যাংগ্লিং,এক্সসেপশন হ্যান্ডেলিং এবং অন্যান্য নির্দিষ্ট কিছু বৈশিষ্ট্যগুলো বাস্তবায়নে নির্দিষ্ট নির্দেশনা না দেওয়ার সিদ্ধান্ত নেয়। এই সিদ্ধান্তের একটি নেতিবাচক দিক হলো যে বিভিন্ন কম্পাইলার দ্বারা তৈরি অবজেক্ট কোডগুলোর মধ্যে অসঙ্গতি পরীলক্ষিত হবে বলে ধারণা করা হয়।যদিও নির্দিষ্ট মেশিন ও অপারেটিং সিস্টেম এর জন্য কম্পাইলার গুলোকে আদর্শ মানদন্ডে আনার একটা প্রচেষ্টা করা হয়েছিল[১৬] যা এখন প্রায় পরিত্যক্ত বলে মনে হয়।

সি দ্বারা সম্পাদনা

সি++ কে প্রায়ই সি এর সুপারসেট হিসেবে ধরা হয় যেটা পুরোপুরিভাবে সত্য নয়।[১৭] বেশির ভাগ সি কোড  সি++ এ কম্পাইল করতে পারলেও কিছু সংখ্যক ভিন্নতার কারণে কিছু কিছু কার্যকর সি কোড সি++ এ অকার্যকর হিসেবে দেখায়। উদাহরণস্বরূপ, সি *void থেকে অন্য পয়েন্টার টাইপ এর মধ্যকার অন্তর্নিহিত রুপারন্তর সমর্থন করলেও সি++ সেটা করে না।এছাড়াও সি++ নতুন নতুন কিওয়ার্ড সঙ্গায়িত করতে পারে যেমন newএবং classযেখানে সি প্রোগ্রামে এগুলোকে আইডেনটিফায়ার(উদাহরণস্বরুপ ‘ভ্যারিয়েবল এর নাম’) হিসেবে ব্যবহার করা হয়।

১৯৯৯ সালে সি স্ট্যান্ডার্ড রিভিশন (C99) দ্বারা কিছু কিছু অসংগতি অপসারিত হয় যেটা বর্তমানে সি++ এর বৈশিষ্ট্য যেমন লাইন কমেন্টস (/ /) এবং মিশ্রিত কোড এর ডিকলেরেশন সমর্থন করে।অপরদিকে C99 এমন কিছু বৈশিষ্ট্য তুলে ধরে যেগুলো সি++ আগে সমর্থন করত না।

সি এবং সি++ কোড একত্রে মিশাতে, যেসকল ফাংশন ডিক্লেয়ার বা সঙ্গায়িত করতে হবে সেটা অবশ্যই সি ও সি++ ২ টাতেই ব্যবহার করতে হবে। এই ফাংশনগুলো ডিক্লেয়ার করতে অবশ্যই সি লিংকেজ ব্যবহার করতে হবে যেখানে এই লিংকেজকে আলাদা বাড়তি

extern "C" {/*...*/}

  ব্লকের সাথে প্রতিস্থাপন করতে হবে।

সমালোচনা সম্পাদনা

ব্যাপকভাবে গ্রহণযোগ্যতা থাকা সত্ত্বেও, কিছু উল্লেখযোগ্য প্রোগ্রামার লিনুস তোরভাল্ডস[১৮],রিচার্ড স্টলম্যান[১৯],জশুয়া ব্লক,কেন টম্পসন[২০][২১] এবং ডোনাল্ড নুথ[২২] সি++ ভাষার সমালোচনা করেছেন।

জশুয়া ব্লক এর মতে সি++ এর সবচেয়ে সমালোচিত বিষয়গুলোর মধ্যে অন্যতম হচ্ছে প্রোগ্রামিং ভাষা হিসেবে এর অনুভূত জটিলতা।

তিনি বলেন, “আমি মনে করি সি++ কে তার জটিলতার সীমা ছাড়িয়ে শক্তভাবে ধাক্কা দেওয়া হয়েছে এবং এখনো অনেকেই এটা ব্যবহার করে প্রোগ্রামিং করে। আমার দেখা অনেক দোকান আছে যারা সি++ ব্যবহার করছে বাধ্য হয়ে।তারা বলে যে তারা সি++ ব্যবহার করছে কিন্তু তারা বিভিন্ন ফিচার যেমন মাল্টিপল-ইম্পিলিনেশন ইনহেরিটেন্স,অপারেটর ওভারলোডিং ইত্যাদি ব্যবহার করছে না। এরকম আরো অনেকগুলো ফিচার আছে যেগুলো সি++ এ ব্যবহার খুবই কষ্টসাধ্য কারণ এর কোডিং ফলাফলের জটিলতা অত্যন্ত বেশি।আর আমি মনে করি না যে এটা একজন প্রোগ্রামার হিসেবে আপনার জন্য  একটা ভালো সূচনা। ”

ডোনাল্ড নুথ ১৯৯৩ সালে সি++ এর প্রাক-প্রমিতকরনে মন্তব্য করে এডজার ডিজকস্ট্রা সম্পর্কে কটাক্ষ করে বলেন যে “তিনি সি++ এ প্রোগ্রামিং এর কথা চিন্তা করলেই বিষয়টি তাকে শারীরিক ভাবে অসুস্থ করে তোলে।”[২২][২৩]

“আজ তাদের সাথে আমার যে সমস্যা আছে তা হচ্ছে... সি++ খুবই জটিল। এই মুহূর্তে, আমার পক্ষে পোর্টেবল কোড লেখা অসম্ভব যেগুলো আমি মনে করতাম সব সিস্টেমে কাজ করবে যদি না আমি তাতে উদ্ভট কোন বৈশিষ্ট্য যোগ করি।যখন সি++ ডিজাইনারদের কাছে সমস্যা সমাধানের জন্য দুইটি আলাদা আলাদা ধারণা আসল, তারা বলল যে তারা সেই দুইটি নিয়েই কাজ করবে। আর এই জন্যে সি++ আমার রুচিতে অদ্ভুত লাগে।”

কেন টম্পসন, যিনি বেল ল্যাবস-এর স্ট্রোভস্ট্রুপ এর সহকর্মী ছিলেন, তিনি সি++ সম্পর্কে মূল্যায়ন করেছেন:[২১]

“এর অবশ্যই কিছু ভালো দিক আছে।কিন্তু সব মিলিয়ে আমি মনে করি যে এটা একটি খারাপ প্রোগ্রামিং ভাষা।এটা অর্ধেক কাজ করে এবং এটা শুধু পরস্পর বিরোধী কিছু ধারণার আবর্জনার স্তুপ।যাদের কে আমি চিনি, হোক সে ব্যক্তি বা কর্পোরেট, একটি উপসেট নির্বাচন করে এবং এই উপসেটগুলো আলাদা।আর তাই এটি অ্যালগরিদম পরিবহনের জন্য ভালো ভাষা নয়।এটি খুবই বড় এবং জটিল।এবং এটি অবশ্যই একটি পরিষদ দ্বারা তৈরি। স্ট্রাস্ট্রাপ বছরের পর বছর ধরে প্রচারণা চালিয়েছেন, যে কোন ধরনের প্রযুক্তিগত অবদানের বাইরে, এটিকে গ্রহণ এবং ব্যবহার করার জন্য।সকল ফিচার যা একটি প্রোগ্রামিং ল্যাংগুয়েজ এ থাকতে পারে তিনি সেগুলর কোনোটাকেই না বলেননি।বরং এটাকে সব ফিচারের একটা আখড়া করা হয়েছে যেটাকে আসলেই পরিষ্কারভাবে ডিজাইন করা হয়নি। আর আমি মনে করি এভাবে এই প্রোগ্রামিং ল্যাঙ্গুয়েজ এর যথেষ্ট ক্ষতিসাধন করা হয়েছে।”

যাইহোক, বেল ল্যাবসের একজন সহকর্মী ব্রায়ান কারনিগান উপর্যুক্ত সমালোচনা নিয়ে বিতর্ক করেছেন:[২৪]

“সি++ অত্যন্ত প্রভাবশালী হয়েছে। ... অনেকে ই বলে সি++ অনেক বড় এবং খুব জটিল ইত্যাদি, কিন্তু আসলে এটি একটি শক্তিশালী ভাষা এবং সেখানে যা আছে তা একটি সঠিক কারণেই আছে: এটা কেউ এলোমেলো আবিষ্কার করেনি।আসলে মানুষ বাস্তব বিশ্বের সমস্যার সমাধান করার চেষ্টা করছে।আমরা  এখন যে সব প্রোগ্রাম গ্রহণ করি তার বেশির ভাগই হচ্ছে সি++ প্রোগ্রাম।”

স্ট্রোভস্ট্রুপ নিজেই মন্তব্য করেছেন যে সি++ প্রোগ্রামের লজিকগুলোর অর্থ এর সিনট্যাক্স এর  চেয়ে অনেক পরিষ্কার।[২৫]

সি++ এর অন্যান্য সমস্যার তুলনামূলক কম্পাইলেশন টাইম, রিফ্লেকশন ও গার্বেজ কালেকশন ফিচার এর অভাব এবং বিশেষ করে টেমপ্লেট মেটাপ্রোগ্রামিং হতে ভার্বোস ত্রুটি বার্তা ইত্যাদি উল্লেখযোগ্য।[২৬]

তথ্যসূত্র সম্পাদনা

  1. Bjarne Stroustrup (১৯৯৭)। The C programming language। Internet Archive। Addison-Wesley। আইএসবিএন 978-0-201-88954-3 
  2. "C++ IS schedule" (পিডিএফ) 
  3. "C++: Where It's Heading and It's New Features - DZone Web Dev"dzone.com (ইংরেজি ভাষায়)। সংগ্রহের তারিখ ২০২১-০৪-০৩ 
  4. "Evolving a language in and for the real world: C++ 1991-2006" (পিডিএফ) 
  5. 14:00-17:00। "ISO/IEC 14882:1998"ISO (ইংরেজি ভাষায়)। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  6. 14:00-17:00। "ISO/IEC 14882:2003"ISO (ইংরেজি ভাষায়)। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  7. 14:00-17:00। "ISO/IEC 14882:2011"ISO (ইংরেজি ভাষায়)। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  8. 14:00-17:00। "ISO/IEC 14882:2014"ISO (ইংরেজি ভাষায়)। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  9. 14:00-17:00। "ISO/IEC 14882:2017"ISO (ইংরেজি ভাষায়)। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  10. "Google C++ Style Guide"google.github.io। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  11. "C++"Wikipedia (ইংরেজি ভাষায়)। ২০২১-০৩-২১। 
  12. "Coding Conventions - Qt Wiki"wiki.qt.io। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  13. "STLport: An Interview with A. Stepanov"www.stlport.org। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  14. "C++ Core Guidelines"isocpp.github.io। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  15. "Bjarne Stroustrup announces C++ Core Guidelines : Standard C++"isocpp.org। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  16. "C++ ABI Summary"itanium-cxx-abi.github.io। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  17. "Stroustrup: FAQ"www.stroustrup.com। সংগ্রহের তারিখ ২০২১-০৩-২০ 
  18. "Re: [RFC] Convert builin-mailinfo.c to use The Better String Library. [LWN.net]"lwn.net। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  19. "Richard Stallman Agrees That C++ Sucks"harmful.cat-v.org। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  20. Binstock, rew; May 18; 2011। "Interview with Ken Thompson"Dr. Dobb's। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  21. "C++ in Coders at Work"। A billion monkeys can't be wrong (ইংরেজি ভাষায়)। ২০০৯-১০-১৬। 
  22. April 29; 2009। "An Interview with Donald Knuth"Dr. Dobb's। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  23. "DONALD KNUTH-Computer Literacy Bookshops Interview" 
  24. "Brian Kernighan Q&A - Computerphile" 
  25. "Stroustrup: FAQ"www.stroustrup.com। সংগ্রহের তারিখ ২০২১-০৩-২৩ 
  26. "C++ FQA Lite: Defective C++"yosefk.com। সংগ্রহের তারিখ ২০২১-০৩-২৩ 

বহিঃসংযোগ সম্পাদনা