X = x ++ অপরিবর্তিত কেন?


19

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

কিন্তু কেন?

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

সুতরাং ধরা যাক আমরা আজ সি পুনরায় উদ্ভাবন করা হয়েছে। আমি মত প্রকাশের জন্য সাধারণ নিয়ম প্রস্তাব করতে চাই x=x++, যা বিদ্যমান নিয়মগুলির চেয়ে আমার কাছে আরও ভাল কাজ করা বলে মনে হয়।
আমি বিদ্যমান নীতিগুলি বা অন্যান্য পরামর্শের তুলনায় প্রস্তাবিত বিধিগুলি সম্পর্কে আপনার মতামত পেতে চাই।

প্রস্তাবিত বিধি:

  1. সিকোয়েন্স পয়েন্টগুলির মধ্যে, মূল্যায়নের ক্রমটি অনির্ধারিত।
  2. পার্শ্ব প্রতিক্রিয়া অবিলম্বে সংঘটিত হয়।

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

উদাহরণ এক্সপ্রেশন

  1. x=x++- ভাল সংজ্ঞায়িত, পরিবর্তন হয় না x
    প্রথমত, xবৃদ্ধি করা হয় (তাত্ক্ষণিকভাবে x++মূল্যায়ন করা হয়), তারপরে এটি পুরানো মান সঞ্চিত থাকে x

  2. x++ + ++x- xদুবার বৃদ্ধি , মূল্যায়ন 2*x+2
    যদিও উভয় পক্ষের প্রথমে মূল্যায়ন করা যেতে পারে তবে ফলাফলটি হয় x + (x+2)(বাম দিকে প্রথমে) বা (x+1) + (x+1)(ডান দিকের প্রথমে)।

  3. x = x + (x=3)- অনির্ধারিত, xহয় x+3বা সেট করা 6
    যদি ডান দিকটি প্রথমে মূল্যায়ন করা হয় তবে তা x+3। এটি x=3প্রথমে মূল্যায়ন করাও সম্ভব , তাই এটি 3+3। উভয় ক্ষেত্রেই নির্ধারিত হলে x=3অ্যাসাইনমেন্টটি তত্ক্ষণাত্ ঘটে x=3, সুতরাং সঞ্চিত মানটি অন্য কার্যক্রমে পুনর্নির্দিষ্ট করা হয়।

  4. x+=(x=3)- ভাল সংজ্ঞায়িত, x6 সেট করে।
    আপনি যুক্তি দিতে পারেন যে এটি উপরের অভিব্যক্তিটির জন্য কেবল সংক্ষিপ্তরূপ।
    তবে আমি বলব যে +=অবশ্যই মৃত্যুদন্ড কার্যকর করা উচিত x=3, এবং দুটি অংশে নয় (পড়ুন x, মূল্যায়ন করুন x=3, যুক্ত করুন এবং নতুন মূল্য সঞ্চয় করুন)।

সুবিধা কী?

কিছু মন্তব্য এই ভাল পয়েন্ট উত্থাপন।
আমি অবশ্যই মনে করি না যে মত প্রকাশগুলি x=x++কোনও সাধারণ কোডে ব্যবহার করা উচিত।
আসলে, আমি তার থেকে অনেক বেশি কঠোর - আমি মনে করি একা x++হিসাবে x++;কেবলমাত্র একমাত্র ভাল ব্যবহার ।

তবে আমি মনে করি ভাষার নিয়মগুলি যথাসম্ভব সহজ হতে হবে। অন্যথায় প্রোগ্রামাররা কেবল তাদের বোঝে না। সিকোয়েন্স পয়েন্টগুলির মধ্যে দুবার ভেরিয়েবল পরিবর্তন করতে নিষেধ করা নিয়মটি অবশ্যই একটি নিয়ম যা বেশিরভাগ প্রোগ্রামাররা বুঝতে পারে না।

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

