প্রোগ্রামিং প্রতিযোগিতা এবং প্রতিযোগিতায় সি ++ কেন প্রাধান্য পাচ্ছে? [বন্ধ]


23

আমি বুঝতে পেরেছি যে সি ++ একটি খুব দ্রুত ভাষা, কিন্তু সি তেমন তত দ্রুত বা কিছু ক্ষেত্রে দ্রুত নয়?

তারপরে আপনি বলতে পারেন যে সি ++ এর ওওপি রয়েছে তবে বেশিরভাগ প্রোগ্রামিং ধাঁধাতে আপনার যে পরিমাণ ওওপি দরকার তা বড় নয়, এবং আমার মতে সি এটি পরিচালনা করতে সক্ষম হবে।

এখানে কেন আমি এটি জিজ্ঞাসা করছি : আমি প্রোগ্রামিং প্রতিযোগিতা এবং প্রতিযোগিতায় খুব আগ্রহী এবং আমি সেগুলিতে সি তে কোডিং করতে অভ্যস্ত। তবে, আমি লক্ষ্য করেছি যে বিস্তৃত লোকেরা সি ++ ব্যবহার করে (যেমন, গুগল কোড জ্যাম ২০১১-এর 25 চূড়ান্ত প্রার্থীদের মধ্যে 17 এটি ব্যবহার করেছে, যখন কেউ সি ব্যবহার করেনি), তাই আমি ভাবছি যে আমি সি এর সাথে যাওয়ার অসুবিধায় আছি কিনা?

অবজেক্ট ওরিয়েন্টেশন বাদে প্রোগ্রামিং প্রতিযোগিতার জন্য সি ++ আরও উপযুক্ত ভাষা কী করে? প্রতিযোগিতাগুলিতে আরও ভাল অভিনয় করার জন্য আমার যে ভাষাটি শেখার এবং ব্যবহার করা উচিত সেগুলির বৈশিষ্ট্যগুলি কী কী?

পটভূমির জন্য, আমি নিজেকে সিতে বেশ দক্ষ মনে করি, তবে আমি কেবল সি ++ শিখতে শুরু করছি।

উত্তর:


56

শুরু করার জন্য, সবসময় এমন কিছু সমস্যা থাকবে যা এক ভাষাতে অন্যের চেয়ে ভাল সমাধান করা যায়। "আরও ভাল" এর কিছু সংজ্ঞার জন্য এখানে সবসময় এমন ভাষা থাকবে যা অন্য যে কোনও ভাষার চেয়ে নির্দিষ্ট সমস্যাগুলি "আরও ভাল" সমাধান করে। তবে, খুব খুব বড় সংখ্যক সমস্যার খুব অনুরূপ চাহিদা রয়েছে (কিছু আই / ও, কিছু গণনা) এবং অনুরূপ প্রয়োজনীয়তার মুখোমুখি হয় (যুক্তিসঙ্গত নির্ভরযোগ্যতা, যুক্তিসঙ্গত কর্মক্ষমতা)।

