সি ++ টেমপ্লেট ত্রুটি বার্তাগুলি এত ভয়ঙ্কর কেন?


28

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

template <class T>
void dosomething(T& x) { x += 5; }

যদি Tসমর্থন করে না +=অপারেটর, কম্পাইলার একটি ত্রুটির বার্তা উত্পন্ন করবে। এবং যদি এটি কোনও লাইব্রেরির অভ্যন্তরে গভীরভাবে ঘটে থাকে তবে ত্রুটি বার্তাটি কয়েক হাজার লাইন দীর্ঘ হতে পারে।

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

def dosomething(x):
   x.foo()

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


6
কিছু সংকলকগুলির ভয়াবহ ত্রুটি বার্তা রয়েছে, তবে অন্যান্য সত্যই ভাল ( clang++উইঙ্ক উইঙ্ক)।
বেনিয়ামিন বান্নিয়ার

2
সুতরাং আপনি সংকলন-সময় ব্যর্থ হওয়ার পরিবর্তে আপনার প্রোগ্রামগুলি রানটাইমে ব্যর্থ, শিপানো, কোনও গ্রাহকের হাতে, পছন্দ করবেন?
পি শেভেড

13
@ পাভেল, না এই প্রশ্নটি রানটাইম বনাম কমপাইল সময় ত্রুটি-চেকিংয়ের সুবিধা / অসুবিধাগুলি সম্পর্কে নয়।
চ্যানেল 72

1
বৃহত সি ++ টেমপ্লেট ত্রুটির উদাহরণ হিসাবে, এফডাব্লুআইডাব্লু
10470

উত্তর:


28

টেমপ্লেট ত্রুটি বার্তাগুলি কুখ্যাত হতে পারে তবে কোনওভাবেই সর্বদা দীর্ঘ এবং অপঠনযোগ্য নয়। এই ক্ষেত্রে, সম্পূর্ণ ত্রুটি বার্তা (জিসিসি থেকে) হ'ল:

test.cpp: In function void dosomething(T&) [with T = X]’:
test.cpp:11:   instantiated from here
test.cpp:6: error: no match for operator+=’ in x += 5

আপনার পাইথনের উদাহরণ হিসাবে, আপনি টেমপ্লেট ইনস্ট্যান্টেশন পয়েন্টগুলির একটি "স্ট্যাক ট্রেস" এবং সমস্যাটি নির্দেশ করে একটি পরিষ্কার ত্রুটি বার্তা পান।

কখনও কখনও, টেম্পলেট সংক্রান্ত ত্রুটি বার্তাগুলি বিভিন্ন কারণে অনেক বেশি সময় পেতে পারে:

  • "স্ট্যাক ট্রেস" আরও গভীর হতে পারে
  • প্রকারের নামগুলি আরও দীর্ঘ হতে পারে, যেহেতু টেম্পলেটগুলি অন্যান্য টেম্পলেট ইনস্ট্যান্টেশনের সাথে তাদের যুক্তি হিসাবে ইনস্ট্যান্টিয়েটেড হয় এবং তাদের সমস্ত নেমস্পেসের যোগ্যতা দিয়ে প্রদর্শিত হয়
  • যখন ওভারলোড রেজোলিউশন ব্যর্থ হয়, ত্রুটি বার্তায় প্রার্থীদের ওভারলোডগুলির একটি তালিকা থাকতে পারে (যার মধ্যে প্রতিটি বেশ কয়েকটি দীর্ঘ টাইপের নাম থাকতে পারে)
  • যদি কোনও স্থানে কোনও অবৈধ টেম্পলেট ইনস্ট্যান্ট করা হয় তবে একই ত্রুটিটি বহুবার রিপোর্ট করা যেতে পারে

পাইথন থেকে মূল পার্থক্য হ'ল স্থিতিশীল টাইপ সিস্টেম, যা ত্রুটি বার্তায় (কখনও কখনও দীর্ঘ) প্রকারের নাম অন্তর্ভুক্ত করার প্রয়োজনীয়তার দিকে পরিচালিত করে। এগুলি ছাড়াই ওভারলোড রেজোলিউশন কেন ব্যর্থ হয়েছিল তা নির্ণয় করা কখনও কখনও খুব কঠিন । তাদের সাথে, আপনার চ্যালেঞ্জটি এখন সমস্যাটি কোথায় তা অনুমান করার অপেক্ষা রাখে না, তবে হায়ারোগ্লিফিকগুলি যে এটি কোথায় তা আপনাকে বোঝাতে।

