অপরিজ্ঞাত, অনির্ধারিত এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণ


529

সি এবং সি ++ এ অপরিবর্তিত আচরণ কী? অনির্দিষ্ট আচরণ এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণ সম্পর্কে কী? তাদের মধ্যে পার্থক্য কী?


1
আমি নিশ্চিত ছিলাম যে আমরা এই বেফোরটি সরিয়েছি, কিন্তু আমি এটি খুঁজে পাচ্ছি না। আরও দেখুন: stackoverflow.com/questions/2301372/...
dmckee --- সাবেক মডারেটরের বিড়ালছানা



1
এখানে একটি আকর্ষণীয় আলোচনা (বিভাগ "এনেক্স এল এবং অপরিজ্ঞাত আচরণ") is
ওয়েন

উত্তর:


404

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

আসুন একটি ক্লাসিক উদাহরণ দেখুন:

#include <iostream>

int main()
{
    char* p = "hello!\n";   // yes I know, deprecated conversion
    p[0] = 'y';
    p[5] = 'w';
    std::cout << p;
}

ভেরিয়েবলটি pস্ট্রিং আক্ষরিকের দিকে নির্দেশ করে "hello!\n"এবং নীচে দুটি অ্যাসাইনমেন্ট সেই স্ট্রিং আক্ষরিক সংশোধন করার চেষ্টা করে। এই প্রোগ্রামটি কি করে? সি ++ স্ট্যান্ডার্ডের ১১.১৪.৫ অনুচ্ছেদ অনুযায়ী, এটি অপরিজ্ঞাত আচরণের জন্য আহ্বান জানিয়েছে :

একটি স্ট্রিং আক্ষরিক সংশোধন করার চেষ্টা করার প্রভাবটি সংজ্ঞায়িত।

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

অনির্ধারিত আচরণ অন্যান্য উদাহরণ তার সীমা অতিক্রম একটি অ্যারের অ্যাক্সেস অন্তর্ভুক্ত, নাল পয়েন্টার dereferencing , বস্তু অ্যাক্সেস পর তাদের জীবদ্দশায় শেষ হয়েছে বা লেখার অভিযোগে চালাক এক্সপ্রেশন মত i++ + ++i

সি ++ স্ট্যান্ডার্ডের ১.৯ বিভাগে অপরিজ্ঞিত আচরণের দুটি কম বিপজ্জনক ভাই, অনির্দিষ্ট আচরণ এবং প্রয়োগ-সংজ্ঞায়িত আচরণের কথাও উল্লেখ করা হয়েছে :

এই আন্তর্জাতিক স্ট্যান্ডার্ডের শব্দার্থ বিবরণ একটি প্যারামিটারাইজড ননডেটারিস্টেমিক অ্যাবস্ট্রাক্ট মেশিনকে সংজ্ঞায়িত করে।

বিমূর্ত মেশিনের কয়েকটি বিষয় এবং ক্রিয়াকলাপগুলি এই আন্তর্জাতিক স্ট্যান্ডার্ডে বাস্তবায়ন-সংজ্ঞায়িত হিসাবে বর্ণনা করা হয়েছে (উদাহরণস্বরূপ, sizeof(int))। এগুলি বিমূর্ত মেশিনের প্যারামিটার গঠন করে। প্রতিটি বাস্তবায়নের ক্ষেত্রে এই বিষয়গুলির বৈশিষ্ট্য এবং আচরণের বর্ণনা দেওয়ার সাথে ডকুমেন্টেশন অন্তর্ভুক্ত থাকবে।

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

কিছু অন্যান্য ক্রিয়াকলাপ এই আন্তর্জাতিক স্ট্যান্ডার্ডে অপরিজ্ঞাত হিসাবে বর্ণনা করা হয়েছে (উদাহরণস্বরূপ, নাল পয়েন্টারকে অবজ্ঞা করার প্রভাব)। [ দ্রষ্টব্য : এই আন্তর্জাতিক স্ট্যান্ডার্ডটি এমন প্রোগ্রামগুলির আচরণের জন্য কোনও আবশ্যকতা আরোপ করে না যা অপরিজ্ঞাত আচরণ করে। - শেষ নোট ]

