সি ++ এর 'অপরিজ্ঞাপিত আচরণ' (ইউবি) এবং সি # বা জাওয়ার মতো অন্যান্য ভাষা কেন হয় না?


50

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




3
এবং তবুও এই পোস্টটি জাভা স্পেসে এমনকি অপরিজ্ঞাত আচরণকে বোঝায়!
gbjbaanb

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

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

উত্তর:


72

অপরিজ্ঞাত আচরণ হ'ল সেই বিষয়গুলির মধ্যে একটি যা কেবল পূর্ববর্তী ক্ষেত্রে খুব খারাপ ধারণা হিসাবে স্বীকৃত হয়েছিল।

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

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

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

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

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


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

13
উত্তরের মূল অংশটি আমার পক্ষে সত্যিই বিশ্বাসযোগ্য মনে হচ্ছে না। মানে, মূলত এমন একটি ফাংশন লেখা অসম্ভব যা নিরাপদে int32_t add(int32_t x, int32_t y)সি ++ এ দুটি সংখ্যা (যেমন হিসাবে ) যুক্ত করে। এগুলির চারপাশের সাধারণ তর্কগুলি দক্ষতার সাথে সম্পর্কিত, তবে প্রায়শই কিছু পোর্টেবিলিটি আর্গুমেন্টগুলির সাথে ছেদ করা হয় (যেমন "একবার লিখুন, চালান ... আপনি যে প্ল্যাটফর্মটিতে লিখেছেন সেখানে ... এবং অন্য কোথাও নেই ;-)")। মোটামুটিভাবে, একটি যুক্তি হতে পারে: কিছু জিনিস অপরিজ্ঞাত কারণ আপনি জানেন না আপনি 16 বিট মাইক্রোকন্টোলার বা একটি 64 বিট সার্ভার (দুর্বল, তবে এখনও একটি যুক্তি)
মার্কো 13

12
@ মার্কো 13 রাজি হয়েছে - এবং কিছু "সংজ্ঞায়িত আচরণ" তৈরি করে "অপরিজ্ঞাত আচরণ" ইস্যু থেকে মুক্তি পাচ্ছেন, তবে ব্যবহারকারীরা যা চেয়েছিলেন তা অগত্যা নয় এবং যখন "অপরিজ্ঞাত আচরণের পরিবর্তে" ঘটে থাকে তখন কোনও সতর্কতা না দিয়ে কেবল কোড-আইনজীবী গেমস আইএমও খেলছে ।
আলেফজেরো

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

34
"অপরিজ্ঞাত আচরণ এমন একটি জিনিস যা কেবল পূর্ববর্তী ক্ষেত্রে খুব খারাপ ধারণা হিসাবে স্বীকৃত হয়েছিল।" এটা আপনার মতামত। অনেক (আমার অন্তর্ভুক্ত) এটি ভাগ করে না।
মনিকার সাথে লাইটনেস রেস

103

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

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

অ্যারে ব্যবহার করে কোডটি পড়ার আগে যেভাবেই এটি পপুলেট করতে চলেছে, এটি মূলত জাভার জন্য প্রচেষ্টা নষ্ট করা। তবে কোডটি প্রথমে পড়ার ক্ষেত্রে জাভাতে আপনি পূর্বাভাসের ফলাফল পান তবে সি-তে অনুমানযোগ্য ফলাফল পাবেন


19
এইচএলএল দ্বিধায়নের দুর্দান্ত উপস্থাপনা: সুরক্ষা এবং ব্যবহারের সহজতা বনাম পারফরম্যান্স। সিলভার বুলেট নেই: প্রতিটি পক্ষের জন্য ব্যবহারের কেস রয়েছে।
ক্রিস্টোফ

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

4
একটি ডাটা স্ট্রাকচার যে একটি ভাল উদাহরণ ইচ্ছাকৃতভাবে uninitialized অবস্থানে সার্চ ব্রিগস এবং Torczon এর বিক্ষিপ্ত সেট উপস্থাপনা (যেমন দেখুন codingplayground.blogspot.com/2009/03/... ) যেমন একটি সেটের সূচনা হে (1) সি, কিন্তু হে ( n) জাভা জোর করে শুরু করার সাথে।
আর্চ ডি রবিসন

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

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

42

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

Http://blog.llvm.org/2011/05/ কি-every-c-programmer-should- ज्ञान.html দেখুন

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


