অনির্ধারিত আচরণের পিছনে দর্শন


59

সি \ সি ++ স্পেসিফিকেশনগুলি সংকলকদের তাদের নিজস্ব উপায়ে বাস্তবায়নের জন্য বিপুল সংখ্যক আচরণ খোলা রেখে দেয়। এখানে অনেকগুলি প্রশ্ন রয়েছে যা সর্বদা এখানে একই সম্পর্কে জিজ্ঞাসা করতে থাকে এবং আমাদের এটি সম্পর্কে কয়েকটি চমৎকার পোস্ট রয়েছে:

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

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

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

যদি আপনি প্রশ্নটি বুঝতে না পারেন বা আপনার উত্তরটি ব্যাক করার পক্ষে পর্যাপ্ত প্রমাণ / উত্স না থাকে তবে দয়া করে বিস্তৃতভাবে অনুমানকারী উত্তর পোস্ট করবেন না।


7
যে কোনওভাবেই ডেটিমিনিস্টিক কম্পিউটারের কথা শুনেছেন?
সোভা

1
যেমন লিটবির দুর্দান্ত উত্তর প্রোগ্রামারস.স্ট্যাকেক্সেক্সঞ্জ / আ / 747474৪১ / ১৯২২৮৮ ইঙ্গিত করে, এই প্রশ্নের শিরোনাম এবং শৃঙ্খলা কিছুটা মিলেছে না বলে মনে হয়: "কম্পাইলারদের নিজস্ব উপায়ে প্রয়োগ করার জন্য উন্মুক্ত আচরণ" সাধারণত বাস্তবায়ন-সংজ্ঞায়িত হিসাবে উল্লেখ করা হয় । নিশ্চিত, বাস্তব UB বাস্তবায়ন লেখক দ্বারা সংজ্ঞায়িত করার অনুমতি দেওয়া হয়, তবে প্রায়শই না তারা বিরক্ত করে না (এবং এটি সর্বোপরি অনুকূল করে তোলা ইত্যাদি)
আন্ডারস্কোর_

উত্তর:


49

প্রথমত, আমি লক্ষ করব যে যদিও আমি এখানে কেবলমাত্র "সি" উল্লেখ করেছি তবে এটি একইভাবে C ++ তেও সমানভাবে প্রযোজ্য।

গডেলের উল্লেখ করা মন্তব্যটি আংশিক (তবে কেবল আংশিক) পয়েন্টে ছিল।

যখন আপনি এটিতে নামেন, সি স্ট্যান্ডার্ডগুলিতে অপরিজ্ঞাত আচরণটি মূলত কেবল কী স্ট্যান্ডার্ডটিকে সংজ্ঞায়িত করার চেষ্টা করে এবং এটি কী করে না তার মধ্যে সীমাটি নির্দেশ করে।

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

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

(আবারও) অহংকারের অভিযোগে অভিযুক্ত হওয়ার ঝুঁকিতে আমি সি স্ট্যান্ডার্ডকে দুটি মূল ধারণা দ্বারা পরিচালিত (অংশে) হিসাবে চিহ্নিত করব:

  1. ভাষার যথাসম্ভব বিস্তৃত বিভিন্ন হার্ডওয়্যার সমর্থন করা উচিত (আদর্শভাবে, সমস্ত "বুদ্ধিমান" হার্ডওয়্যার কিছুটা যুক্তিসঙ্গত নিম্ন সীমাতে নিচে)।
  2. ভাষার প্রদত্ত পরিবেশের জন্য যথাসময়ে বিভিন্ন ধরণের সফ্টওয়্যার লেখার পক্ষে সমর্থন করা উচিত।

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

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

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

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

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

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

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


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

9
দুঃখিত, তবে আমি আশঙ্কা করি আপনি গডেলের উপপাদ্যগুলি পুরোপুরি ভুল বুঝেছেন। তারা যুক্তিযুক্ত ধারাবাহিক পদ্ধতিতে সমস্ত সত্য বিবৃতি প্রমাণের অসম্ভবতা নিয়ে কাজ করে; কম্পিউটিংয়ের ক্ষেত্রে, অসম্পূর্ণতা উপপাদ্যটি এই বলে উপমা দেয় যে সমস্যাগুলি যে কোনও প্রোগ্রামের মাধ্যমে সমাধান করা যায় না - সমস্যাগুলি সত্য বক্তব্যের সাথে মিল, প্রমাণগুলির সাথে প্রোগ্রামগুলি এবং যুক্তি ব্যবস্থায় গণনার মডেল। অপরিবর্তিত আচরণের সাথে এর কোনও যোগসূত্র নেই। সাদৃশ্যটির ব্যাখ্যা এখানে দেখুন: scottaaronson.com/blog/?p=710
অ্যালেক্স দশ ব্রিংক