বিশেষত, বিভাগ 1.3.24 বলে:

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

অপরিবর্তিত আচরণে দৌড়াতে আপনি কী করতে পারেন? মূলত, আপনাকে লেখকরা ভাল সি ++ বই পড়তে হবে যারা জানেন তারা কী বিষয়ে কথা বলছেন। ইন্টারনেট টিউটোরিয়াল স্ক্রু। স্ক্রু বালচিল্ড।


6
এটি একটি বিস্ময়কর সত্য যা মার্জ হওয়ার ফলে এই উত্তরটি কেবল সি ++ জুড়েছে তবে এই প্রশ্নের ট্যাগগুলিতে সি'র "অপরিজ্ঞাত আচরণ" সম্পর্কে আলাদা ধারণা রয়েছে: আচরণের সাথেও বর্ণিত হয়ে থাকলেও ডায়গনিস্টিক বার্তা দেওয়ার জন্য এটি প্রয়োগের প্রয়োজন হবে নির্দিষ্ট নিয়ম লঙ্ঘনের জন্য সীমাবদ্ধ থাকবেন না (সীমাবদ্ধতা লঙ্ঘন)।
জোহানেস স্কাউব -

8
@ বেনোইট এটি সংজ্ঞায়িত আচরণ কারণ মান বলে যে এটি নির্ধারিত আচরণ, সময়কাল। কিছু সিস্টেমে, স্ট্রিং লিটারেলগুলি কেবল পঠনযোগ্য পাঠ্য বিভাগে সংরক্ষিত থাকে এবং আপনি যদি স্ট্রিং আক্ষরিক সংশোধন করার চেষ্টা করেন তবে প্রোগ্রামটি ক্র্যাশ হবে। অন্যান্য সিস্টেমে, স্ট্রিং আক্ষরিক প্রকৃতপক্ষে পরিবর্তিত প্রদর্শিত হবে। স্ট্যান্ডার্ডটি হ'ল আদেশ দেয় না what অপরিবর্তিত আচরণের অর্থ এটাই।
ফ্রেডওভারফ্লো

5
@ ফ্রেড ওভারফ্লো, কেন একটি ভাল সংকলক আমাদের এমন সংকলন করার অনুমতি দেয় যা সংজ্ঞায়িত আচরণ দেয়? ঠিক কি এই ধরনের কোড সংকলন করতে পারেন ভাল ? আমরা যখন সংজ্ঞায়িত আচরণ দেয় এমন কোডটি সংকলন করার চেষ্টা করছি তখন কেন সমস্ত ভাল সংকলক আমাদের একটি বিশাল লাল সতর্কবার্তা চিহ্ন দেয়নি?
পেসারিয়ার

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

4
@Celeritas, অনির্ধারিত আচরণ করতে অ নিয়ন্ত্রণবাদী হতে হবে। উদাহরণস্বরূপ, অজানা মেমরির বিষয়বস্তুগুলি কী হবে তা সময়ের আগে জানা অসম্ভব, যেমন। int f(){int a; return a;}: aফাংশন কলগুলির মধ্যে মানটির পরিবর্তন হতে পারে।
চিহ্নিত করুন

96

ভাল, এটি মূলত স্ট্যান্ডার্ড থেকে একটি সরাসরি কপি-পেস্ট

৩.৪.১ 1 বাস্তবায়ন-সংজ্ঞায়িত আচরণ অনির্দিষ্ট আচরণ যেখানে প্রতিটি প্রয়োগ কীভাবে পছন্দ করা হয় তা দলিল করে

