সি তে অ্যারে সূচকগুলির মূল্যায়নের ক্রম (অভিব্যক্তি বনাম) গ


47

এই কোডটি দেখছেন:

static int global_var = 0;

int update_three(int val)
{
    global_var = val;
    return 3;
}

int main()
{
    int arr[5];
    arr[global_var] = update_three(2);
}

কোন অ্যারে এন্ট্রি আপডেট হয়? 0 বা 2?

সি এর স্পেসিফিকেশনের কোনও অংশ রয়েছে যা এই বিশেষ ক্ষেত্রে পরিচালনার নজির নির্দেশ করে?


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

1
আমি সম্মত হই এটি খারাপ কোডিংয়ের একটি উদাহরণ।
জিমিনিয়ন


15
এটির অ্যারে সূচকগুলি বা ক্রিয়াকলাপের ক্রমের সাথে কোনও সম্পর্ক নেই। এটি সি স্পেককে "সিকোয়েন্স পয়েন্টস" বলে এবং বিশেষত, কার্যনির্বাহী এক্সপ্রেশনগুলি বাম-হাত এবং ডান-হাতের এক্সপ্রেশনগুলির মধ্যে একটি ক্রম বিন্দু তৈরি করে না এমনটি করে, তাই সংকলকটি এটি হিসাবে নিখরচায় পছন্দ করে।
লি ড্যানিয়েল ক্রকার 21

4
আপনার clangএই বৈশিষ্ট্যের অনুরোধটির প্রতিবেদন করা উচিত যাতে কোডের এই অংশটি একটি সতর্কতা আইএমএইচও চালু করে।
মালাত

উত্তর:


51

বাম এবং ডান অপারেন্ডস অর্ডার

অ্যাসাইনমেন্টটি সম্পাদন করতে arr[global_var] = update_three(2), সি প্রয়োগকারীকে অপারেন্ডগুলি মূল্যায়ন করতে হবে এবং পার্শ্ব প্রতিক্রিয়া হিসাবে, বাম অপারেন্ডের সঞ্চিত মান আপডেট করতে হবে। সি 2018 6.5.16 (যা অ্যাসাইনমেন্ট সম্পর্কে) অনুচ্ছেদ 3 আমাদের বলছে যে বাম এবং ডান ক্রিয়াকলাপগুলিতে কোনও অনুক্রম নেই:

অপারেশনগুলির মূল্যায়ন অপরিশোধিত।

এর অর্থ সি প্রয়োগকারী প্রথমে লভ্যালুকে গণনা করার জন্য মুক্ত arr[global_var]( লভালুটি গণনা করে আমরা বোঝাতে চাইছি এই অভিব্যক্তিটি কী বোঝায়), তারপরে মূল্যায়ন করতে update_three(2)এবং শেষ পর্যন্ত পূর্বেরটির সাথে মানটির নির্ধারণ করতে; বা update_three(2)প্রথমে মূল্যায়ন করতে , তারপরে লভ্যালুটি গণনা করুন, তারপরে পূর্বেরটিকে পরবর্তীটির জন্য নির্ধারণ করুন; বা ল্যাভালুটি মূল্যায়ন করতে এবং update_three(2)কিছু অন্তর্নিহিত ফ্যাশনে এবং তারপরে বাম দিকের লভ্যালুতে ডান মান নির্ধারণ করুন।

সমস্ত ক্ষেত্রে, লভালুতে মান নির্ধারণের কাজটি অবশ্যই শেষ হওয়া উচিত, কারণ 6.5.16 3 এও বলে:

… বাম অপারেন্ডের সঞ্চিত মান আপডেট করার পার্শ্ব প্রতিক্রিয়াটি বাম এবং ডান অপারেন্ডগুলির মান গণনা পরে ক্রমযুক্ত ...

সিকোয়েন্সিং লঙ্ঘন

কেউ কেউ উভয়ই global_var6.৫% লঙ্ঘন করে ব্যবহার এবং পৃথকভাবে আপডেট করার কারণে অপরিজ্ঞাত আচরণের বিষয়ে চিন্তা করতে পারে , যা বলে:

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

এটি অনেক সি চর্চাকারীর পক্ষে বেশ পরিচিত যে মত প্রকাশের আচরণ x + x++সি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত হয় না কারণ তারা উভয়ই xবিন্যাস ছাড়াই একই অভিব্যক্তিতে এটির মান আলাদাভাবে সংশোধন করে। তবে, এই ক্ষেত্রে, আমাদের একটি ফাংশন কল রয়েছে, যা কিছু ক্রম সরবরাহ করে। global_varব্যবহৃত হয় arr[global_var]এবং ফাংশন কল আপডেট করা হয় update_three(2)