=== উত্তরের সংক্ষিপ্তসার ===

  1. কেন যে?
    আমি উপরের অংশে ব্যাখ্যা করার চেষ্টা করেছি - আমি সি নিয়ম সহজ হতে চাই।

  2. অপ্টিমাইজেশনের সম্ভাব্য:
    এটি সংকলক থেকে কিছুটা স্বাধীনতা নিয়েছে, তবে আমি এমন কিছু দেখিনি যা আমাকে নিশ্চিত করে যে এটি উল্লেখযোগ্য হতে পারে।
    সর্বাধিক অপটিমাইজেশন এখনও করা যেতে পারে। উদাহরণস্বরূপ, a=3;b=5;স্ট্যান্ডার্ডটি অর্ডার নির্দিষ্ট করে সত্ত্বেও , পুনরায় সাজানো যেতে পারে। যেমন মত প্রকাশ a=b[i++]এখনও এখনও একইভাবে অনুকূলিত করা যেতে পারে।

  3. আপনি বিদ্যমান মান পরিবর্তন করতে পারবেন না।
    আমি স্বীকার করি, পারি না। আমি কখনই ভাবিনি যে আমি আসলে এগিয়ে যেতে পারি এবং মান এবং সংকলকগুলি পরিবর্তন করতে পারি। আমি কেবল ভাবতে চেয়েছিলাম যে জিনিসগুলি অন্যভাবে করা যেতে পারত।


10
এটা কেন আপনার কাছে গুরুত্বপূর্ণ? উচিত এটা সংজ্ঞায়িত করা, এবং তাই যদি, কেন? xনিজেকে অর্পণ করার পক্ষে খুব একটা পয়েন্ট নেই , এবং আপনি যদি ইনক্রিমেন্ট চান তবে আপনি xকেবল বলতে পারেন x++;- অ্যাসাইনমেন্টের প্রয়োজন নেই। আমি বলব যে এটি সংজ্ঞায়িত করা উচিত নয় কারণ এটি ঘটবে বলে মনে রাখা কঠিন।
কালেব

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

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

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

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

উত্তর:


24

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

y = x++ + ++x;

এর চেয়ে বেশি পঠনযোগ্য

y = 2*x + 2;
x += 2;

প্রদত্ত যে এই ধরনের পরিবর্তনটি চূড়ান্ত মৌলিক এবং বিদ্যমান কোড বেসকে ভঙ্গ করছে।


1
আমি আমার প্রশ্নের সাথে "কেন" বিভাগ যুক্ত করেছি। আমি অবশ্যই এই এক্সপ্রেশনগুলি ব্যবহার করার পরামর্শ দিচ্ছি না, তবে আমি একটি অভিব্যক্তির অর্থ বলতে সহজ নিয়মগুলি রাখতে আগ্রহী।
ugoren

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

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

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

1
@ ইউগোরেন: আপনার "কেন" বিভাগটি এখনও ব্যবহারিক প্রশ্নের উত্তর দেয় না: আপনি কেন আপনার কোডটিতে এই অদ্ভুত অভিব্যক্তি চান? আপনি যদি এর একটি দৃ conv় উত্তর নিয়ে আসতে না পারেন, তবে পুরো আলোচনাটি মূল বিষয়।
মাইক বারানজাক

20

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

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

এটি এখন আর তাত্ত্বিক নয়। এখন উত্পাদনের হার্ডওয়্যার রয়েছে এবং বিস্তৃত ব্যবহার রয়েছে (যেমন, Itanium, VLIW DSPs) যা সত্যই এর সুবিধা নিতে পারে। তারা সত্যই সংকলককে একটি নির্দেশিকা প্রবাহ তৈরি করতে দেয় যা নির্দেশ দেয় যে এক্স, ওয়াই এবং জেড সমস্ত সমান্তরালে কার্যকর করা যেতে পারে। এটি আর কোনও তাত্ত্বিক মডেল নয় - এটি বাস্তব কাজে আসল হার্ডওয়্যার real

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

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

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

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

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


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

হতে পারে আমি কিছু মিস করছি - যদি কখনও এই জাতীয় কোড লেখার কথা না থাকে তবে কেন এটি অপ্টিমাইজ করার বিষয়ে যত্নশীল?
উগোরেন

1
@ ইউগোরেন: লেখার কোডের মতো a=b[i++];(একটি উদাহরণের জন্য) ভাল, এবং এটি অনুকূলকরণ একটি ভাল জিনিস। যাইহোক, আমি যুক্তিযুক্ত কোডটি আঘাত করার বিন্দুটি দেখতে পাই না ঠিক যেমন কোনওরকমের ++i++একটি সংজ্ঞাযুক্ত অর্থ থাকে।
জেরি কফিন

2
@ যুগেন সমস্যাটি অন্যতম একটি নির্ণয়ের। সম্পূর্ণরূপে মত প্রকাশকে অস্বীকার না করার একমাত্র উদ্দেশ্য ++i++হ'ল স্পষ্টভাবে যে পার্শ্ব-প্রতিক্রিয়া (যেমন a=b[i++]) এর সাথে বৈধ এক্সপ্রেশন থেকে তাদের আলাদা করা সাধারণভাবে শক্ত hard এটি আমাদের পক্ষে সহজ মনে হতে পারে, তবে আমি যদি ড্রাগন বুকটি সঠিকভাবে মনে করি তবে এটি আসলে একটি এনপি-হার্ড সমস্যা। এই কারণেই এই আচরণটি নিষিদ্ধের পরিবর্তে ইউবি।
কনরাড রুডলফ

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