2 উদাহরণ বাস্তবায়ন-সংজ্ঞায়িত আচরণের একটি উদাহরণ হ'ল অর্ডার বিটের প্রচার যখন একটি স্বাক্ষরকৃত পূর্ণসংখ্যা ডানদিকে সরানো হয়।

3.4.3 1 অনির্ধারিত আচরণ আচরণ, একটি nonportable বা ভ্রান্ত কর্মসূচি কনস্ট্রাক্ট বা ভ্রান্ত তথ্য, যার জন্য ব্যবহার উপর এই ইন্টারন্যাশনাল স্ট্যান্ডার্ড কোন প্রয়োজনীয়তা imposes

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

3 উদাহরণ অপরিবর্তিত আচরণের একটি উদাহরণ হল পূর্ণসংখ্যার ওভারফ্লোতে আচরণ।

৩.৪.৪ এক অনির্ধারিত আচরণের ব্যবহারের অনির্ধারিত ব্যবহারের ব্যবহার, বা অন্য আচরণ যেখানে এই আন্তর্জাতিক স্ট্যান্ডার্ডটি দুই বা ততোধিক সম্ভাব্যতা সরবরাহ করে এবং কোনও প্রয়োজনে কোন প্রয়োজনে বেছে নেওয়া হয়েছে তার জন্য আরও কোনও প্রয়োজনীয়তা চাপায় না

2 উদাহরণ অনির্দিষ্ট আচরণের একটি উদাহরণ হ'ল ক্রমটির পক্ষে যুক্তিগুলি মূল্যায়ন করা হয়।


3
বাস্তবায়ন-সংজ্ঞায়িত এবং অনির্দিষ্ট আচরণের মধ্যে পার্থক্য কী?
জোলোমন

26
@ জোলোমন: ঠিক যেমনটি বলেছে: মূলত একই জিনিসটি, বাস্তবায়ন-সংজ্ঞায়িত ক্ষেত্রে বাস্তবায়নটি ডকুমেন্টের (গ্যারান্টি হিসাবে) ঠিক কী ঘটতে চলেছে তার উপর নির্ভর করে, যখন অনির্দিষ্ট ক্ষেত্রে বাস্তবায়ন ডকুমেন্টের প্রয়োজন হয় না বা কিছু গ্যারান্টি।
এন্টি

1
@ জোলোমন: এটি 3.4.1 এবং 2.4.4 এর মধ্যে পার্থক্য প্রতিফলিত করে।
এসবিআই 21

8
@ চেরিটারাস: হাইপার-আধুনিক সংকলকরা এর চেয়ে ভাল করতে পারে। int foo(int x) { if (x >= 0) launch_missiles(); return x << 1; }একটি সংকলক প্রদত্ত নির্ধারণ করতে পারে যেহেতু ক্ষেপণাস্ত্রগুলি প্রবর্তন না করে এমন ফাংশনটি চালনার সমস্ত উপায় অনির্ধারিত আচরণের ডাক দেয়, এটি কলটিকে launch_missiles()নিঃশর্ত অবস্থায় রাখতে পারে।
সুপারক্যাট

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

60

স্ট্যান্ডার্ডগুলির কঠোর সংজ্ঞা তুলনায় বোঝার পক্ষে সহজ কথা বলা সহজ হতে পারে।

বাস্তবায়ন-সংজ্ঞায়িত আচরণ
ভাষাটি বলে যে আমাদের কাছে ডেটা-প্রকার রয়েছে। সংকলক বিক্রেতারা নির্দিষ্ট করে যে তারা কোন মাপ ব্যবহার করবে এবং তারা কী করেছে তার একটি ডকুমেন্টেশন সরবরাহ করবে।

অপরিবর্তিত আচরণ
আপনি কিছু ভুল করছেন। উদাহরণস্বরূপ, intএটির মধ্যে আপনার খুব বড় মান রয়েছে যা মানানসই নয় char। আপনি কিভাবে এই মান রাখবেন char? আসলে কোন উপায় নেই! যে কোনও কিছু ঘটতে পারে, তবে সবচেয়ে বুদ্ধিমান জিনিসটি হ'ল সেই ইন্টের প্রথম বাইটটি নিয়ে putোকানো char। প্রথম বাইট নির্ধারণের জন্য এটি করা ঠিক ভুল, তবে হুডের নীচে কী ঘটে তা স্থির করে।