5
আমার লক্ষ করা উচিত যে সি বাস্তবায়নের জন্য কোনও ভন নিউম্যান মেশিনের প্রয়োজন হয় না। হার্ভার্ড আর্কিটেকচারের জন্য সি প্রয়োগকরণ বিকাশ করা পুরোপুরি সম্ভব (এবং খুব
কঠিনও নয়

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

20

সি যুক্তিপূর্ণ ব্যাখ্যা

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

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

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

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

প্রোগ্রামগুলির জন্য বেনিফিটও গুরুত্বপূর্ণ, কেবল বাস্তবায়নের জন্য সুবিধা। এমন একটি প্রোগ্রাম যা অপরিবর্তিত আচরণের উপর নির্ভর করে এখনও মেনে চলতে পারে , যদি এটি একটি অনুসারী বাস্তবায়ন দ্বারা গৃহীত হয়। অপরিজ্ঞাত আচরণের অস্তিত্ব একটি প্রোগ্রামকে অ-সঙ্গতিহীন না হয়ে স্পষ্টভাবে চিহ্নিত ("অপরিজ্ঞাত আচরণ") হিসাবে চিহ্নিত নন-পোর্টেবল বৈশিষ্ট্যগুলি ব্যবহার করার অনুমতি দেয়। যুক্তি নোট:

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

এবং 1.7 এ এটি নোট করে

সম্মতিটির তিনগুণ সংজ্ঞাটি মেনে চলার প্রোগ্রামগুলির জনসংখ্যাকে প্রশস্ত করতে এবং একক বাস্তবায়ন এবং বহনযোগ্য কনফার্মিং প্রোগ্রামগুলি ব্যবহার করে মানিয়ে তোলা প্রোগ্রামগুলির মধ্যে পার্থক্য করতে ব্যবহৃত হয়।

একটি কঠোরভাবে মেনে চলার প্রোগ্রাম সর্বাধিক বহনযোগ্য প্রোগ্রামের জন্য অন্য পদ। লক্ষ্যটি হ'ল প্রোগ্রামারকে শক্তিশালী সি প্রোগ্রামগুলি তৈরি করার লড়াইয়ের সুযোগ দেওয়া যা অত্যন্ত পোর্টেবলও হয়, পুরোপুরি কার্যকর সি প্রোগ্রামগুলি যেগুলি পোর্টেবল হতে পারে না তা বিবেচনা না করে। এইভাবে বিশেষণ কঠোরভাবে।

সুতরাং, জিসিসিতে পুরোপুরি সূক্ষ্মভাবে কাজ করে এমন এই ছোট্ট নোংরা প্রোগ্রামটি এখনও মেনে চলছে !


15

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

অন্যান্য অপরিবর্তিত আচরণ কেবল বাস্তবতার প্রতিফলন করে। একটি উদাহরণ ধরণের চেয়ে বড় একটি গণনা সঙ্গে বিট-স্থানান্তর হয়। এটি একই পরিবারের হার্ডওয়্যার প্রজন্মের মধ্যে পৃথক। আপনার যদি 16-বিট অ্যাপ থাকে তবে সঠিক একই বাইনারি একটি 80286 এবং একটি 80386 এ বিভিন্ন ফলাফল দেবে So তাই ভাষার মানটি বলে যে আমরা জানি না!

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


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

3
বিট শিফট অপরিবর্তিত সংকলক আচরণ গ্রহণ এবং হার্ডওয়্যার ক্যাপিবিল ব্যবহার করার এক উদাহরণ। গণনা টাইপের চেয়ে বড় হলেও কিছু হার্ডওয়্যারে প্রয়োগ করা ব্যয়বহুল হলে কিছুটা শিফটের জন্য সি ফলাফল নির্দিষ্ট করা তুচ্ছ হবে।
mattnz

7

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

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

আমি আরও বিশ্বাস করি যে এটি সংকলক-লেখকের কাজকে আরও সহজ করে তোলে তবে আমি উদাহরণটি এখনই মনে করতে পারি না। আমি যদি পরিস্থিতিটি মনে করি তবে আমি এটি যুক্ত করব।


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

6

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


1
তাই না? এম্বেডড হার্ডওয়ারের সাথে ব্যতিক্রমগুলি কী করতে পারে?
ম্যাসন হুইলারের

2
ব্যতিক্রমগুলি এম্বেডড সিস্টেমগুলির জন্য খুব খারাপ যে পদ্ধতিগুলিতে দ্রুত প্রতিক্রিয়া জানাতে হবে সেই পদ্ধতিতে সিস্টেমটিকে লকআপ করতে পারে। এমন পরিস্থিতি রয়েছে যেখানে একটি ভুয়া পড়া খুব কম ক্ষয়কারী হয় যা একটি ধীরগতির সিস্টেম।
ওয়ার্ল্ড ইঞ্জিনিয়ার

1
@ ম্যাসন: কারণ হার্ডওয়্যারটিকে অবৈধ অ্যাক্সেস ধরতে হবে। উইন্ডোজের পক্ষে অ্যাক্সেস লঙ্ঘন ছুঁড়ে দেওয়া সহজ এবং কোনও অপারেটিং সিস্টেম সহ এম্বেডড হার্ডওয়ারের জন্য মরা ব্যতীত আর কিছু করা শক্ত নয়।
ডেড এমজি

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

4

সি একটি মেশিনে 9 বিট বাইট এবং কোনও ভাসমান পয়েন্ট ইউনিট আবিষ্কার করা হয়েছিল - ধরুন এটির আদেশ দেওয়া হয়েছিল যে বাইটগুলি 9 বিট, শব্দের 18 বীট এবং সেই ফ্লোটগুলি প্রাক আইইইই 7575 আর্টমেটিক ব্যবহার করে প্রয়োগ করা উচিত?


5
আমার সন্দেহ হয় আপনি ইউনিক্সের কথা ভাবছেন - সি মূলত পিডিপি -11 এ ব্যবহৃত হয়েছিল, যা আসলে প্রচলিত বর্তমান মানদণ্ড ছিল। আমি মনে করি তবুও মূল ধারণাটি দাঁড়িয়ে আছে।
জেরি কফিন

@ জেরি - হ্যাঁ, আপনি ঠিক বলেছেন - আমি বুড়ো হয়ে যাচ্ছি!
মার্টিন বেকেট

হ্যাঁ - আমাদের সেরাটি ঘটে, আমি ভয় করি।
জেরি কফিন

4

আমি মনে করি না যে ইউবির প্রথম যুক্তিটি সংযোজকটিকে অনুকূলকরণের জন্য জায়গা দেওয়া ছিল, তবে কেবলমাত্র সেই সময়ে লক্ষ্যগুলির জন্য সুস্পষ্ট বাস্তবায়নটি ব্যবহার করার সম্ভাবনা যখন আর্কিটেকচারের চেয়ে এখন আরও অনেক বৈচিত্র ছিল (মনে রাখবেন যে সি এর উপর ডিজাইন করা হয়েছিল কিনা) PDP-11 যার কিছুটা পরিচিত স্থাপত্য রয়েছে, প্রথম বন্দরটি হানিওয়েল 635 যা খুব কম পরিচিত - শব্দ ঠিকানা, 36 বিট শব্দ, 6 বা 9 বিট বাইট, 18 বিট ঠিকানা ব্যবহার করে ... ভাল কমপক্ষে এটি 2 টি ব্যবহার করেছে পরিপূর্ণ)। তবে ভারী অপ্টিমাইজেশান যদি লক্ষ্য না হয় তবে সুস্পষ্ট বাস্তবায়নে ওভারফ্লোর জন্য রান-টাইম চেক যুক্ত করা উচিত নয়, নিবন্ধকের আকারের চেয়ে শিফট গণনা, যা একাধিক মানকে সংশোধন করে অভিব্যক্তিতে এলিয়াস দেয়।

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


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

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

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