যেমন আপনি ইতিমধ্যে সি জানেন, সেখানে প্রচুর সমস্যার জন্য, আমি জানিয়েছি যে সি ++ কোনও উল্লেখযোগ্য ডাউনসাইড এবং বেশ কয়েকটি উল্লেখযোগ্য উন্নতি সরবরাহ করে না। সাহসী? কিছু লোক মনে হয় এটি মনে করে তবে এটি সত্যই ঘটনা the আসুন কয়েকটি খুব সাধারণ সি ++ ভুল বোঝাবুঝি পরিষ্কার করে শুরু করি:

  • সি ++ সি-র চেয়ে ধীরে ধীরে ! অনেক সি প্রোগ্রাম বৈধ সি ++ প্রোগ্রামও হয় - এবং সি সি সংকলক বা সি ++ সংকলক দুটি দিয়ে সংকলিত হওয়ার সাথে এই জাতীয় সি প্রোগ্রাম অভিন্ন গতিতে চলতে হবে।

  • সি ++ নির্দিষ্ট বৈশিষ্ট্যগুলির জন্য ওভারহেড প্রয়োজন। ভুল! নির্দিষ্ট সি ++ নির্দিষ্ট বৈশিষ্ট্য (যেমন ভার্চুয়াল ফাংশন কল বা ব্যতিক্রমগুলি) দ্বারা পরিচিত তথাকথিত ওভারহেড আপনি ওভারহেডের সাথে তুলনীয় যা আপনি নিজেই পরিচয় করিয়ে দিবেন যদি আপনি সি তে একই বৈশিষ্ট্যটি প্রয়োগ করেন should

  • সি ++ অবজেক্ট ওরিয়েন্টেড। ভুল! সি ++ ভাষাতে কিছু ভাষার বর্ধন রয়েছে যা অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এবং জেনেরিক প্রোগ্রামিংয়ে সহায়তা করে। সি ++ কোথাও অবজেক্ট ওরিয়েন্টড ডিজাইনকে জোর করে না - এটি কেবল এটির অনুমতি দেয়। সি পাশাপাশি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়েরও অনুমতি দেয়, সি ++ কেবল এটিকে সহজ এবং কম ত্রুটি-প্রবণ করে তোলে।

সুতরাং, আপনি যদি আমাকে বিশ্বাস করেন তবে আমরা প্রতিষ্ঠিত করেছি যে "সি ++ সি এর চেয়ে উল্লেখযোগ্যভাবে খারাপ নয়"। আসুন দেখে নেওয়া যাক কী সি ++ কে আরও ভাল সি করে তোলে:

  • শক্তিশালী টাইপিং সি ++ এ টাইপ সিস্টেমটি সি এর চেয়ে বেশি শক্তিশালী This এটি অনেকগুলি সাধারণ প্রোগ্রামিং ত্রুটিগুলি প্রতিরোধ করে - পরবর্তী খুব গুরুত্বপূর্ণ বৈশিষ্ট্যটির সাথে মিলিতভাবে, শক্তিশালী টাইপ সিস্টেম এমনকি কোনও অসুবিধা না হওয়ার জন্য পরিচালনা করে।

  • প্যারামিটারাইজড প্রকারের টেমপ্লেট কীওয়ার্ডটি প্রোগ্রামারকে অ্যালগোরিদমের জেনেরিক (টাইপ-অজোনস্টিক) প্রয়োগকরণ লেখার অনুমতি দেয়। সি-তে যেখানে কেউ জেনেরিক তালিকা প্রয়োগের মতো উপাদান সহ লিখতে পারে:

    struct element_t {
      struct element_t *next, *prev;
      void *element;
     };
    

সি ++ এটিকে এমন কিছু লেখার অনুমতি দেয়:

template <typename T>
struct element_t {
   element_t<T> *next, *prev;
   T element;
};

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

সি রুটিন হিসাবে সংজ্ঞায়িত করা হয়:

void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

যদিও সি ++ রুটিন হিসাবে সংজ্ঞায়িত করা হয়

template void sort(RandomAccessIterator first, RandomAccessIterator last);

পার্থক্যটি হ'ল উদাহরণস্বরূপ, একটি পূর্ণসংখ্যার অ্যারে বাছাই করার জন্য, সি ক্ষেত্রে, প্রতিটি একক তুলনা করার জন্য একটি ফাংশন কল প্রয়োজন হবে, যেখানে সি ++ বাস্তবায়ন সংকলকটিকে পূর্ণসংখ্যার তুলনা কলগুলিকে ইনলাইন করার অনুমতি দেয়, আসল সাজানোর রুটিন হিসাবে সংকলক দ্বারা সংকলন সময়ে স্বয়ংক্রিয়ভাবে টেম্পলেট আর্গুমেন্টে সঠিক প্রকারগুলি সন্নিবেশিত হয়।

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