9

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

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

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


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

5

প্রথমত, অপরিজ্ঞাত আচরণের সংজ্ঞাটি একবার দেখে নেওয়া যাক :

3.4.3

1 একটি ননডেপটেবল বা ভ্রান্ত প্রোগ্রাম নির্মাণ বা ভুল তথ্য ব্যবহারের উপর ভিত্তি করে
আচরণ করা, যার জন্য এই আন্তর্জাতিক স্ট্যান্ডার্ড কোনও প্রয়োজনীয়তা আরোপ করে না

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

৩ উদাহরণ উদাহরণস্বরূপ আচরণের একটি উদাহরণ হ'ল fl ওভার পূর্ণসংখ্যার উপর আচরণ

সুতরাং অন্য কথায়, "অপরিজ্ঞাত আচরণ" এর সহজ অর্থ হ'ল সংকলক পরিস্থিতিটি যেভাবে চান পরিস্থিতি পরিচালনা করতে মুক্ত এবং এই জাতীয় কোনও ক্রিয়া "সঠিক" হিসাবে বিবেচিত হয় considered

আলোচনার অধীনে ইস্যুটির মূলটি নিম্নলিখিত ধারা:

6.5 এক্সপ্রেশন

...
3 অপারেটর এবং অপারেটরগুলির গোষ্ঠীকরণ সিনট্যাক্স দ্বারা নির্দেশিত। 74) ছাড়া সুনিন্টি ফাই পরে (ed ফাংশন কল জন্য (), &&, ||, ?:, এবং কমা অপারেটার), subexpressions মূল্যায়ন অর্ডার ও ক্রমে পার্শ্ব প্রতিক্রিয়া সঞ্চালিত উভয় unspeci ফাই ইডি হয়

সামনে জোর দাও.

মত একটি এক্সপ্রেশন দেওয়া

x = a++ * --b / (c + ++d);

subexpressions a++, --b, c, এবং ++dমূল্যায়ন করা হতে পারে কোনো অনুক্রমে । তদ্ব্যতীত, পার্শ্বপ্রতিক্রিয়া a++, --bএবং ++dযেকোনো সময় আগামী ক্রম বিন্দু আগে প্রয়োগ করা যেতে পারে (IOW, এমনকি যদি a++আগে মূল্যায়ন করা হয় --b, এটা নিশ্চিত নয় যে aকরা হবে আপডেট সামনে --bমূল্যায়ন করা হয়)। অন্যরা যেমন বলেছে, এই আচরণের যুক্তি হ'ল বাস্তবায়নটিকে সর্বোত্তম পদ্ধতিতে পুনর্বিন্যাসের স্বাধীনতা দেওয়া।

এ কারণে, তবে, মতামত পছন্দ করে

x = x++
y = i++ * i++
a[i] = i++
*p++ = -*p    // this one bit me just yesterday

ইত্যাদি, বিভিন্ন বাস্তবায়নের জন্য (বা বিভিন্ন অপটিমাইজেশন সেটিংস সহ একই প্রয়োগের জন্য, বা পার্শ্ববর্তী কোডের উপর ভিত্তি করে, ইত্যাদি) বিভিন্ন ফলাফল অর্জন করবে ।

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

স্পষ্টতই, আপনি এমন একটি ভাষা ডিজাইন করতে পারেন যে মূল্যায়নের ক্রম এবং পার্শ্ব প্রতিক্রিয়াগুলি প্রয়োগ করার ক্রমটি কঠোরভাবে সংজ্ঞায়িত করা হয়েছে, এবং জাভা এবং সি # উভয়ই তাই করে, মূলত সি এবং সি ++ সংজ্ঞা যে বিষয়গুলি নিয়ে আসে তা এড়াতে।

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


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

4

প্রথমে আপনাকে বুঝতে হবে যে এটি কেবল x = x ++ নয় যা অপরিজ্ঞাত। কেউ x = x ++ সম্পর্কে চিন্তা করে না, যেহেতু আপনি এটির কী অর্থ নির্ধারণ করবেন তা বিবেচ্য নয় এটির কোনও মানে নেই। অপরিবর্তিত জিনিসটি আরও অনেকটা "a = b ++ এর মতো যেখানে a এবং b একই হয়" - যেমন

