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


12

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

uint16_t ffff16 = 0xFFFF;
int64_t who_knows = ffff16 * ffff16;

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

এই নির্দিষ্ট উদাহরণটি কিছুটা স্বতঃস্ফূর্ত, এটিতে আমি বাস্তব-বিশ্বের কোডে আশা করব না যে দুটি 16-বিট মানের উত্পাদনটি একটি 64-বিট মানকে সরাসরি অর্পণ করবে, তবে এটি তিনটি উপায় পূর্ণসংখ্যার দেখানোর জন্য একটি সংক্ষিপ্ত উদাহরণ হিসাবে বেছে নেওয়া হয়েছিল প্রচারগুলি অনুমিত-স্থির আকারের স্বাক্ষরবিহীন প্রকারের সাথে ইন্টারঅ্যাক্ট করতে পারে। কিছু বাস্তব-জগতের পরিস্থিতি রয়েছে যেখানে স্বাক্ষরিত ধরণের গাণিতিকগুলি গাণিতিক পূর্ণসংখ্যার গাণিতিকের নিয়ম অনুযায়ী সম্পাদন করা আবশ্যক, অন্যরা যেখানে এটি প্রয়োজনীয় যে এটি মডুলার গাণিতিকের নিয়ম অনুসারে সম্পাদন করা প্রয়োজন, এবং কিছু যেখানে এটি সত্যই না ' টি ব্যাপার। চেকসামের মতো জিনিসের জন্য প্রচুর রিয়েল-ওয়ার্ল্ড কোড uint32_tগাণিতিক মোড়কে মোড 2³² এর উপর নির্ভর করে এবং স্বেচ্ছাসেবী সম্পাদন করতে সক্ষম হয়েuint16_t পাটিগণিত এবং ফলাফলগুলি প্রাপ্ত হন যা সর্বনিম্ন হয়, যথাযথ Mod 65536 হিসাবে সংজ্ঞায়িত হয় (অপরিজ্ঞাত আচরণের বিপরীতে)।

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

  1. একটি নির্দেশিকা যুক্ত করে যা সংকলককে নির্দিষ্ট "মৌলিক" পূর্ণসংখ্যার ধরণের নির্দিষ্ট আকারকে বাধ্য করতে নির্দেশ দেয়।

  2. টার্গেট আর্কিটেকচারের ধরণের প্রকৃত আকার নির্বিশেষে মেশিনের ধরণের নির্দিষ্ট আকার রয়েছে যদিও মেশিনের ধরণের বিভিন্ন আকারের মূল্যায়ন করার জন্য কম্পাইলারকে নির্দেশ দেয় এমন একটি নির্দেশ যুক্ত করে।

  3. যোগ করার সময় একটি; (নির্দিষ্ট বৈশিষ্ট্য সঙ্গে ধরনের ঘোষণা উদাঃ ঘোষণা করছি যে একটি টাইপ, একটি mod-65536 মোড়ানো বীজগাণিতিক রিং যেমন আচরণ করা উচিত অন্তর্নিহিত শব্দ আকার নির্বিশেষে, এবং পরোক্ষভাবে অন্যান্য ধরনের পরিবর্তনীয় করা উচিত হবে না মানে অনুমতি দিয়ে wrap32একটি থেকে intএকটি উত্পাদ উচিত 16 বিটের চেয়ে বড় wrap32কিনা নির্বিশেষে প্রকারের ফলাফলটি সরাসরি intযুক্ত করা অবৈধ হওয়া উচিত (যেহেতু উভয়ই অন্যটিতে রূপান্তর করতে পারে না)।wrap32wrap16

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

আমি যা খুজছি তা স্পষ্ট করার জন্য কয়েকটি জিনিস রয়েছে; এর মধ্যে উল্লেখযোগ্য হল:

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

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

আমি কোনওভাবেই সি স্ট্যান্ডার্ড কমিটি বা তারা যে কাজটি করেছে তা অস্বীকার করে দেখা হবে না; তবে আমি প্রত্যাশা করি যে কয়েক বছরের মধ্যে মেশিনগুলিতে কোডের সঠিকভাবে কাজ করা প্রয়োজনীয় হয়ে উঠবে যেখানে "প্রাকৃতিক" প্রচারের ধরণটি 32 বিট, সেইসাথে যেখানে এটি 64 বিট হবে those আমি মনে করি ভাষার কিছু পরিমিত বর্ধনের সাথে (C99 এনএনডি সি 14 এর মধ্যে অন্যান্য পরিবর্তনের তুলনায় অনেক বিনয়ী) কেবলমাত্র 64-বিট আর্কিটেকচারকে দক্ষতার সাথে ব্যবহারের একটি পরিষ্কার উপায় সরবরাহ করা সম্ভব হবে না, তবে দর কষাকষির সাথে ইন্টারঅ্যাকশনও সহজতর করা সম্ভব হবে "অস্বাভাবিক-শব্দ-আকার" মেশিনগুলি যে মানকটি historতিহাসিকভাবে সমর্থন করার জন্য পশ্চাদমুখে বাঁকিয়েছে [উদাহরণস্বরূপ, 12-বিটযুক্ত একটি মেশিনকে charকোড চালানো সম্ভব করে যা একটি প্রত্যাশা করেuint32_tto মোড়ানো মোড 2³²]। ভবিষ্যতের এক্সটেনশানগুলির যে দিকনির্দেশনা রয়েছে তার উপর নির্ভর করে, আমি এটিও আশা করব যে ম্যাক্রোগুলি সংজ্ঞায়িত করা সম্ভব হবে যা আজ লিখিত কোডকে আজকের সংকলকগুলিতে ব্যবহারযোগ্য হতে দেয় যেখানে ডিফল্ট পূর্ণসংখ্যার ধরণগুলি "প্রত্যাশিত" হিসাবে আচরণ করে তবে ভবিষ্যতের সংকলকগুলিতে যেখানে ব্যবহারযোগ্য সেখানে পূর্ণ ব্যবহারযোগ্য প্রকারভেদে ডিফল্টরূপে অন্যরকম আচরণ করা হবে তবে প্রয়োজনীয় আচরণগুলি কোথায় সরবরাহ করতে পারে।


4
আপনি কি নিশ্চিত? যেহেতু আমি পূর্ণসংখ্যার প্রচারটি বুঝতে পারি , যদি এর intচেয়ে বড় হয় uint16_t, তবে গুণনের অপারেশনগুলিকে উন্নীত করা হবে এবং গুণকে গুণক intহিসাবে চালিত করা হবে intএবং ফলস্বরূপ intমানটি int64_tআরম্ভের জন্য রূপান্তরিত হবে who_knows

3
@ রবার্টহার্ভে কেমন আছেন? ওপির কোডে, এর কোনও উল্লেখ নেই int, তবুও এটি

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

3
@ রবার্টহারভে: সি স্ট্যান্ডার্ড কমিটির অন্যতম goalsতিহাসিক লক্ষ্য হ'ল প্রায় কোনও মেশিনের জন্য একটি "সি সংকলক" তৈরি করা সম্ভব হয়েছে এবং নিয়মগুলি পর্যাপ্ত সুনির্দিষ্ট হতে হবে যে কোনও নির্দিষ্ট টার্গেট মেশিনের জন্য স্বতঃ-বিকাশিত সি সংকলকগুলি হবে বেশিরভাগ বিনিময়যোগ্য হতে হবে। মানক খসড়া তৈরি হওয়ার আগেই লোকেরা অনেকগুলি মেশিনের জন্য সি সংকলক লিখতে শুরু করেছিল এবং স্ট্যান্ডার্ডস কমিটি কম্পাইলারদের বিদ্যমান কোডের উপর নির্ভর করতে পারে এমন কোনও কিছু করতে নিষেধ করতে চায় নি এই কারণে জটিল হয়েছিল ।
মানকটির

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

উত্তর:


4

কোড এর আদর্শ উদ্দেশ্য হিসাবে

uint16_t ffff16 = 0xFFFF;
int64_t who_knows = ffff16 * ffff16;

64৪ বিটের মধ্যে গুণটি সম্পাদন করা হয় (ভেরিয়েবলের আকারটি ফলটি সঞ্চিত হয়), (প্ল্যাটফর্মটি স্বতন্ত্র) সঠিক ফলাফল পাওয়ার স্বাভাবিক উপায়টি 64৪-বিটের গুণকে বাধ্য করার জন্য অপারেটরগুলির মধ্যে একটিকে ফেলে দেওয়া হয়:

uint16_t ffff16 = 0xFFFF;
int64_t i_know = (int64_t)ffff16 * ffff16;

আমি কখনও কোনও সি এক্সটেনশনের মুখোমুখি হই নি যা এই প্রক্রিয়াটিকে স্বয়ংক্রিয় করে তোলে।


1
আমার প্রশ্নটি কীভাবে কোনও নির্দিষ্ট গাণিতিক অভিব্যক্তির সঠিক মূল্যায়নকে বাধ্য করা যায় না (কোনটি ফলাফলের উপর নির্ভর করে যে কোনও একটি অপরেন্ডকে নিক্ষেপ করে uint32_tঅথবা অন্যথায় আকার হিসাবে #define UMUL1616to16(x,y)((uint16_t)((uint16_t)(x)*(uint16_t)(y)))বা ম্যাক্রো হিসাবে সংজ্ঞায়িত ম্যাক্রো ব্যবহার #define UMUL1616to16(x,y)((uint16_t)((uint32_t)(x)*(uint16_t)(y)))করে int) তবে তা রয়েছে কিনা তা নয় এই জাতীয় জিনিসগুলি কীভাবে নিজের নিজের ম্যাক্রোগুলকে সংজ্ঞায়িত করার পরিবর্তে কার্যকরভাবে পরিচালনা করতে হবে তার জন্য যে কোনও উদীয়মান মান।
সুপারকেট

আমার আরও উল্লেখ করা উচিত ছিল যে হ্যাশিং এবং চেকসাম গণনার মতো জিনিসের জন্য, উদ্দেশ্যটি হ'ল প্রায়শই একটি ফলাফল নেওয়া এবং এটি অপারেশনগুলির আকারে ছাঁটাই করা। মত প্রকাশের সাধারণ উদ্দেশ্যটি (ushort1*ushort2) & 65535uসমস্ত অপারেন্ড মানগুলির জন্য মড 65536 গাণিতিক সম্পাদন করা হবে। সি ৯৮৯ যুক্তিটি পড়ে, আমি মনে করি এটি স্পষ্টভাবে যে লেখকরা বুঝতে পেরেছিলেন যে ফলাফলটি যদি 2147483647 ছাড়িয়ে যায় তবে এই জাতীয় কোডটি কিছু বাস্তবায়নের ক্ষেত্রে ব্যর্থ হতে পারে, তারা প্রত্যাশা করেছিল যে এ জাতীয় বাস্তবায়ন ক্রমবর্ধমান বিরল হয়ে যাবে। তবে এই জাতীয় কোডটি কখনও কখনও আধুনিক জিসিসিতে ব্যর্থ হয়।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.