.5.৫.২.২ 10 আমাদের ফাংশন বলার আগে একটি সিকোয়েন্স পয়েন্ট রয়েছে বলে জানিয়েছে:

ফাংশন ডিজাইনার এবং আসল আর্গুমেন্টগুলির মূল্যায়নের পরে কিন্তু ক্রিয়াকলাপের আগে একটি সিকোয়েন্স পয়েন্ট রয়েছে ...

ফাংশন ভিতরে, global_var = val;একটি হল পূর্ণ অভিব্যক্তি , এবং তাই হয় 3মধ্যে return 3;, প্রতি 6.8 4:

একটি সম্পূর্ণ এক্সপ্রেশন হ'ল এমন অভিব্যক্তি যা অন্য কোনও অভিব্যক্তির অংশ নয়, বা কোনও ঘোষণাকারীর বা বিমূর্ত ঘোষণাকারীর অংশ নয় ...

তারপরে এই দুটি এক্সপ্রেশনগুলির মধ্যে একটি ক্রম বিন্দু রয়েছে, আবার 6.8 4 প্রতি:

… একটি সম্পূর্ণ এক্সপ্রেশন মূল্যায়ন এবং পরবর্তী পূর্ণ অভিব্যক্তি মূল্যায়নের মধ্যে মূল্যায়নের মধ্যে একটি সিকোয়েন্স পয়েন্ট রয়েছে।

সুতরাং, সি বাস্তবায়ন arr[global_var]প্রথমে মূল্যায়ন করতে পারে এবং তারপরে ফাংশন কল করতে পারে, যার ক্ষেত্রে তাদের মধ্যে একটি ক্রম বিন্দু রয়েছে কারণ ফাংশন কলের আগে একটি রয়েছে, বা এটি global_var = val;ফাংশন কলটিতে মূল্যায়ন করতে পারে এবং তারপরে arr[global_var], কোন ক্ষেত্রে আছে তাদের মধ্যে একটি সিকোয়েন্স পয়েন্ট কারণ সম্পূর্ণ এক্সপ্রেশনের পরে একটি রয়েছে। সুতরাং আচরণটি অনির্দিষ্ট is এই দুটি জিনিসের যে কোনও একটিই প্রথমে মূল্যায়ন করা যেতে পারে — তবে এটি অপরিজ্ঞাত নয়।


24

এখানে ফলাফল অনির্ধারিত

কোনও এক্সপ্রেশনে ক্রিয়াকলাপের ক্রমটি, যা সূপ এক্সপ্রেশনগুলি কীভাবে শ্রেণিবদ্ধ করা হয় তা নির্ধারণ করে, মূল্যায়নের ক্রম নির্দিষ্ট করা হয়নি। এক্ষেত্রে এর অর্থ হ'ল হয় global_varপ্রথমে পড়তে পারে বা কলটি update_threeআগে ঘটতে পারে তবে কোনটি জানার উপায় নেই।

নেই না অনির্ধারিত আচরণ এখানে কারণ একটি ফাংশন কল একটি ক্রম বিন্দু প্রবর্তন, যেমন যে মডিফাই সহ ফাংশন প্রতিটি বিবৃতি দেয় global_var

স্পষ্ট করার জন্য, সি স্ট্যান্ডার্ডটি ৩.৪.৩ বিভাগে অপরিজ্ঞিত আচরণকে এইভাবে সংজ্ঞায়িত করেছে :

অপরিবর্তিত আচরণ

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

এবং অনুচ্ছেদ 3.4.4 বিভাগে অনির্দিষ্ট আচরণ হিসাবে সংজ্ঞা দেয়:

অনির্দিষ্ট আচরণ

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

স্ট্যান্ডার্ডটি বলেছে যে ফাংশন আর্গুমেন্টগুলির মূল্যায়ন আদেশটি অনির্ধারিত, যা এই ক্ষেত্রে এর অর্থ হয় যে arr[0]3 হয় সেট হয়ে যায় বা 3 এ arr[2]সেট হয়ে যায়।


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

2
@ এরিকপোস্টপিসিল সি -11 পূর্বের পরিভাষায় একটি ক্রিয়াকলাপের প্রবেশ এবং প্রস্থান সম্পর্কে একটি সিকোয়েন্স পয়েন্ট রয়েছে। সি 11 পরিভাষায় পুরো ফাংশন বডি কলিং প্রসঙ্গে শ্রদ্ধার সাথে অনির্দিষ্টভাবে ক্রমযুক্ত হয়। এটি উভয়ই একই জিনিসটি নির্দিষ্ট করে চলেছে, কেবল বিভিন্ন পদ ব্যবহার করে
এমএম

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

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