অবশ্যই, এসটিএল কোনও রূপালী বুলেট নয় - তবে সাধারণ সমস্যাগুলি সমাধান করার সময় এটি প্রায়শই একটি দুর্দান্ত সহায়তা সরবরাহ করে। কতবার আপনি সিতে একটি তালিকা প্রয়োগ করেছেন? আরবি-ট্রি কতবার ভাল সমাধান হতে পারত, যদি কেবল আপনি এটি করার সময় পেতেন? এসটিএল দিয়ে আপনার এ জাতীয় সমঝোতা করার দরকার নেই - গাছটি আরও ভাল ফিট হলে ব্যবহার করুন, তালিকাটি ব্যবহারের মতোই সহজ।

ঠিক আছে, তাই আমি কেবল ভাল অংশগুলি নিয়ে আলোচনা করেছি। কোন ডাউনসাইড আছে? অবশ্যই আছে। তবে দিন দিন তাদের সংখ্যা সঙ্কুচিত হচ্ছে। আমাকে বিস্তারিত বলতে দাও:

  • কোনও ভাল সি ++ সংকলক নেই এটি দীর্ঘ সময় ধরে এটির মতো ছিল। তবে আপনাকে অবশ্যই মনে রাখতে হবে যে ভাষাটি 1998 সালে প্রমিত করা হয়েছিল - এটি একটি জটিল ভাষা, সি এর চেয়েও জটিল comp এটি কম্পাইলারদের মান ধরে নিতে দীর্ঘ সময় নিয়েছে। তবে এই লেখাটি হিসাবে, সেখানে বহুল ব্যবহৃত ব্যবহৃত প্ল্যাটফর্মগুলির জন্য ভাল সংকলক উপলব্ধ রয়েছে; সংস্করণ ৩. এক্স-এ জিসিসি সাধারণত খুব ভাল, এবং এটি জিএনইউ / লিনাক্স এবং বেশিরভাগ ইউনিক্স প্ল্যাটফর্মগুলিতে চলে। উইন 32 এর জন্য ইন্টেলের একটি ভাল সংকলক রয়েছে - এটিও বেশ ভাল, তবে দুর্ভাগ্যক্রমে এটি এখনও এমএস এসটিএলে নির্ভর করে যা সাব-পার হয়।

  • লোকেরা ভাল সি ++ জানেন না এটি প্রায়শই শোনা অভিযোগ নয়, তবে এটি এমন একটি বিষয় যা আমি অনেক কিছুই দেখি। সি ++ একটি বড় এবং জটিল ভাষা - তবে এটি এমন একটি ভাষাও ব্যবহৃত হত যা প্রচুর সংক্রামিত হয়েছিল, বিশেষত "ওওপি ক্ষুধা নিবারণ করে, এইডস এবং ক্যান্সার নিরাময় করে" দিনগুলিতে। ফলাফলটি মনে হচ্ছে যে অনেকগুলি সত্যই দুর্বল সি ++ কোড, মূলত খারাপ সি এখানে কয়েক শ্রেণির ঘোষণার সাথে রয়েছে এবং এখানে রয়েছে এবং শেখার উপাদান হিসাবে ব্যবহৃত হচ্ছে। এর অর্থ প্রচুর লোক যারা বিশ্বাস করে যে তারা সি ++++++++++++++++++++++++++++++++++++++> G> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>वान্তवानंतंतাস্তান হয়? এটি খুব খারাপ, এবং এটি একটি সমস্যা তবে আমি মনে করি এটি সি ++ এর জন্য দোষ দেওয়া অন্যায্য।