প্রোগ্রামারদের পক্ষে বিভিন্ন প্ল্যাটফর্ম সহজাতভাবে বিভিন্ন কাজ করতে পারে এমন ক্ষেত্রে পোর্টিবিলিটি নিশ্চিত করার জন্য অতিরিক্ত প্রচেষ্টা চালিয়ে যাওয়া ভাল , তবে সংকলক লেখকরা এমন আচরণগুলি বর্জন করেন যখন historতিহাসিকভাবে প্রোগ্রামাররা ভবিষ্যতের সমস্ত সংকলকগুলির কাছে সাধারণভাবে প্রত্যাশিত হতে পারে এমন আচরণগুলি নির্মূল করে। প্রদত্ত পূর্ণসংখ্যা iএবং এ nজাতীয় n < INT_BITSএবং i*(1<<n)উপচে পড়বে না, আমি এর i<<=n;থেকে আরও পরিষ্কার বলে বিবেচনা করব i=(unsigned)i << n;; অনেক প্ল্যাটফর্মে এটির চেয়ে দ্রুত এবং ছোট হবে i*=(1<<N);। কম্পাইলাররা এটি নিষিদ্ধ করে কী লাভ হয়?
সুপারক্যাট

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

3

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


পূর্ণসংখ্যা যোগ একটি আকর্ষণীয় ক্ষেত্রে; ফাঁদ আচরণের সম্ভাবনা ছাড়িয়ে যা কিছু ক্ষেত্রে কার্যকর হতে পারে তবে অন্যান্য ক্ষেত্রে এলোমেলো কোড প্রয়োগের কারণ হতে পারে, এমন পরিস্থিতি রয়েছে যেখানে সংকলকটির পক্ষে পূর্ণসংখ্যার অতিরিক্ত প্রবাহকে মোড়কের জন্য নির্দিষ্ট করা হয়নি তার উপর ভিত্তি করে ইনফারেন্স তৈরি করা যুক্তিসঙ্গত হবে। উদাহরণস্বরূপ, একটি সংকলক যেখানে int16 বিট এবং সাইন-এক্সটেন্ডেড শিফট ব্যয়বহুল, (uchar1*uchar2) >> 4কোনও অ-সাইন-এক্সটেন্ডেড শিফ্ট ব্যবহার করে গণনা করতে পারে । দুর্ভাগ্যক্রমে, কিছু সংকলক কেবল ফলাফলগুলিতেই নয়, অপারেশনগুলিতেও অন্তর্ভুক্ত করে ferences
সুপারক্যাট