অনির্দিষ্ট আচরণ
এই দুটির কোন কাজটি প্রথমে কার্যকর করা হয়?

void fun(int n, int m);

int fun1()
{
  cout << "fun1";
  return 1;
}
int fun2()
{
  cout << "fun2";
  return 2;
}
...
fun(fun1(), fun2()); // which one is executed first?

বাম থেকে ডানে বা ডান থেকে বামে ভাষা মূল্যায়ন নির্দিষ্ট করে না! সুতরাং একটি অনির্ধারিত আচরণের ফলে একটি অনির্ধারিত আচরণের ফলাফল হতে পারে বা নাও হতে পারে তবে অবশ্যই আপনার প্রোগ্রামটি একটি অনির্ধারিত আচরণ তৈরি করবে না।


@ ই এসকে আমি মনে করি আপনার প্রশ্নটি আরও স্পষ্ট করার জন্য উত্তরটি সম্পাদনা করার উপযুক্ত :)

জন্য fun(fun1(), fun2());ব্যবহার "বাস্তবায়ন ডিফাইন্ড" নয়? সংকলক একটি বা অন্য কোর্স চয়ন করতে হবে, সর্বোপরি?

বাস্তবায়ন-সংজ্ঞায়িত এবং অনির্ধারিত মধ্যে পার্থক্য হ'ল কম্পাইলারটি প্রথম ক্ষেত্রে একটি আচরণ বেছে নেওয়ার কথা বলে তবে এটি দ্বিতীয় ক্ষেত্রে করতে হয় না। উদাহরণস্বরূপ, একটি বাস্তবায়নের অবশ্যই একটি এবং একমাত্র সংজ্ঞা থাকতে হবে sizeof(int)। সুতরাং, এটি sizeof(int)প্রোগ্রামের কিছু অংশের জন্য 4 এবং অন্যদের জন্য 8 টি বলতে পারে না । অনির্ধারিত আচরণের বিপরীতে, যেখানে সংকলক ঠিক বলতে পারে আমি এই তর্কগুলি বাম-থেকে-ডানদিকে মূল্যায়ন করব এবং পরবর্তী ফাংশনের যুক্তিগুলি ডান থেকে বামে মূল্যায়ন করা হবে। এটি একই প্রোগ্রামে ঘটতে পারে, এজন্য এটিকে অনির্দিষ্ট বলা হয় । আসলে, সি ++ আরও সহজ করা যেতে পারে যদি কিছু অনির্দিষ্ট আচরণের নির্দিষ্ট করা হয়। তার জন্য এখানে ডঃ স্ট্রোস্ট্রপের জবাবটি দেখুন :

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

আইএমওতে অনেকগুলি "জিনিস" অপরিজ্ঞাত, অনির্ধারিত, বাস্তবায়ন-সংজ্ঞায়িত ইত্যাদি রয়েছে However তবে, এটি বলা সহজ এবং এর উদাহরণ দেওয়াও সহজ, তবে এটি ঠিক করা শক্ত। এটিও লক্ষ করা উচিত যে বেশিরভাগ সমস্যা এড়ানো এবং পোর্টেবল কোড তৈরি করা এতটা কঠিন নয়।


1
জন্য fun(fun1(), fun2());আচরণ নয় "implementation defined"? সংকলক একটি বা অন্য কোর্স চয়ন করতে হবে, সর্বোপরি?
লেজার

1
@ আরাক: ব্যাখ্যা করার জন্য ধন্যবাদ। আমি এখন এটি বুঝতে। BTW, "I am gonna evaluate these arguments left-to-right and the next function's arguments are evaluated right-to-left"আমি বুঝি যে এই canঘটে। আমরা আজকাল যে সংকলকগুলিকে ব্যবহার করি তা কি সত্যিই হয়?
লেজার