void f(int *a, int *b) {
    *a = (*b)++;
}
int i;
f(&i, &i);

প্রসেসরের আর্কিটেকচারের জন্য (এবং পার্শ্ববর্তী বিবৃতিগুলির ক্ষেত্রে, যদি উদাহরণের চেয়ে আরও জটিল ফাংশন হয়) তবে এটি কার্যকরী হওয়ার জন্য বিভিন্ন উপায় রয়েছে depending উদাহরণস্বরূপ, দুটি সুস্পষ্ট বিষয়:

load r1 = *b
copy r2 = r1
increment r1
store *b = r1
store *a = r2

অথবা

load r1 = *b
store *a = r1
increment r1
store *b = r1

মনে রাখবেন যে উপরে উল্লিখিত প্রথমটি, আরও বেশি নির্দেশাবলী এবং আরও রেজিস্ট্রার ব্যবহার করে এমন একটি যা আপনার এবং এমন ক্ষেত্রে ব্যবহার করা প্রয়োজন যেখানে অ এবং বি পৃথক প্রমাণিত হতে পারে না।


আপনি প্রকৃতপক্ষে একটি কেস দেখান যেখানে আমার পরামর্শটির ফলে আরও বেশি মেশিন অপারেশন হয় তবে এটি আমার কাছে তুচ্ছ মনে হয়। এবং সংকলকটিতে এখনও কিছুটা স্বাধীনতা রয়েছে - কেবলমাত্র আসল প্রয়োজনীয়তাটি আমি bআগে সঞ্চয় করি a
ugoren

3

উত্তরাধিকার

সি আজ নতুন করে পুনর্বহাল হতে পারে এমন ধারণা ধরে রাখতে পারে না। সি কোডের অনেকগুলি লাইন রয়েছে যা উত্পাদিত এবং প্রতিদিন ব্যবহৃত হয়, যে খেলার মাঝখানে খেলার নিয়মগুলি পরিবর্তন করা ঠিক ভুল just

অবশ্যই আপনি একটি নতুন ভাষা উদ্ভাবন করতে পারেন , আপনার বিধি দিয়ে সি + = বলুন । তবে সেটি সি হবে না


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

2

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

অনুমানের জন্য প্রধান সমস্যাটি নেই x = x++;(সংকলক সহজেই এটি পরীক্ষা করতে পারে এবং সতর্ক করতে হবে), এটি সহ *p1 = (*p2)++এবং সমতুল্য ( p1[i] = p2[j]++;যখন পি 1 এবং পি 2 কোনও ফাংশনের পরামিতি হয়) যেখানে সংকলক সহজেই জানতে পারবেন না p1 == p2(সি 99 এ) restrictঅনুক্রমের পয়েন্টগুলির মধ্যে পি 1! = পি 2 ধরে নেওয়ার সম্ভাবনা ছড়িয়ে দেওয়ার জন্য যুক্ত করা হয়েছে, সুতরাং এটি অপরিবর্তনীয় সম্ভাবনাগুলি গুরুত্বপূর্ণ ছিল বলে মনে করা হয়েছিল)।


আমার পরামর্শ কীভাবে কিছু পরিবর্তন করে তা আমি দেখতে পাচ্ছি না p1[i]=p2[j]++। যদি সংকলকটি কোনও এলিয়াসিং ধরে না নিতে পারে তবে কোনও সমস্যা নেই। যদি এটি না পারে তবে এটি অবশ্যই বইটি দিয়ে যাবে - p2[j]প্রথমে ইনক্রিমেন্ট , p1[i]পরে স্টোর করুন । অপটিমাইজেশন সুযোগগুলি হারাতে ব্যতীত, যা উল্লেখযোগ্য বলে মনে হয় না, আমি কোনও সমস্যা দেখছি না।
উগোরেন

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

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

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

সংকলক কাঠামো সম্পর্কে আমি খুব বেশি জানি না। আমি যদি সত্যই সমস্ত সংকলক পরিবর্তন করতে চাইতাম তবে আমি আরও যত্নশীল। তবে সম্ভবত x++সিকোয়েন্স পয়েন্ট হিসাবে চিকিত্সা করা, যেন এটি একটি ফাংশন কলটি inc_and_return_old(&x)করত।
উগোরেন

-1

কিছু ক্ষেত্রে, এই ধরণের কোড ছিল নতুন সি ++ 11 স্ট্যান্ডার্ড সংজ্ঞায়িত।


5
বিশদ যত্ন?
উগোরেন

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