কিছু অন্যান্য ভাষার সাথে তুলনা করে সি এর একটি আকর্ষণীয় বৈশিষ্ট্যটি হ'ল এর অনেকগুলি ডেটা ধরণের নিখরচায় পদগুলিতে নির্দিষ্ট না করে লক্ষ্য স্থাপত্যের শব্দের উপর নির্ভর করে size যদিও এই ভাষাটি মেশিনগুলিতে কোড লিখতে ব্যবহার করতে পারে যা নির্দিষ্ট ধরণের ক্ষেত্রে অসুবিধা হতে পারে, কোড ডিজাইন করা এটি খুব কঠিন করে তোলে যা বিভিন্ন আর্কিটেকচারে ধারাবাহিকভাবে চলবে। কোডটি বিবেচনা করুন:
uint16_t ffff16 = 0xFFFF;
int64_t who_knows = ffff16 * ffff16;
একটি স্থাপত্যে যেখানে int
16 বিট রয়েছে (এখনও অনেক ছোট মাইক্রোকন্ট্রোলারের ক্ষেত্রে সত্য) এই কোডটি সুসংজ্ঞায়িত আচরণ ব্যবহার করে 1 এর মান নির্ধারণ করবে। int
Machines৪ বিট রয়েছে এমন মেশিনগুলিতে , এটি আবার ভাল-সংজ্ঞায়িত আচরণ ব্যবহার করে 4294836225 এর একটি মান নির্ধারণ করবে। মেশিনগুলিতে যেখানে int
32 বিট রয়েছে, সম্ভবত এটি -131071 এর মান নির্ধারণ করবে (জানি না এটি বাস্তবায়ন-সংজ্ঞায়িত বা অপরিবর্তিত আচরণ হবে কিনা)। যদিও কোডটি "ফিক্সড-সাইজ" প্রকার হিসাবে বিবেচিত তা ব্যতীত অন্য কিছু ব্যবহার করে না, মানকটির প্রয়োজন হবে যে দুটি ভিন্ন ধরণের সংকলক আজ ব্যবহৃত হয় তার দুটি পৃথক ফলাফল পাওয়া যায় এবং অনেক জনপ্রিয় সংকলক আজ তৃতীয়াংশ ফলন করতে পারে।
এই নির্দিষ্ট উদাহরণটি কিছুটা স্বতঃস্ফূর্ত, এটিতে আমি বাস্তব-বিশ্বের কোডে আশা করব না যে দুটি 16-বিট মানের উত্পাদনটি একটি 64-বিট মানকে সরাসরি অর্পণ করবে, তবে এটি তিনটি উপায় পূর্ণসংখ্যার দেখানোর জন্য একটি সংক্ষিপ্ত উদাহরণ হিসাবে বেছে নেওয়া হয়েছিল প্রচারগুলি অনুমিত-স্থির আকারের স্বাক্ষরবিহীন প্রকারের সাথে ইন্টারঅ্যাক্ট করতে পারে। কিছু বাস্তব-জগতের পরিস্থিতি রয়েছে যেখানে স্বাক্ষরিত ধরণের গাণিতিকগুলি গাণিতিক পূর্ণসংখ্যার গাণিতিকের নিয়ম অনুযায়ী সম্পাদন করা আবশ্যক, অন্যরা যেখানে এটি প্রয়োজনীয় যে এটি মডুলার গাণিতিকের নিয়ম অনুসারে সম্পাদন করা প্রয়োজন, এবং কিছু যেখানে এটি সত্যই না ' টি ব্যাপার। চেকসামের মতো জিনিসের জন্য প্রচুর রিয়েল-ওয়ার্ল্ড কোড uint32_t
গাণিতিক মোড়কে মোড 2³² এর উপর নির্ভর করে এবং স্বেচ্ছাসেবী সম্পাদন করতে সক্ষম হয়েuint16_t
পাটিগণিত এবং ফলাফলগুলি প্রাপ্ত হন যা সর্বনিম্ন হয়, যথাযথ Mod 65536 হিসাবে সংজ্ঞায়িত হয় (অপরিজ্ঞাত আচরণের বিপরীতে)।
যদিও এই পরিস্থিতিটি স্পষ্টতই অবাঞ্ছিত মনে হবে (এবং আরও বেশি হয়ে উঠবে কারণ 64- বিট প্রসেসিং অনেকগুলি উদ্দেশ্যে আদর্শ হয়ে ওঠে), আমি যা দেখেছি সেখান থেকে সি স্ট্যান্ডার্ড কমিটি ভাষা বৈশিষ্ট্যগুলি প্রবর্তন করতে পছন্দ করে যা ইতিমধ্যে কিছু উল্লেখযোগ্য উত্পাদনে ব্যবহৃত হয় পরিবেশগুলি, "স্ক্র্যাচ থেকে" আবিষ্কার করার পরিবর্তে। সি ভাষার কোনও উল্লেখযোগ্য এক্সটেনশান রয়েছে যা কোডকে কীভাবে কোনও ধরণের কীভাবে সংরক্ষণ করা হবে তা সুনির্দিষ্ট করার অনুমতি দেয় তবে সম্ভাব্য প্রচারগুলি সম্পর্কিত পরিস্থিতিতে কীভাবে এটি আচরণ করা উচিত? কমপ্লেয়ার এক্সটেনশানটি এ জাতীয় সমস্যার সমাধান করতে পারে এমন কমপক্ষে তিনটি উপায় আমি দেখতে পাচ্ছি:
একটি নির্দেশিকা যুক্ত করে যা সংকলককে নির্দিষ্ট "মৌলিক" পূর্ণসংখ্যার ধরণের নির্দিষ্ট আকারকে বাধ্য করতে নির্দেশ দেয়।
টার্গেট আর্কিটেকচারের ধরণের প্রকৃত আকার নির্বিশেষে মেশিনের ধরণের নির্দিষ্ট আকার রয়েছে যদিও মেশিনের ধরণের বিভিন্ন আকারের মূল্যায়ন করার জন্য কম্পাইলারকে নির্দেশ দেয় এমন একটি নির্দেশ যুক্ত করে।
যোগ করার সময় একটি; (নির্দিষ্ট বৈশিষ্ট্য সঙ্গে ধরনের ঘোষণা উদাঃ ঘোষণা করছি যে একটি টাইপ, একটি mod-65536 মোড়ানো বীজগাণিতিক রিং যেমন আচরণ করা উচিত অন্তর্নিহিত শব্দ আকার নির্বিশেষে, এবং পরোক্ষভাবে অন্যান্য ধরনের পরিবর্তনীয় করা উচিত হবে না মানে অনুমতি দিয়ে
wrap32
একটি থেকেint
একটি উত্পাদ উচিত 16 বিটের চেয়ে বড়wrap32
কিনা নির্বিশেষে প্রকারের ফলাফলটি সরাসরিint
যুক্ত করা অবৈধ হওয়া উচিত (যেহেতু উভয়ই অন্যটিতে রূপান্তর করতে পারে না)।wrap32
wrap16
আমার নিজস্ব পছন্দটি তৃতীয় বিকল্প হবে, যেহেতু এটি এমনকি অস্বাভাবিক শব্দের মাপযুক্ত মেশিনগুলিকে প্রচুর কোডের সাথে কাজ করার অনুমতি দেয় যা ভেরিয়েবলগুলি "মোড়কে" প্রত্যাশা করে যে তারা দু'টি আকারের পাওয়ার মতো হবে; সংকলকটি টাইপটি যথাযথভাবে আচরণের জন্য বিট-মাস্কিং নির্দেশাবলী যুক্ত করতে পারে, তবে কোডটি যদি 65536 মোড মোড়কে এমন কোনও প্রকারের প্রয়োজন হয় তবে সংকলকটির সাথে সোর্স কোডটি বিশৃঙ্খলা না করার চেয়ে মেশিনগুলিতে এমন মাস্কিং তৈরি করা ভাল better বা কেবল এমন মেশিনগুলিতে অপ্রয়োজনীয় দ্বারা এই জাতীয় কোড রয়েছে যেখানে এই জাতীয় মাস্কিংয়ের প্রয়োজন হবে। আমি কৌতূহলী, যদিও, এমন কোনও সাধারণ এক্সটেনশন রয়েছে যা উপরের যে কোনও মাধ্যমে বহনযোগ্য আচরণ অর্জন করতে পারে বা কোনও উপায়ে আমি ভাবিনি thought
আমি যা খুজছি তা স্পষ্ট করার জন্য কয়েকটি জিনিস রয়েছে; এর মধ্যে উল্লেখযোগ্য হল:
যদিও এমন অনেকগুলি উপায় রয়েছে যার মাধ্যমে কোড লিখিত হতে পারে যাতে কাঙ্ক্ষিত শব্দার্থবিজ্ঞান নিশ্চিত করা যায় (যেমন, নির্দিষ্ট আকারের স্বাক্ষরবিহীন অপারেশনগুলিতে গণিত করতে ম্যাক্রো সংজ্ঞায়িত করা যাতে ফলস্বরূপ হয় যা মোড়ানো বা না হয়) বা কমপক্ষে অনাকাঙ্ক্ষিত প্রতিরোধ শব্দার্থবিজ্ঞান (উদাহরণস্বরূপ শর্তসাপেক্ষে সংকলকগুলিতে এমন কোনও প্রকারের সংজ্ঞা
wrap32_t
দেওয়া হবেuint32_t
যেখানে কোনওuint32_t
পদোন্নতি হবে না, এবং চিত্রটি নির্ধারণ করুন যে কোডগুলিরwrap32_t
জন্য এটি মেশিনগুলিতে সংকলন ব্যর্থ করতে হবে যেখানে এই ধরণের প্রচার এবং বোগাস আচরণের চেয়ে এই ধরণের প্রচার করা হবে), যদি কোডটি লেখার কোনও উপায় থাকে যা ভবিষ্যতের ভাষা সম্প্রসারণের সাথে সবচেয়ে অনুকূলভাবে খেলতে পারে তবে এটি ব্যবহার করে আমার নিজস্ব পদ্ধতির ধারণা তৈরির চেয়ে ভাল beভাষাটি কীভাবে বাড়ানো যেতে পারে তার জন্য বেশ কয়েকটি দৃ -় ধারণা রয়েছে যাতে অনেকগুলি পূর্ণসংখ্যার আকারের সমস্যাগুলি সমাধান করা যায়, কোডটি বিভিন্ন শব্দের মাপের সাথে মেশিনগুলিতে অভিন্ন শব্দার্থ উত্পাদন করতে সক্ষম হয়, তবে সেগুলি লেখার জন্য আমি কোনও উল্লেখযোগ্য সময় ব্যয় করার আগে আমার পছন্দ হয় ইতিমধ্যে সেই দিকে কী প্রচেষ্টা নেওয়া হয়েছে তা জানতে।
আমি কোনওভাবেই সি স্ট্যান্ডার্ড কমিটি বা তারা যে কাজটি করেছে তা অস্বীকার করে দেখা হবে না; তবে আমি প্রত্যাশা করি যে কয়েক বছরের মধ্যে মেশিনগুলিতে কোডের সঠিকভাবে কাজ করা প্রয়োজনীয় হয়ে উঠবে যেখানে "প্রাকৃতিক" প্রচারের ধরণটি 32 বিট, সেইসাথে যেখানে এটি 64 বিট হবে those আমি মনে করি ভাষার কিছু পরিমিত বর্ধনের সাথে (C99 এনএনডি সি 14 এর মধ্যে অন্যান্য পরিবর্তনের তুলনায় অনেক বিনয়ী) কেবলমাত্র 64-বিট আর্কিটেকচারকে দক্ষতার সাথে ব্যবহারের একটি পরিষ্কার উপায় সরবরাহ করা সম্ভব হবে না, তবে দর কষাকষির সাথে ইন্টারঅ্যাকশনও সহজতর করা সম্ভব হবে "অস্বাভাবিক-শব্দ-আকার" মেশিনগুলি যে মানকটি historতিহাসিকভাবে সমর্থন করার জন্য পশ্চাদমুখে বাঁকিয়েছে [উদাহরণস্বরূপ, 12-বিটযুক্ত একটি মেশিনকে char
কোড চালানো সম্ভব করে যা একটি প্রত্যাশা করেuint32_t
to মোড়ানো মোড 2³²]। ভবিষ্যতের এক্সটেনশানগুলির যে দিকনির্দেশনা রয়েছে তার উপর নির্ভর করে, আমি এটিও আশা করব যে ম্যাক্রোগুলি সংজ্ঞায়িত করা সম্ভব হবে যা আজ লিখিত কোডকে আজকের সংকলকগুলিতে ব্যবহারযোগ্য হতে দেয় যেখানে ডিফল্ট পূর্ণসংখ্যার ধরণগুলি "প্রত্যাশিত" হিসাবে আচরণ করে তবে ভবিষ্যতের সংকলকগুলিতে যেখানে ব্যবহারযোগ্য সেখানে পূর্ণ ব্যবহারযোগ্য প্রকারভেদে ডিফল্টরূপে অন্যরকম আচরণ করা হবে তবে প্রয়োজনীয় আচরণগুলি কোথায় সরবরাহ করতে পারে।
int
চেয়ে বড় হয়uint16_t
, তবে গুণনের অপারেশনগুলিকে উন্নীত করা হবে এবং গুণকে গুণকint
হিসাবে চালিত করা হবেint
এবং ফলস্বরূপint
মানটিint64_t
আরম্ভের জন্য রূপান্তরিত হবেwho_knows
।