সুতরাং, সি ++ সহ কেবলমাত্র দুটি প্রধান সমস্যা হ'ল সি ++ এর অল্প বয়স্ক ভাষা হওয়ার ফলাফল। সময়মতো তারা অদৃশ্য হয়ে যাবে। এবং সেখানকার বেশিরভাগ সমস্যার জন্য, আপনি যদি ভাল প্রোগ্রামার পেতে পারেন (বা নিজে ভাল সি ++ শিখতে পারেন) তবে সমস্যাগুলি আজকের দিনে আসলেই সমস্যা নয়।


8
+1 টি। খুব সম্পূর্ণ উত্তর। আমার কেবল ভিন্ন মতামতটি হল ভবিষ্যতে, সি ++ এর মূল ডাউনসাইডগুলি বিলুপ্ত হবে। যেহেতু সি ++ পিছনের দিকে সামঞ্জস্যপূর্ণ হতে হবে, তাই সি ++ থেকে প্রায় কোনও ভাষা বৈশিষ্ট্য সরানো হবে না, কেবলমাত্র নতুন যুক্ত করা হবে (সি ++ 11 এটির জন্য নিখুঁত উদাহরণ)। এটি ভাষাটিকে আজকের তুলনায় আরও জটিল করে তুলবে, যা সি ++ এর বৃহত্তম ক্ষুদ্রতম আইএমএইচওও।
ডক ব্রাউন

@ ডকব্রাউন: এটি আপনি সি ++ কীভাবে ব্যবহার করবেন তার উপর নির্ভর করে। যদি আপনি প্রচুর পুরানো কোড নিয়ে কাজ করছেন, আপনাকে কীভাবে এটি কাজ করে তা বুঝতে হবে এবং সুতরাং সম্ভবত সি ++ এর বিস্তৃত জ্ঞানের প্রয়োজন। যদি আপনি কেবল নতুন কোড লিখছেন (যেমন একটি প্রতিযোগিতায়) তবে আপনি নিজেকে যা ব্যবহার করতে যাচ্ছেন তার মধ্যে নিজেকে সীমাবদ্ধ রাখতে পারেন, প্রচুর ক্রাফ্ট এড়িয়ে (যেমন, বলুন auto_ptr<>)।
ডেভিড থর্নলি

দুর্দান্ত উত্তর, তবে আমি মনে করি "অনেক সি প্রোগ্রাম বৈধ সি ++ প্রোগ্রামগুলিও" যথেষ্ট শক্তিশালী নয় কারণ পার্থক্যগুলি কোড উত্পন্ন করে না। প্রায় প্রতিটি সি প্রোগ্রাম অপেক্ষাকৃত সামান্য প্রচেষ্টা সহ একটি বৈধ সি ++ প্রোগ্রাম হিসাবে কার্যকরভাবে সম্পাদনা হিসাবে আবার লেখা যেতে পারে।
রোবটটি

3

এর মতো প্রতিযোগিতা প্রোগ্রামারের গতির মতো প্রোগ্রামের গতি সম্পর্কে তেমন কিছু নয়। সি ++ এর স্ট্যান্ডার্ড লাইব্রেরি বৈশিষ্ট্য রয়েছে, সুরক্ষা টাইপ করুন, এবং মেমরি পরিচালনার জন্য সহায়তা যা এক্সিকিউটেবলটি কিছুটা ধীর গতিতে শেষ হলেও দ্রুত বিকাশ এবং ডিবাগিং করে।


2

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

কোড জাম প্রতিযোগীদের তাদের নিজস্ব কোড আনতে এবং তৃতীয় পক্ষের লাইব্রেরিগুলি ব্যবহার করার অনুমতি দেয়, সুতরাং তাত্ত্বিকভাবে কোনও প্রতিযোগী এই সমস্ত সি-তে প্রাক-বাস্তবায়িত করতে পারেন তবে সমস্ত প্রতিযোগিতা এটির অনুমতি দেয় না, এবং টেমপ্লেট এবং অপারেটর ওভারলোডিং এটিকে আরও পাঠযোগ্য করে তোলে সি এর চেয়ে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.