স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লো: যদি কোনও 'আন্ত' টাইপ (উদাহরণস্বরূপ) ওভারফ্লোতে গাণিতিক হয়, তবে ফলাফলটি অনির্ধারিত। একটি উদাহরণ হ'ল "INT_MAX + 1" INT_MIN হওয়ার গ্যারান্টিযুক্ত নয়। এই আচরণটি কয়েকটি কোডের জন্য গুরুত্বপূর্ণ এমন কয়েকটি শ্রেণীর অনুকূলিতাকে সক্ষম করে। উদাহরণস্বরূপ, INT_MAX + 1 অপরিজ্ঞাপিত তা জেনেও "X + 1> X" কে "সত্য" রূপান্তর করতে সহায়তা করে। গুণটি জানা "ওভারফ্লো" করতে পারে না (কারণ এটি করা অপরিজ্ঞাত হবে) "X * 2/2" কে "এক্স" তে অনুকূলিতকরণের অনুমতি দেয়। এগুলি যদি তুচ্ছ মনে হতে পারে তবে এই ধরণের জিনিসগুলি সাধারণত ইনলাইনিং এবং ম্যাক্রো প্রসারণ দ্বারা প্রকাশ করা হয়। আরও গুরুত্বপূর্ণ অপ্টিমাইজেশন যা এটি অনুমতি দেয় এটি "<=" লুপগুলির জন্য:

for (i = 0; i <= N; ++i) { ... }

এই লুপটিতে, সংকলক ধরে নিতে পারে যে "i" ওভারফ্লোতে অপরিজ্ঞাত থাকলে লুপটি ঠিক N + 1 বার পুনরাবৃত্তি করবে, যা লুপ অপ্টিমাইজেশনের বিস্তৃত পরিসরে লাথি মারার অনুমতি দেয় the অন্যদিকে, চলকটি যদি সংজ্ঞায়িত করা হয় ওভারফ্লোতে চারপাশে মোড়ানো, তারপরে সংকলকটিকে ধরে নিতে হবে যে লুপটি সম্ভবত অসীম (যা এনএনT_MAX হয় তবে ঘটে) - যা এই গুরুত্বপূর্ণ লুপ অপটিমাইজেশন অক্ষম করে। এটি বিশেষত 64৪-বিট প্ল্যাটফর্মগুলিকে প্রভাবিত করে যেহেতু এতগুলি কোড "ইনট" ইনডাকশন ভেরিয়েবল হিসাবে ব্যবহার করে।


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

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

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

2
@ সুপের্যাট: Wrt_loosely সংজ্ঞায়িত_, পূর্ণসংখ্যার ওভারফ্লোর জন্য যৌক্তিক পছন্দটি বাস্তবায়ন সংজ্ঞায়িত আচরণের প্রয়োজন। এটি একটি বিদ্যমান ধারণা এবং এটি বাস্তবায়নের ক্ষেত্রে অযৌক্তিক বোঝা নয়। আমার সন্দেহ, বেশিরভাগ লোক "র‌্যাপের চারপাশে এটি 2 এর পরিপূরক" দিয়ে পালিয়ে যাবে I <<কঠিন ক্ষেত্রে হতে পারে।
এমএসএলটাররা

@ এসএমএলটারদের একটি সহজ এবং সুচিকিৎসা সমাধান রয়েছে যা অপরিজ্ঞাত আচরণ বা বাস্তবায়নের সংজ্ঞায়িত আচরণ নয়: অবিচ্ছিন্ন আচরণবাদী আচরণ behavior এটি, আপনি বলতে পারেন " x << yপ্রকারের কিছু বৈধ মানকে মূল্যায়ন করে int32_tতবে আমরা যা বলব না"। এটি প্রয়োগকারীদের দ্রুত দ্রবণটি ব্যবহার করতে দেয়, তবে সময়-ভ্রমণের শৈলীর অপ্টিমাইজেশনের অনুমতি দেয় এমন একটি মিথ্যা পূর্বশর্ত হিসাবে কাজ করে না কারণ ননডেটেরিনিজম এই একটি ক্রিয়াকলাপের আউটপুটকে সীমাবদ্ধ করে - স্পষ্ট গ্যারান্টি দেয় যে স্মৃতি, উদ্বায়ী ভেরিয়েবল ইত্যাদি দৃশ্যমানভাবে প্রভাবিত হয় না the অভিব্যক্তি মূল্যায়ন দ্বারা। ...
মারিও কার্নেইরো

20

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

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


সুতরাং আপনি কি বলছেন যে পিছনের দিকের সামঞ্জস্যতা কেবলমাত্র সি এবং সি ++ অপরিবর্তিত আচরণ থেকে বেরিয়ে আসার কারণ নয়?
সিসির

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

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