1
@ ই এসকে আপনাকে এই সম্পর্কে একজন গুরুকে জিজ্ঞাসা করতে হবে যিনি অনেক সংকলক দিয়ে তাঁর হাতটি নোংরা করেছিলেন :) আফাইক ভিসি সর্বদা ডান থেকে বামে যুক্তিগুলি মূল্যায়ন করে।
আরাক

4
@ লেজার: এটি অবশ্যই ঘটতে পারে। সাধারণ দৃশ্য: ফু (বার, বোজ ()) এবং ফু (বোজ (), বার), যেখানে বারটি একটি অন্তর্নিহিত এবং বোজ () হল একটি ফাংশন যা প্রত্যাবর্তন হয়। এমন একটি সিপিইউ ধরে নিন যেখানে রেজিস্টার R0-R1 এ পরামিতিগুলি পাস করা হবে বলে আশা করা হচ্ছে। ফাংশন ফলাফল R0 এ ফিরে আসে; ফাংশনগুলি আর 1 টি ট্র্যাশ করতে পারে। "বোজ ()" এর আগে "বার" মূল্যায়ন করার জন্য বোজ () কে ফোন করার আগে অন্য কোথাও বারের একটি অনুলিপি সংরক্ষণ করা এবং তারপরে সেই সংরক্ষিত অনুলিপিটি লোড করা দরকার। "বোজ" (") এর পরে" বার "মূল্যায়ন করা একটি মেমরি স্টোর এবং পুনরায় আনতে এড়াবে এবং এটি একটি অপ্টিমাইজেশন যা বহু সংকলক যুক্তি তালিকায় তাদের অর্ডার নির্বিশেষে করতে পারে।
সুপারক্যাট

6
আমি সি ++ সম্পর্কে জানি না তবে সি স্ট্যান্ডার্ড বলেছে যে একটি চরের সাথে কোনও ইন্টের রূপান্তর হয় তা বাস্তবায়ন সংজ্ঞায়িত বা এমনকি ভালভাবে সংজ্ঞায়িত হয় (প্রকৃত মান এবং ধরণের স্বাক্ষরের উপর নির্ভর করে)। C99 §6.3.1.3 দেখুন (সি 11 এ অপরিবর্তিত)।
নিকোলাই রুহে

27

অফিসিয়াল সি রেশনেল ডকুমেন্ট থেকে

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

অনির্ধারিত আচরণ প্রয়োগকারীকে অনুবাদ প্রোগ্রামগুলিতে কিছু অক্ষর দেয়। প্রোগ্রামটি অনুবাদ করতে ব্যর্থ হওয়া পর্যন্ত এই অক্ষাংশ প্রসারিত হয় না।

অপরিবর্তিত আচরণ বাস্তবায়নকারীকে নির্দিষ্ট কিছু প্রোগ্রামের ত্রুটিগুলি সনাক্ত করতে না দেয় যা নির্ণয় করা কঠিন। এটি সম্ভাব্য অনুসারে ভাষা সম্প্রসারণের ক্ষেত্রগুলিও চিহ্নিত করে: বাস্তবায়নকারী আনুষ্ঠানিকভাবে অপরিজ্ঞাত আচরণের সংজ্ঞা প্রদান করে ভাষাটিকে বাড়িয়ে তুলতে পারে।

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


3
হাইপার-আধুনিক সংকলক লেখকরাও "অপরিবর্তিত আচরণ" কে কম্পাইলার লেখকদের লাইসেন্স প্রদান হিসাবে ধরে নেন যে প্রোগ্রামগুলি কখনই ইনপুট গ্রহণ করবে না যা অনির্ধারিত আচরণের কারণ হয়ে দাঁড়ায়, এবং এ জাতীয় ইনপুটগুলি গ্রহণ করার পরে প্রোগ্রামগুলি কীভাবে আচরণ করে তার সমস্ত দিক নির্বিচারে বদলে দেয়।
সুপারক্যাট

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

10

অনির্ধারিত আচরণ বনাম অনির্ধারিত আচরণের এর একটি সংক্ষিপ্ত বিবরণ রয়েছে।

তাদের চূড়ান্ত সারাংশ:

সংক্ষেপে বলতে গেলে, অনির্ধারিত আচরণ সাধারণত এমন কিছু যা আপনার সফটওয়্যারটি পোর্টেবল করার প্রয়োজন হয় না তা না হওয়া উচিত worry বিপরীতে, অপরিজ্ঞাত আচরণ সর্বদা অনাকাঙ্ক্ষিত এবং কখনই ঘটে না।


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

8

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

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

দুর্ভাগ্যক্রমে, ১৯৯০ এর দশকের মাঝামাঝি থেকে সংকলক লেখকরা আচরণগত আদেশের অভাবকে এই রায় হিসাবে ব্যাখ্যা করতে শুরু করেছেন যে প্রয়োগ ক্ষেত্রগুলিতে এমনকি জীবনযাত্রার গ্যারান্টিটি মূল্যবান নয়, এমনকি এমন সিস্টেমে যেখানে তাদের ব্যবহারিকভাবে কিছুই ব্যয় হয় না। যুক্তিযুক্তিকে যুক্তিসঙ্গত রায় প্রয়োগের আমন্ত্রণ হিসাবে বিবেচনা করার পরিবর্তে সংকলক লেখকরা এটি না করার অজুহাত হিসাবে আচরণ করা শুরু করেছেন ।

উদাহরণস্বরূপ, নিম্নলিখিত কোড দেওয়া:

int scaled_velocity(int v, unsigned char pow)
{
  if (v > 250)
    v = 250;
  if (v < -250)
    v = -250;
  return v << pow;
}

একটি দু'টির পরিপূরক বাস্তবায়নের v << powক্ষেত্রে vইতিবাচক বা নেতিবাচক কিনা তা বিবেচনা না করেই ভাবটিকে দু'টির পরিপূরক স্থান হিসাবে বিবেচনা করতে কোনও প্রচেষ্টা ব্যয় করতে হবে না ।

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


তবে অপরিজ্ঞাত আচরণটি সুন্দর উপায়ে পরিচালনা করা নিখরচায় আসে না। আধুনিক সংকলকরা ইউবির কিছু ক্ষেত্রে এই জাতীয় উদ্ভট আচরণ প্রদর্শন করার পুরো কারণটি হ'ল তারা নিরলসভাবে অপ্টিমাইজ করছে এবং সেখানকার সেরা কাজটি করার জন্য, তারা ধরে নিতে সক্ষম হবে যে ইউবি কখনই ঘটে না।
টম স্যুইরিলি

তবে যেটি <<নেতিবাচক সংখ্যার উপর ইউবি হ'ল এটি একটি বাজে ছোট্ট ফাঁদ এবং আমি এটির স্মরণ করিয়ে আনন্দিত!
টম স্যুইরিলি

1
@ টমসওয়ারিলি: দুর্ভাগ্যক্রমে, সংকলক লেখকরা এ বিষয়টিকে গুরুত্ব দিচ্ছেন না যে স্ট্যান্ডার্ড কর্তৃক নির্ধারিত নিয়মের বাইরে looseিলে .ালা আচরণগত গ্যারান্টি দেওয়া প্রায়শই এই কোডটিকে স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত না করে কোনও কিছুতেই এড়ানো প্রয়োজনের তুলনায় প্রচুর গতি বাড়িয়ে তুলতে পারে। যদি কোনও প্রোগ্রামার যদি i+j>k1 বা 0 ফলন না করে এমন ক্ষেত্রে যদি এটির অতিরিক্ত যত্ন নেই তবে শর্ত থাকে যে এটির অন্য কোনও পার্শ্ব প্রতিক্রিয়া নেই , একটি সংকলক কিছু বিস্তৃত অপ্টিমাইজেশন করতে সক্ষম হতে পারে যা প্রোগ্রামার কোডটি লিখলে এটি সম্ভব হয় না (int)((unsigned)i+j) > k
সুপারক্যাট

1
@ টমসওয়ারিলি: তাদের কাছে, যদি সংকলক এক্স কিছু টাস্ক টি করার জন্য কঠোরভাবে মেনে চলার প্রোগ্রাম গ্রহণ করতে পারে এবং একই প্রোগ্রামের সাথে কমপ্লায়ার ওয়াই ফলন করতে পারে তার চেয়ে 5% বেশি কার্যকর একটি এক্সিকিউটেবল ফলন করতে পারে, তার মানে এক্স আরও ভাল, এমনকি যদি Y এমন একটি কোড তৈরি করতে পারে যা তিনবার একই কাজটি কার্যকরভাবে কার্যকরভাবে কোনও প্রোগ্রাম দেয় যা ওয়াই গ্যারান্টি দেয় তবে এক্স দেয় না এমন আচরণগুলি শোষণ করে।
সুপারক্যাট

6

সি ++ স্ট্যান্ডার্ড n3337 § 1.3.10 বাস্তবায়ন-সংজ্ঞায়িত আচরণ

একটি সুগঠিত প্রোগ্রামের জন্য আচরণ এবং সঠিক ডেটা তৈরি করা, যা বাস্তবায়নের উপর এবং প্রতিটি বাস্তবায়নের নথিতে নির্ভর করে

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


C ++ স্ট্যান্ডার্ডের n3337 § 1.3.24 অনির্ধারিত আচরণ

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

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


C ++ স্ট্যান্ডার্ডের n3337 § 1.3.25 অনির্দিষ্ট আচরণ

একটি সুগঠিত প্রোগ্রামের জন্য আচরণ এবং সঠিক ডেটা, যা বাস্তবায়নের উপর নির্ভর করে [দ্রষ্টব্য: কোন আচরণটি ঘটে তা দলিল করার জন্য প্রয়োগকরণের প্রয়োজন হয় না। সম্ভাব্য আচরণগুলির পরিসরটি সাধারণত এই আন্তর্জাতিক মানক দ্বারা বর্ণিত হয়। - শেষ নোট]

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


6

বাস্তবায়ন সংজ্ঞায়িত-

প্রয়োগকারীরা চান, ভাল ডকুমেন্টেড হওয়া উচিত, মান পছন্দ দেয় তবে সংকলন নিশ্চিত করে

অনির্দিষ্ট -

বাস্তবায়ন সংজ্ঞায়িত হিসাবে একই কিন্তু নথিভুক্ত

Undefined-

কিছু হতে পারে, এটি যত্ন নিন।


2
আমি মনে করি এটি নোট করা জরুরী যে গত কয়েক বছর ধরে "অপরিজ্ঞাত" এর ব্যবহারিক অর্থটি পরিবর্তিত হয়েছে। এটি আগে যেমন দেওয়া হত uint32_t s;, 1u<<sযখন মূল্যায়ন sহয় 33 হয় তখন সম্ভবত 0 বা ফলন 2 পাওয়া যায়, তবে অন্য কিছু হতাশ না করে। তবে নতুন সংকলকগণ মূল্যায়নের 1u<<sফলে একটি সংকলকটি এটি নির্ধারণ করতে পারে কারণ এটি sঅবশ্যই আগে থেকেই 32-এরও কম হওয়া উচিত ছিল, যে অভিব্যক্তিটির আগে বা পরে কোনও কোড যা কেবল s32 বা তার বেশি বা তার বেশি হলে প্রাসঙ্গিক হতে পারে তা বাদ দেওয়া যেতে পারে।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.