2

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


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

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

1

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


অথবা আপনি হিসাবে সব পয়েন্টার বরাদ্দ পারে weak_ptrএবং পয়েন্টার পরার যে সমস্ত রেফারেন্স খর্ব deleteঘ ... ওহ অপেক্ষা করুন, আমরা সমীপবর্তী করছি গার্বেজ কালেকশন: /
Matthieu এম

boost::weak_ptrএই ব্যবহারের ধরণটি শুরু করতে এর বাস্তবায়ন হ'ল একটি দুর্দান্ত টেম্পলেট। weak_ptrsবাহ্যিকভাবে ট্র্যাকিং এবং অকার্যকরকরণের পরিবর্তে ন্যায়বিচারটি weak_ptrকেবল shared_ptrদুর্বল গণনায় অবদান রাখে , এবং দুর্বল গণনাটি মূলত পয়েন্টারের নিজেই একটি পুনঃক্রিয়া হয়। সুতরাং, আপনি shared_ptrঅবিলম্বে এটি মুছে ফেলা ছাড়াই বাতিল করতে পারেন । এটি নিখুঁত নয় (আপনি এখনও অযৌক্তিকভাবে অকারণে weak_ptrমূল shared_countকারণটি বজায় রাখার জন্য প্রচুর মেয়াদোত্তীর্ণ গুলি রাখতে পারেন ) তবে কমপক্ষে এটি দ্রুত এবং দক্ষ।
ফ্লফি

0

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

এটি আপনাকে দুটি পছন্দ দেয়:

1) পয়েন্টারটির মাধ্যমে কোনও অ্যাক্সেসের আগে রেজিস্টারগুলির বাইরে সমস্ত কিছু ফ্লাশ করুন, কেবলমাত্র পয়েন্টার যদি সেই নির্দিষ্ট ভেরিয়েবলের স্মৃতিতে নির্দেশ করে। তারপরে রেজিস্টারে প্রয়োজনীয় সমস্ত কিছু লোড করুন, ঠিক যদি পয়েন্টারের মাধ্যমে মানগুলি পরিবর্তন করা হয়।

২) যখন কোনও পয়েন্টারকে কোনও ভেরিয়েবলের উপকরণ দেওয়ার অনুমতি দেওয়া হয় এবং সংকলককে যখন কোনও পয়েন্টারটি একটি ভেরিয়েবলের উরফ দেয় না তখন ধরে নিতে অনুমতি দেওয়া হয় তার জন্য নিয়মগুলির একটি সেট রাখুন।

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


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

উদাহরণস্বরূপ, যদি কোনও কোড foo৪২ তে সেট করে এবং তারপরে এমন একটি পদ্ধতি কল করে যা অবৈধভাবে সংশোধিত পয়েন্টার ব্যবহার fooকরে ৪৪ এ সেট করে, আমি পরবর্তী "বৈধ" লেখার আগ পর্যন্ত বৈধভাবে fooএটি পড়ার চেষ্টা করে বলে লাভটি দেখতে পাচ্ছি ৪২ বা ৪৪ ফলন পাওয়া যায় এবং এর মতো একটি অভিব্যক্তি foo+fooএমনকি ৮ yield টিও উপার্জন করতে পারে, তবে আমি সংকলকটিকে প্রসারিত এবং এমনকি বিপরীতমুখী সূত্রগুলি তৈরি করার অনুমতি দেওয়ার তুলনায় খুব কম উপকার দেখি, অপরিজ্ঞাত আচরণটি পরিবর্তন করে যার অনর্থক "প্রাকৃতিক" আচরণগুলি সবই সৌম্য হয়ে থাকত, লাইসেন্সে into অযৌক্তিক কোড উত্পন্ন করতে।
সুপারক্যাট

0

Icallyতিহাসিকভাবে, অপরিজ্ঞাত আচরণের দুটি প্রাথমিক উদ্দেশ্য ছিল:

  1. সংকলক লেখকদের এমন শর্তাদি পরিচালনা করতে কোড উত্পন্ন করার প্রয়োজন হয় যা কখনই ঘটেছিল বলে মনে হয় না।

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

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

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

uint32_t foo(uint16_t q, int *p)
{
  if (q > 46340)
    *p++;
  return q*q;
}

সি স্ট্যান্ডার্ডটি কম্পাইলারকে এটি বলতে অনুমতি দেয় যে যদি q 46341 বা তার চেয়ে বড় হয় তবে q * q এক্সপ্রেশনটি খুব বেশি ফলস্বরূপ একটি ফলস্বরূপ ফলবে int, ফলস্বরূপ অপরিজ্ঞাত আচরণের কারণ হয়ে দাঁড়াবে এবং ফলস্বরূপ সংকলকটি ধরে নেওয়ার অধিকারী হবে ঘটতে পারে না এবং এভাবে *pযদি বৃদ্ধি ঘটে তবে এটি প্রয়োজন হয় না। যদি কলিং কোডটি *pএমন একটি সূচক হিসাবে ব্যবহার করে যে এটি গণনার ফলাফলগুলি বাতিল করতে পারে, তবে অপ্টিমাইজেশনের প্রভাবটি এমন কোড নিতে পারে যা সিস্টেমে সংজ্ঞাগত ফলাফল অর্জন করতে পারে যা সংখ্যার ওভারফ্লো দিয়ে প্রায় কোনও কল্পনাপ্রসূত উপায়ে সঞ্চালিত হয় (আটকা পড়ে থাকতে পারে) কুরুচিপূর্ণ, তবে কমপক্ষে বুদ্ধিমান হবে) এবং এটিকে এমন কোডে পরিণত করেছে যা অযৌক্তিকভাবে আচরণ করতে পারে।


-6

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


7
ওপি এটিকে নির্দিষ্ট করেছে: "আমার প্রশ্নটি অপরিবর্তিত আচরণ কী তা সম্পর্কে নয় বা এটি আসলেই খারাপ। । " দেখে মনে হচ্ছে আপনি প্রশ্নটি পড়েন নি।
এটিয়েন ডি মার্টেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.