14

জেভিএম এবং। নেট ভাষাগুলির কাছে এটি সহজ:

  1. তাদের হার্ডওয়্যার দিয়ে সরাসরি কাজ করতে সক্ষম হতে হবে না।
  2. তাদের কেবলমাত্র আধুনিক ডেস্কটপ এবং সার্ভার সিস্টেম বা যুক্তিসঙ্গত অনুরূপ ডিভাইস, বা তাদের জন্য ডিজাইন করা কমপক্ষে ডিভাইসগুলির সাথে কাজ করতে হবে।
  3. তারা সমস্ত স্মৃতিচারণের জন্য আবর্জনা-সংগ্রহ চাপিয়ে দিতে পারে এবং জোর করে সূচনা করতে পারে, সুতরাং এটি পয়েন্টার-সুরক্ষা পাবে।
  4. তারা একক অভিনেতা দ্বারা নির্দিষ্ট করা হয়েছে যিনি একক নির্দিষ্ট বাস্তবায়নও সরবরাহ করেছিলেন।
  5. তারা পারফরম্যান্সের তুলনায় সুরক্ষা চয়ন করতে পারে।

পছন্দগুলির জন্য ভাল পয়েন্ট রয়েছে যদিও:

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

যেখানে পলায়ন-হ্যাচ সরবরাহ করা হয়, সেগুলি পুরোপুরি বর্ধিত অপরিজ্ঞাত আচরণকে ফিরে আসার আমন্ত্রণ জানায় But তবে কমপক্ষে এগুলি সাধারণত কয়েকটি খুব স্বল্প প্রান্তে ব্যবহৃত হয়, যা ম্যানুয়ালি যাচাই করা সহজ are


3
প্রকৃতপক্ষে. আমি আমার কাজের জন্য সি # তে প্রোগ্রাম করি। প্রতিবার কিছুক্ষণের মধ্যে আমি অনিরাপদ হাতুড়িগুলির একটিতে ( unsafeকীওয়ার্ড বা বৈশিষ্ট্যগুলিতে System.Runtime.InteropServices) পৌঁছায় । এই স্টাফটি কয়েকজন প্রোগ্রামারদের কাছে রেখে যারা কীভাবে নিয়ন্ত্রণহীন স্টাফগুলি ডিবাগ করতে জানে এবং এর ব্যবহারিক হিসাবে সামান্য হিসাবে, আমরা বিষয়গুলি নীচে রাখি। সর্বশেষ পারফরম্যান্স-সম্পর্কিত অনিরাপদ হাতুড়ি থেকে 10 বছরেরও বেশি সময় পেরিয়ে গেছে তবে কখনও কখনও আপনি এটি করতে হবে কারণ আক্ষরিক কোনও সমাধান নেই।
জোশুয়া

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

5
@ বেনভয়েট আমাদের মধ্যে এমন কিছু লোক বাস করে যেখানে একটি ছোট কম্পিউটার সম্ভবত কোড স্পেসের 4k, একটি নির্দিষ্ট 8 স্তরের কল / রিটার্ন স্ট্যাক, র‌্যামের 64 বাইট, 1MHz ঘড়ি এবং 1000 ডলারে <<0.20 মূল্য দেয় costs একটি আধুনিক মোবাইল ফোন হ'ল একটি ছোট পিসি যা সমস্ত উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য বেশ সীমাহীন স্টোরেজ সহ, এবং এটি একটি পিসি হিসাবে বেশ চিকিত্সা করা যেতে পারে। সমস্ত বিশ্বই মাল্টিকোর নয় এবং রিয়েলটাইমের সীমাবদ্ধতার অভাব রয়েছে।
ড্যান মিলস

2
@ ডানমিলস: আর্ম কর্টেক্স এ প্রসেসরের সাথে এখানে আধুনিক মোবাইল ফোনের কথা বলছি না, ২০০২ সালে "ফিচার ফোনগুলি" সার্কাস সম্পর্কে কথা বলছি। হ্যাঁ এসআরএম-এর 192 কেবি 64 বাইটের চেয়ে অনেক বেশি (যা "ছোট" নয় "ক্ষুদ্র") তবে 192 কেবি 30 বছর ধরে সঠিকভাবে "আধুনিক" ডেস্কটপ বা সার্ভার বলা হয় নি। এছাড়াও আজকাল 20 সেন্ট আপনাকে এসআরএএম এর 64 বাইটের চেয়ে অনেক বেশি একটি এমএসপি 430 পাবে।
বেন ভয়েগ্ট

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