@ এরিকপোস্টপিসিল আপনার এখানে সিকোয়েন্স পয়েন্ট রয়েছে (সি 11 তথ্যমূলক এনেক্সেক্স সি থেকে): "ফাংশন ডিজাইনারের মূল্যায়ন এবং একটি ফাংশন কল এবং আসল কলটিতে আসল আর্গুমেন্টের মধ্যে। (6.5.2.2)", "একটি সম্পূর্ণ এক্সপ্রেশন মূল্যায়নের মধ্যে এবং পরবর্তী পূর্ণ এক্সপ্রেশনটি মূল্যায়ন করা হবে ... / - / ... (রিটার্ন স্টেটমেন্টে optionচ্ছিক) প্রকাশ (6.8.6.4) "। এবং ভাল, প্রতিটি সেমিকোলনেও, যেহেতু এটি একটি সম্পূর্ণ প্রকাশ।
লন্ডিন

1

আমি চেষ্টা করেছিলাম এবং 0 টি আপডেট পেয়েছিলাম।

তবে এই প্রশ্ন অনুসারে: একটি অভিব্যক্তির ডানদিকে সর্বদা প্রথমে মূল্যায়ন করা হবে

মূল্যায়নের ক্রম অনির্দিষ্ট এবং অনিচ্ছাকৃত। সুতরাং আমি মনে করি এর মতো কোড এড়ানো উচিত।


আমি 0 এন্ট্রি এ আপডেট পেয়েছিলাম।
জিমিনিয়ন

1
আচরণটি অপরিজ্ঞাত নয় তবে অনির্ধারিত। স্বাভাবিকভাবে উভয়ের উপর নির্ভর করে এড়ানো উচিত।
আন্তি হাপাল

@ আন্টিহাপালা আমি সম্পাদনা করেছি
মিকেল বি।

1
হুম আহ এবং এটি অনিচ্ছাকৃত নয় তবে অনির্দিষ্টকালের জন্য ক্রমযুক্ত ... 2 টি লোক একটি সারিতে এলোমেলোভাবে দাঁড়িয়ে থাকা অনির্দিষ্টকালের জন্য ক্রমযুক্ত। এজেন্ট স্মিথের ভিতরে নিও অনিচ্ছাকৃত এবং অপরিবর্তিত আচরণ হবে।
এন্টি হাপাল

0

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

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

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

int idx = global_var;
arr[idx] = update_three(2);

বা কোডিং:

int temp = update_three(2);
arr[global_var] = temp;

থাম্বটির একটি ভাল নিয়ম হিসাবে: যদি না গ্লোবাল ভেরিয়েবলগুলি হয় const(বা এগুলি না হয় তবে আপনি জানেন যে কোনও কোডই এগুলি কোনও পার্শ্ব প্রতিক্রিয়া হিসাবে পরিবর্তন করে না), আপনার কখনও এগুলি সরাসরি কোডে ব্যবহার করা উচিত নয়, যেমন একাধিক-থ্রেড পরিবেশে, এমনকি এটি অপরিশোধিত করা যেতে পারে:

int result = global_var + (2 * global_var);
// Is not guaranteed to be equal to `3 * global_var`!

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

(কেবলমাত্র কেউ যদি জিজ্ঞাসা করেন যে কেউ কেন তার x + 2 * xপরিবর্তে এটি করবেন 3 * x- কিছু সিপিইউতে সংযোজন অতি-দ্রুত এবং একইভাবে দুটি পাওয়ার দ্বারা গুণন করা হয় কারণ সংকলক এগুলিকে বিট শিফটে পরিণত করবে 2 * x == x << 1)) তবে স্বেচ্ছাসেবী সংখ্যার সাথে গুণটি খুব ধীর হতে পারে সুতরাং, 3 দ্বারা গুণনের পরিবর্তে, আপনি x কে 1 দিয়ে বিট শিফট করে এবং এক্সকে যুক্ত করে আরও দ্রুত কোড পাবেন - এবং এমনকি সেই কৌশলটি আধুনিক সংকলকগুলি দ্বারা সম্পাদিত হয় যদি আপনি 3 দ্বারা গুণ করে এবং আক্রমণাত্মক অপ্টিমাইজেশন চালু করেন তবে এটি আধুনিক লক্ষ্য না হলে সিপিইউ যেখানে গুণের যোগ হিসাবে সমান দ্রুত হয় ততক্ষণ কৌশলটি গণনাটি কমিয়ে দেবে))