এছাড়াও, রানটাইমের সময় যাচাই করার অর্থ হ'ল প্রোগ্রামটি প্রথম ত্রুটির মুখোমুখি হয়ে থামবে, কেবল একটি একক বার্তা প্রদর্শন করবে। একটি সংকলক তার ত্রুটিযুক্ত সমস্ত ত্রুটি প্রদর্শন করতে পারে, যতক্ষণ না এটি ছেড়ে দেয়; কমপক্ষে সি ++ এ, এটি ফাইলের প্রথম ত্রুটিতে থামানো উচিত নয়, কারণ এটি পরবর্তী ত্রুটির ফলাফল হতে পারে।


4
আপনি কি পরে কোনও ত্রুটির ফলস্বরূপ কোনও ত্রুটির উদাহরণ দিতে পারেন?
Ruslan

12

কয়েকটি সুস্পষ্ট কারণগুলির মধ্যে রয়েছে:

  1. ইতিহাস। যখন সিসি, এমএসভিসি ইত্যাদি নতুন ছিল, তারা ত্রুটি বার্তাগুলি আরও ভালভাবে তৈরি করতে ডেটা সঞ্চয় করার জন্য প্রচুর অতিরিক্ত জায়গা ব্যবহার করতে পারে না। স্মৃতিশক্তি পর্যাপ্ত ছিল যা তারা করতে পারেনি।
  2. বছরের পর বছর ধরে, ভোক্তারা ত্রুটি বার্তার গুণমানকে উপেক্ষা করেছে, তাই বিক্রেতারা বেশিরভাগ ক্ষেত্রেই তা করেছিলেন।
  3. কিছু কোডের সাথে, সংকলক কোডটিতে পরে ত্রুটিগুলি পুনরায় সংহত করতে এবং ডায়াগনোসিস করতে পারে। টেমপ্লেটগুলিতে ক্যাসকেডের ত্রুটিগুলি এত খারাপভাবে ঘটে যে প্রথমটির কিছু কিছু প্রায় সর্বদা অকেজো।
  4. টেমপ্লেটগুলির সাধারণ নমনীয়তা আপনার কোডটিতে কোনও ত্রুটি ঘটলে আপনি সম্ভবত কী বোঝাতে চেয়েছিলেন তা অনুমান করা শক্ত করে তোলে ।
  5. কোনও টেম্পলেটটির অভ্যন্তরে কোনও নামের অর্থ টেমপ্লেটের প্রসঙ্গ এবং ইনস্ট্যান্টেশনের প্রসঙ্গে এবং যুক্তির উপর নির্ভরশীল অনুসন্ধানের ফলে আরও সম্ভাবনা যুক্ত হতে পারে both
  6. ফাংশন ওভারলোডিং কোনও নির্দিষ্ট ফাংশন কল যা উল্লেখ করতে পারে তার জন্য প্রচুর প্রার্থী সরবরাহ করতে পারে এবং কিছু সংকলক (উদাঃ, জিসিসি) দ্বিপাক্ষিততার সাথে তাদের সমস্তকে কর্তব্যতার সাথে তালিকাবদ্ধ করে।
  7. অনেক কোডার যারা উত্তীর্ণ মানগুলি প্রয়োজনীয়তা পূরণ করে তা নিশ্চিত করেই কখনও স্বাভাবিক প্যারামিটারগুলি ব্যবহার করার বিষয়টি বিবেচনা করবেন না, এমনকি টেমপ্লেট পরামিতিগুলি পরীক্ষা করার চেষ্টাও করবেন না (এবং আমাকে স্বীকারও করতে হবে, আমি নিজেই এই দিকে ঝুঁকছি)।

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

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


9

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

এছাড়াও, যেমন আপনি উল্লেখ করেছেন, পাইথন দোভাষী আপনাকে স্ট্যাক ট্রেস প্রদর্শন করে এটি আপনার পক্ষে অনেক সহজ করে তুলতে পারেন কারণ এটি পাইথন কোডটি ব্যাখ্যা করে। যদি কোনও সি ++ সংকলক কোনও টেম্পলেট ত্রুটিতে আঘাত করে এবং আপনাকে একটি স্ট্যাক ট্রেস দেয়, এটি "টেম্পলেট বমি হিসাবে" ঠিক ততটা অসন্তুষ্ট হবে, তাই না?

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