8

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

এটি এমন কারণ হ'ল হার্ডওয়্যার আর্কিটেকচারে একটি আচরণ চয়ন করা ব্যয়বহুল হতে পারে যা অন্য পছন্দের দিকে পক্ষপাতদুষ্ট হয় - অন্তর্নিহিতা হ'ল স্পষ্ট পছন্দ।


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

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

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

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

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

6

আসল কারণটি হ'ল একদিকে সি এবং সি ++, এবং অন্যদিকে জাভা এবং সি # (কেবলমাত্র কয়েকটি উদাহরণের জন্য) এর মধ্যে অভিপ্রায় একটি মৌলিক পার্থক্য to Historicalতিহাসিক কারণে, এখানে বেশিরভাগ আলোচনা সি ++ এর পরিবর্তে সি সম্পর্কে কথা বলে, তবে (আপনি সম্ভবত ইতিমধ্যে জানেন) সি ++ সি এর মোটামুটি প্রত্যক্ষ বংশধর, সুতরাং এটি সি সম্পর্কে যা বলে তা সি ++ তে সমানভাবে প্রযোজ্য।

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

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

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

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

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

আমি কয়েকটি সম্ভাবনা দেখতে পাচ্ছি যা ছেড়ে যায়:

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

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

আর একটি বিষয় যা প্রায়শই প্রায়শই আসে তা হ'ল পূর্ণসংখ্যার ধরণের আকার। সি "অবস্থান" নেয় intযা আর্কিটেকচারের প্রস্তাবিত প্রাকৃতিক আকার হওয়া উচিত। সুতরাং, যদি আমি একটি 32-বিট ভ্যাক্স প্রোগ্রামিং করছি, intসম্ভবত 32 বিট হওয়া উচিত, তবে আমি যদি 36-বিট ইউনিভ্যাক প্রোগ্রামিং করছি তবে intসম্ভবত 36 বিট (এবং আরও কিছু) হওয়া উচিত। ৮ বিট কম্পিউটারের জন্য অপারেটিং সিস্টেম লিখতে সম্ভবত যুক্তিসঙ্গত নয় (কেবলমাত্র 8 বিটের আকারের গ্যারান্টিযুক্ত এমন প্রকারগুলি ব্যবহার করে) computer হতে পারে আমি কেবলমাত্র মাত্রাতিরিক্ত হয়ে উঠছি, তবে আমার কাছে মনে হয় যে আমি যদি ৩ 36-বিট মেশিনের জন্য একটি ওএস লিখছিলাম, তবে আমি সম্ভবত একটি ভাষা ব্যবহার করতে চাই যা ৩ that-বিট টাইপের সমর্থন করে।

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

জাভা এবং সি # এগুলি সব উপেক্ষা করতে পারে। তারা অপারেটিং সিস্টেম রাইটিং সমর্থন করার উদ্দেশ্যে নয়। তাদের সাথে, আপনার কয়েকটি পছন্দ আছে। একটি হ'ল হার্ডওয়্যারকে যা দাবি করা হয় সেগুলি সমর্থন করা - যেহেতু তারা 8, 16, 32 এবং 64 বিট জাতীয় প্রকারের দাবি করে, কেবল সেই আকারগুলি সমর্থন করে এমন হার্ডওয়্যার তৈরি করুন। অন্যান্য স্পষ্টত সম্ভাবনাটি হ'ল অন্তর্নিহিত হার্ডওয়্যারটি যা चाहे তা বিবেচনা না করেই কেবল ভাষাটিকে অন্য যে সফ্টওয়্যার দ্বারা তারা যে পরিবেশ চায় সেগুলি সরবরাহ করে top

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

সারাংশ

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


4

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

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


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

4
আপনার অপ্রকাশিত আচরণের সাথে অনির্ধারিত আচরণ বা আরও বাধাবদ্ধ কিছু এখনও শক্তিশালী চলছে এমন প্রতিস্থাপনের জন্য আপনার প্রচার প্রচুর মনে হচ্ছে।
ডিসিপ্লিকেটর