2
এটি অপরিবর্তিত আচরণ নয় - মানক সম্ভাব্যতার তালিকা করে এবং এর মধ্যে একটিতে যে কোনও পরিস্থিতিতে বেছে নেওয়া হয়
আন্তি হাপাল

সংকলকটি 3 * xx এর দুটি পঠকে পরিণত হবে না । এটি একবার x পড়তে পারে এবং তারপরে x + 2 * x পদ্ধতিটি এটি রেজিস্টারে x পড়তে পারে
এমএম

6
@ মেক্কি "যদি আপনি কোডটি না দেখে ফলাফল কী তা বলতে না পারেন তবে ফলাফলটি অপরিজ্ঞাত " - সি / সি ++ এ অপরিজ্ঞাত আচরণের একটি নির্দিষ্ট অর্থ রয়েছে এবং এটি তা নয়। অন্যান্য answerers ব্যাখ্যা কেন এই বিশেষ উদাহরণস্বরূপ হয় অনির্দিষ্ট , কিন্তু না undefined
মার্শাল

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

2
@Mecki " অনির্দিষ্ট ইংরেজি ভাষাও খুব বিশেষ অর্থ " ... কিন্তু একটা প্রশ্ন লেবেলযুক্ত language-lawyer, যেখানে প্রশ্নে ভাষা তার রয়েছে নিজস্ব "খুব বিশেষ অর্থ" জন্য undefined , আপনি শুধুমাত্র ব্যবহার করছেন না দ্বারা কারণ বিভ্রান্তির যাচ্ছেন ভাষার সংজ্ঞা
ট্রিপহাউন্ড

-1

গ্লোবাল এডিট: সরি বলছি, আমি সবাই বরখাস্ত হয়েছি এবং প্রচুর বাজে কথা লিখেছি। সবেমাত্র একটি পুরানো গিজার রেটিং।

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

আমি কে ও আর এর দিনগুলিতে কিছু সমালোচিত রিয়েল-টাইম এম্বেডেড সিস্টেমগুলি আবার নকশা করে এবং প্রয়োগ করেছি (একটি বৈদ্যুতিক গাড়ির কন্ট্রোলার যা ইঞ্জিনটি পরীক্ষায় না রাখলে লোকেরা নিকটবর্তী প্রাচীরের সাথে বিধ্বস্ত হওয়া লোক পাঠাতে পারে, একটি 10 ​​টন শিল্প রোবট যা সঠিকভাবে কমান্ড না দিলে লোককে স্ক্ল্যাশে ফেলতে পারে এবং এমন একটি সিস্টেম স্তর যা ক্ষতিগ্রস্থ হলেও কয়েক ডজন প্রসেসর তাদের ডেটা বাসটিকে 1% এরও কম সিস্টেমের ওভারহেড দিয়ে শুকিয়ে ফেলতে পারে)।

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

চোখের জল সরবরাহকারী মেমরি বাধা বিমূর্ততাগুলির এই সমস্ত ট্রাকলোড কেবলমাত্র বহু-সিপিইউ ক্যাশে সিস্টেমের সীমাবদ্ধতার অস্থায়ী সেটগুলির কারণে, এগুলির সবগুলি সাধারণ ওএস সিঙ্ক্রোনাইজেশন অবজেক্টগুলিতে নিরাপদে এনক্যাপুলেটেড করা যেতে পারে যেমন উদাহরণস্বরূপ, মিউটেক্স এবং শর্ত ভেরিয়েবল সি ++ অফার.
এই এনক্যাপসুলেশনটির ব্যয়টি পারফরম্যান্সে এক মিনিট ড্রপ যা তুলনায় সূক্ষ্ম দানাযুক্ত নির্দিষ্ট সিপিইউ নির্দেশাবলী ব্যবহার করতে পারে তার কিছু ক্ষেত্রে। শব্দ (বা একটি
volatile#pragma dont-mess-with-that-variableসকলের জন্য, আমি একটি সিস্টেম প্রোগ্রামার হিসাবে, যত্ন) মেমরি অ্যাক্সেসগুলি পুনরায় সাজানো বন্ধ করতে সংকলকটি বলার পক্ষে যথেষ্ট ছিল। অ্যাডহক সিপিইউ নির্দিষ্ট নির্দেশাবলীর সাথে নিম্ন স্তরের ড্রাইভার এবং ওএস কোড ছিটানোর জন্য সরাসরি এএসএম নির্দেশাবলী সহ সর্বোত্তম কোডটি সহজেই উত্পাদিত হতে পারে। অন্তর্নিহিত হার্ডওয়্যার (ক্যাশে সিস্টেম বা বাস ইন্টারফেস) কীভাবে কাজ করে তার অন্তরঙ্গ জ্ঞান ব্যতীত আপনি যেভাবেই অকেজো, অদক্ষ বা ত্রুটিযুক্ত কোডটি লিখতে বাধ্য bound

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

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

একটি উপসংহার হিসাবে, এই সঙ্কলিত সি এর সংকলক থেকে কোনও সংকলক একটি সামঞ্জস্যপূর্ণ মেশিন কোড তৈরি করতে পারে তা এই সত্য যে কেবল 2000 + এর দশকের শেষের দিকে ক্যাশ সিস্টেমগুলির সম্ভাব্য অসামঞ্জস্যতা সহ সি ++ ছেলেরা যেভাবে মোকাবেলা করেছিল তার একটি সুদূরপ্রসারী পরিণতি।
এটি সি (এক্সপ্রেশন সংজ্ঞা) এর একটি মৌলিক দিকটির একটি ভয়াবহ জগাখিচুড়ি করেছে, যাতে সি প্রোগ্রামারদের সংখ্যাগরিষ্ঠ - যারা ক্যাশে সিস্টেম সম্পর্কে কোনও অভিবাদন দেয় না, এবং যথাযথভাবে - এখন ব্যাখ্যা করতে গুরুদের উপর নির্ভর করতে বাধ্য হয় a = b() + c()এবং মধ্যে পার্থক্য a = b + c

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

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

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

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

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


একই অভিব্যক্তিতে একই বস্তুর উপর পার্শ্ব প্রতিক্রিয়া থাকলে এটি অপরিজ্ঞাত আচরণ, C17 6.5 / 2। এগুলি সি 17 6.5.18 / 3 অনুযায়ী অনিচ্ছাকৃত। তবে 6.5 / 2 এর পাঠ্য "যদি একই স্কেলার অবজেক্টের কোনও আলাদা পার্শ্ব প্রতিক্রিয়া বা একই স্কেলারের বস্তুর মান ব্যবহার করে একটি মান গণনার তুলনায় কোনও স্কেলার অবজেক্টের কোনও পার্শ্ব প্রতিক্রিয়া যদি অনিচ্ছাকৃত হয় তবে আচরণটি অপরিজ্ঞাত।" প্রযোজ্য নয়, যেহেতু অ্যাসাইনমেন্ট অপারেটর নিজেই অনিচ্ছাকৃত অপারেশনগুলি নির্বিশেষে ফাংশনটির অভ্যন্তরের মান গণনাটি অ্যারে সূচক অ্যাক্সেসের আগে বা পরে ক্রমযুক্ত হয়।
লন্ডিন

যদি আপনি চান তবে ফাংশন কলটি "অমীমাংসিত অ্যাক্সেসের বিরুদ্ধে একটি মিটেক্স" এর মতো কাজ করে। অস্পষ্ট কমা অপারেটর ক্রেপ মত অনুরূপ 0,expr,0
লন্ডিন

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

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

আমি আপনার মন্তব্যে পয়েন্টটি দেখতে ব্যর্থ। সংকলক-নির্দিষ্ট আচরণের উপর নির্ভর করা বহনযোগ্যতার গ্যারান্টি। এটি সংকলক প্রস্তুতকারকের উপরও প্রচুর বিশ্বাসের প্রয়োজন, যিনি যে কোনও মুহুর্তে এই "অতিরিক্ত সংজ্ঞা" কোনওটি বন্ধ করতে পারেন। একটি সংকলক কেবলমাত্র সতর্কতা তৈরি করতে পারে, যা একজন জ্ঞানী এবং জ্ঞানী প্রোগ্রামার ত্রুটির মতো পরিচালনা করার সিদ্ধান্ত নিতে পারে। এই আইএসও দানবটির সাথে আমি যে সমস্যাটি দেখছি তা হ'ল এটি ওপির উদাহরণ বৈধ হিসাবে অত্যন্ত নৃশংস কোড তৈরি করে (অত্যন্ত অস্পষ্ট কারণে, একটি অভিব্যক্তির কেএন্ডআর সংজ্ঞা তুলনায়)।
কুরোই নেখো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.