1
@ অ্যানটোলিগ: আপনি যদি ইতিমধ্যে না পেয়ে থাকেন তবে প্রকাশিত সি রেশনাল ডকুমেন্টটি পড়ুন (গুগলে সি 99 রেশনাল টাইপ করুন)। পৃষ্ঠা 11 লাইন 23-29 "মার্কেটপ্লেস" সম্পর্কে কথা বলে, এবং পৃষ্ঠা 13 লাইন 5-8 পোর্টেবিলিটি সম্পর্কে কী উদ্দেশ্য তা সম্পর্কে আলোচনা করে। আপনি কীভাবে মনে করেন যে কোনও বাণিজ্যিক সংকলক সংস্থার একজন বস যদি কোনও সংকলক লেখক প্রোগ্রামারদের বলেছিলেন যে অপটিমাইজার কোডটি নষ্ট করেছে যে প্রতিটা সংকলক দরকারীভাবে পরিচালনা করেছে যে তাদের কোডটি "ভাঙ্গা" কারণ এটি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত না করে এমন ক্রিয়া সম্পাদন করে এবং এটি সমর্থন করতে অস্বীকার করেছে কারণ এটি অবিরত প্রচার করবে ...
5:52

1
... এই ধরনের কনস্ট্রাক্টসের ব্যবহার? এ জাতীয় দৃষ্টিভঙ্গি ঝনঝন এবং জিসিসির সমর্থন বোর্ডগুলিতে সহজেই স্পষ্ট হয় এবং অন্তর্নিহিতদের বিকাশকে বাধাগ্রস্থ করে তোলে যা ভাঙা ভাষার জিসিসি এবং ঝনঝন সমর্থন করার চেয়ে আরও সহজে এবং নিরাপদে অপ্টিমাইজেশনকে সহজতর করতে পারে।
সুপারক্যাট

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

3

সি ++ এবং সি উভয়ের বর্ণনামূলক মান রয়েছে (আইএসও সংস্করণগুলি, যাইহোক)।

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

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

তার চেয়েও গুরুত্বপূর্ণ, জাভা আসলে ওপেন-জেডিকে একটি "রেফারেন্স বাস্তবায়ন" রয়েছে। (আমি মনে করি রোজলিন ভিজ্যুয়াল সি # রেফারেন্স বাস্তবায়ন হিসাবে গণনা করেছেন তবে এর জন্য কোনও উত্স খুঁজে পাননি))

জাভার ক্ষেত্রে, যদি স্ট্যান্ডার্ডে কোনও অস্পষ্টতা থাকে এবং ওপেন-জেডি কে এটি একটি নির্দিষ্ট উপায়ে করে। ওপেন-জেডিকে যেভাবে এটি করে তা মানক।


পরিস্থিতি তার থেকেও খারাপ: আমি মনে করি না যে কমিটি বর্ণনামূলক বা প্রেসক্রিপটিভ বলে বিবেচিত হবে কিনা সে সম্পর্কে কোনও মতামত অর্জন করেছে।
supercat

1

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

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

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

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

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

পরে জাভা এবং সি # এর ভাষা কাঁচা পারফরম্যান্সের তুলনায় অপরিবর্তিত আচরণকে অপসারণকে পছন্দ করে।


-5

এক অর্থে জাভাও আছে। মনে করুন, আপনি অ্যারে.সোর্টকে ভুল তুলনা করেছেন। এটি এটির ব্যতিক্রম ছুঁড়ে ফেলতে পারে। অন্যথায় এটি এমন কোনও অ্যারে বাছাই করবে যা কোনও বিশেষ হওয়ার গ্যারান্টিযুক্ত নয়।

একইভাবে আপনি বেশ কয়েকটি থ্রেড থেকে পরিবর্তনশীল পরিবর্তন করলে ফলাফলও অনাকাঙ্ক্ষিত।

সি ++ আরও অবধারিত আরও পরিস্থিতি তৈরি করতে (বা বরং জাভা আরও ক্রিয়াকলাপ সংজ্ঞায়িত করার সিদ্ধান্ত নিয়েছে) এবং এর একটি নাম রাখার জন্য আরও এগিয়ে গেছে।


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

2
পরিবর্তনশীল পরিবর্তন করার ক্ষেত্রে, জাতি শর্তগুলি সাধারণত অনির্ধারিত আচরণ হিসাবে বিবেচিত হয় না। জাভা কীভাবে ভাগ করা ডেটাতে অ্যাসাইনমেন্টগুলি পরিচালনা করে তার বিশদ জানি না, তবে ভাষার সাধারণ দর্শনটি জেনে আমি নিশ্চিত যে এটি পরমাণু হওয়ার দরকার। একসাথে ৫৩ এবং 71১ এর জন্য নির্ধারণ aকরা অপরিজ্ঞাত আচরণ হবে যদি আপনি এর মধ্যে ৫১ বা get 73 পেতে পারেন তবে আপনি কেবল ৫৩ বা or১ পেতে পারলে এটি সুসংজ্ঞায়িত।
চিহ্নিত করুন

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