এই "বৈশিষ্ট্য" অন্য কোথাও দেখেনি। আমি জানি যে 32 তম বিট আবর্জনা সংগ্রহের জন্য ব্যবহৃত হয়। তবে কেন এটি কেবল অন্তরগুলির জন্য নয় অন্যান্য মৌলিক ধরণের জন্য?
এই "বৈশিষ্ট্য" অন্য কোথাও দেখেনি। আমি জানি যে 32 তম বিট আবর্জনা সংগ্রহের জন্য ব্যবহৃত হয়। তবে কেন এটি কেবল অন্তরগুলির জন্য নয় অন্যান্য মৌলিক ধরণের জন্য?
উত্তর:
একে ট্যাগযুক্ত পয়েন্টার উপস্থাপনা বলা হয় এবং এটি বেশ কয়েক দশক ধরে বহু ভিন্ন অনুবাদক, ভিএম এবং রানটাইম সিস্টেমে ব্যবহৃত একটি সাধারণ সাধারণ অপ্টিমাইজেশন ট্রিক। খুব সুন্দরভাবে প্রতিটি লিস্প বাস্তবায়ন সেগুলি ব্যবহার করে, অনেক স্মার্টলাক ভিএম, অনেক রুবি ইন্টারপ্রেটার ইত্যাদি on
সাধারণত, এই ভাষাগুলিতে, আপনি সর্বদা অবজেক্টগুলিতে পয়েন্টারগুলির কাছাকাছি যান। কোনও বস্তু নিজেই একটি অবজেক্ট শিরোনাম নিয়ে গঠিত, যার মধ্যে অবজেক্ট মেটাডেটা থাকে (যেমন কোনও সামগ্রীর ধরণ, শ্রেণি (এসএস, সম্ভবত অ্যাক্সেস নিয়ন্ত্রণ বিধিনিষেধ বা সুরক্ষা টিকাশ ইত্যাদি) এবং তারপরে প্রকৃত অবজেক্ট ডেটা থাকে। সুতরাং, একটি সাধারণ পূর্ণসংখ্যাকে পয়েন্টার হিসাবে উপস্থাপন করা হবে এবং মেটাডেটা এবং আসল পূর্ণসংখ্যার সমন্বিত একটি অবজেক্ট। এমনকি খুব কমপ্যাক্ট উপস্থাপনা সহ, এটি একটি সাধারণ পূর্ণসংখ্যার জন্য 6 বাইটের মতো something
এছাড়াও, আপনি পূর্ণসংখ্যার পাটিগণিত সম্পাদনের জন্য সিপিইউতে এই জাতীয় পূর্ণসংখ্যার বস্তুটি পাস করতে পারবেন না। আপনি দুটি পূর্ণসংখ্যার যোগ করতে চান, তাহলে আপনি সত্যিই মাত্র দুই পয়েন্টার, যা দুই পূর্ণসংখ্যা বস্তুর হেডার শুরুতে বিন্দু কোন বস্তু যা যোগ করতে চান না। সুতরাং, আপনার পূর্বে প্রথম পয়েন্টারে পূর্ণসংখ্যার গাণিতিক সম্পাদন করতে হবে যেখানে অবজেক্টটিতে অফসেট যুক্ত করতে সেখানে পূর্ণসংখ্যার ডেটা সংরক্ষণ করা হয়। তারপরে আপনাকে সেই ঠিকানাটি অবলম্বন করতে হবে। দ্বিতীয় পূর্ণসংখ্যার সাথে আবার এটি করুন। এখন আপনার দুটি পূর্ণসংখ্যা রয়েছে আপনি আসলে সিপিইউ যুক্ত করতে চাইতে পারেন। অবশ্যই, ফলাফলটি ধরে রাখতে আপনার এখন একটি নতুন পূর্ণসংখ্যার অবজেক্ট তৈরি করা দরকার।
সুতরাং, একটি পূর্ণসংখ্যার সংযোজন সম্পাদন করার জন্য , আপনাকে আসলে তিনটি সংখ্যার সংযোজন এবং দুটি পয়েন্টার ডেরিফেন্সেস প্লাস একটি অবজেক্ট কনস্ট্রাকশন করতে হবে। এবং আপনি প্রায় 20 বাইট গ্রহণ করেন।
তবে, কৌশলটি হ'ল তথাকথিত অপরিবর্তনীয় মানের ধরণের ধরণের সংখ্যার সাথে সাধারণত আপনার অবজেক্ট শিরোনামে সমস্ত মেটাডেটা প্রয়োজন হয় না : আপনি কেবল সমস্ত জিনিস বাইরে রেখে দিতে পারেন এবং কেবল এটি সংশ্লেষণ করতে পারেন (যা ভিএম-নার্ড- "নকল এটি") এর জন্য কথা বলুন, যখন যে কেউ নজর দেওয়ার যত্ন করে। একটি পূর্ণসংখ্যার সর্বদা ক্লাস থাকবে Integer
, সেই তথ্য আলাদাভাবে সংরক্ষণ করার দরকার নেই। কেউ একটি পূর্ণসংখ্যা বর্গ জিনিসটা প্রতিফলন ব্যবহার করেন, তাহলে আপনি কেবল উত্তর Integer
এবং কেউ কখনো জানবে যে আপনি আসলে বস্তুর হেডারের মধ্যে যে তথ্য সংরক্ষণ না আসলে, যে নয় এমনকি একটি বস্তু হেডার (অথবা একটি অবজেক্ট)।
সুতরাং, কৌতুক মান সংরক্ষণ করতে হয় এর পয়েন্টার মধ্যে অবজেক্ট থেকে , বস্তুর কার্যকরভাবে এক দুই ধ্বসে।
এমন সিপিইউ রয়েছে যা প্রকৃতপক্ষে একটি পয়েন্টারের (অতিরিক্ত তথাকথিত ট্যাগ বিট ) এর মধ্যে অতিরিক্ত স্থান রয়েছে যা আপনাকে পয়েন্টারের মধ্যেই পয়েন্টার সম্পর্কে অতিরিক্ত তথ্য সঞ্চয় করতে দেয়। "এটি আসলে কোনও পয়েন্টার নয়, এটি একটি পূর্ণসংখ্যা" এর মতো অতিরিক্ত তথ্য। উদাহরণগুলিতে বুড়ো বি 5000, বিভিন্ন লিস্প মেশিন বা এএস / 400 অন্তর্ভুক্ত রয়েছে। দুর্ভাগ্যক্রমে, বর্তমান বেশিরভাগ মূলধারার সিপিইউতে এই বৈশিষ্ট্যটি নেই।
তবে, এর বাইরে যাওয়ার উপায় রয়েছে: বেশিরভাগ বর্তমান মূলধারার সিপিইউগুলি যখন শব্দ সীমানায় স্থায়ী না হয় তখন উল্লেখযোগ্যভাবে ধীর গতিতে কাজ করে। কিছু কিছু এমনকি স্বাক্ষরবিহীন অ্যাক্সেস সমর্থন করে না।
এর অর্থ হ'ল বাস্তবে , সমস্ত পয়েন্টারগুলি 4 দ্বারা বিভাজ্য হবে, যার অর্থ তারা সর্বদা দুটি 0
বিট দিয়ে শেষ হবে । এটি আমাদেরকে বাস্তব পয়েন্টারগুলির মধ্যে পার্থক্য করতে দেয় (যেটি শেষ হয় 00
) এবং পয়েন্টারগুলি যা প্রকৃতপক্ষে ছদ্মবেশে পূর্ণসংখ্যা হয় (যা শেষ হয় 1
)। এবং এটি এখনও আমাদের সমস্ত পয়েন্টার রেখে দেয় যা 10
অন্য জিনিসগুলি করতে ফ্রি হয়। এছাড়াও, বেশিরভাগ আধুনিক অপারেটিং সিস্টেমগুলি তাদের জন্য খুব কম ঠিকানা সংরক্ষণ করে, যা আমাদের চারপাশে জঞ্জাল দেওয়ার জন্য আরও একটি ক্ষেত্র দেয় (পয়েন্টারগুলি যেগুলি দিয়ে বলা হয়, 24, 0
এবং শেষ হয় 00
)।
সুতরাং, আপনি 31-বিট পূর্ণসংখ্যাকে পয়েন্টারটিতে এনকোড করতে পারেন, কেবল এটি 1 টি বামে স্থানান্তরিত করে এবং এতে যুক্ত 1
করে। এবং আপনি তাদের সাথে খুব দ্রুত পূর্ণসংখ্যার গাণিতিক সম্পাদন করতে পারেন , কেবল তাদের যথাযথভাবে স্থানান্তরিত করে (কখনও কখনও এটি প্রয়োজনীয়ও হয় না)।
এই ঠিকানাগুলির অন্যান্য স্থানগুলির সাথে আমরা কী করব? ওয়েল, টিপিক্যাল উদাহরণ এনকোডিং অন্তর্ভুক্ত float
অন্যান্য বৃহৎ অ্যাড্রেস স্পেস মত বিশেষ বস্তু একটি সংখ্যা গুলি true
, false
, nil
, 127 ASCII অক্ষর, কিছু সাধারণভাবে ব্যবহৃত শর্ট স্ট্রিং, খালি তালিকা, খালি বস্তু, খালি অ্যারে এবং তাই কাছাকাছি 0
ঠিকানা।
উদাহরণস্বরূপ, এমআরআই, ইএআরভি এবং রুবিনিয়াস রুবি ইন্টারপ্রিটারগুলিতে, পূর্ণসংখ্যাগুলি আমি উপরে বর্ণিত পদ্ধতিতে false
এনকোড করা হয়েছে, ঠিকানা হিসাবে এনকোড করা হয়েছে 0
(যা ঠিক তেমন ঘটে সি-তে উপস্থাপনা হিসাবেও ঘটে false
), true
ঠিকানা হিসাবে 2
(যা ঠিক তাই ঘটে) সি উপস্থাপনা true
এক বিট দ্বারা স্থানান্তরিত) এবং nil
হিসাবে 4
।
int
।
ভাল বর্ণনার জন্য https://ocaml.org/learn/tutorials/performance_and_profiling.html এর "ইন্টিজার, ট্যাগ বিটস, হিপ-বরাদ্দ মানগুলি" বিভাগটি দেখুন ।
সংক্ষিপ্ত উত্তরটি হল এটি পারফরম্যান্সের জন্য। কোনও ফাংশনে আর্গুমেন্ট পাস করার সময় এটি হয় পূর্ণসংখ্যা বা পয়েন্টার হিসাবে পাস হয়। একটি মেশিন স্তরের ভাষার স্তরে কোনও রেজিস্টারে একটি পূর্ণসংখ্যা বা পয়েন্টার রয়েছে কিনা তা বলার উপায় নেই, এটি কেবলমাত্র 32 বা 64 বিটের মান। সুতরাং ওসিএএমএল রান সময়টি যা পেয়েছিল তা পূর্ণসংখ্যা বা পয়েন্টার কিনা তা নির্ধারণ করতে ট্যাগ বিট পরীক্ষা করে। যদি ট্যাগ বিট সেট করা থাকে, তবে মানটি একটি পূর্ণসংখ্যা হয় এবং এটি সঠিক ওভারলোডকে দেওয়া হয়। অন্যথায় এটি একটি পয়েন্টার এবং প্রকারটি সন্ধান করা হয়।
কেন কেবল পূর্ণসংখ্যার এই ট্যাগ থাকে? কারণ বাকি সমস্ত কিছুই পয়েন্টার হিসাবে পাস করা হয়েছে। যা পাস হয় তা হয় কোনও পূর্ণসংখ্যা বা অন্য কোনও ডেটা টাইপের পয়েন্টার। শুধুমাত্র একটি ট্যাগ বিট দিয়ে, কেবল দুটি মামলা হতে পারে।
এটি হুবহু "আবর্জনা সংগ্রহের জন্য ব্যবহৃত হয় না"। এটি পয়েন্টার এবং একটি আনবক্স করা পূর্ণসংখ্যার মধ্যে অভ্যন্তরীণ পার্থক্য করার জন্য ব্যবহৃত হয়।
আমাকে এই লিঙ্কটি যুক্ত করতে হবে l৪-বিট ওক্যামেলের জন্য আরও একটি more৩-বিট ভাসমান-পয়েন্ট টাইপ বুঝতে ওপিকে সহায়তা করতে
যদিও নিবন্ধটির শিরোনামটি সম্পর্কে মনে হচ্ছে float
, এটি আসলে সম্পর্কে talkingextra 1 bit
ওসিএএমএল রানটাইম বিভিন্ন ধরণের অভিন্ন উপস্থাপনার মাধ্যমে বহুবিজ্ঞানের অনুমতি দেয়। প্রতিটি ওসিএএমএল মানকে একটি শব্দ হিসাবে উপস্থাপন করা হয়, যাতে অ্যাক্সেসের ফাংশনগুলি (উদাহরণস্বরূপ তালিকা। দৈর্ঘ্য) এবং এই তালিকা তৈরি করতে (উদাহরণস্বরূপ তালিকা.ম্যাপ) তৈরি করার জন্য, "জিনিসগুলির তালিকা" বলার জন্য একটি একক প্রয়োগ সম্ভব হয় is এটি কেবল একই কাজ করে যদিও সেগুলি ইনট, ফ্লোটের তালিকা বা পূর্ণসংখ্যার সেটগুলির তালিকা।
কোনও শব্দের সাথে খাপ খায় না এমন কোনও কিছুই গাদা একটি ব্লকে বরাদ্দ করা হয়। এই ডেটা উপস্থাপন শব্দটি ব্লকের একটি পয়েন্টার হয়। যেহেতু গাদাতে কেবলমাত্র শব্দের ব্লক রয়েছে, এই সমস্ত পয়েন্টারগুলি সারিবদ্ধ হয়: তাদের কয়েকটি স্বল্পতম তাত্পর্য বিট সর্বদা আনসেট থাকে না।
অরগমেন্টহীন নির্মাতারা (এটির মতো: ফল = অ্যাপল | কমলা | কলা) টাইপ করুন এবং পূর্ণসংখ্যাগুলি এত বেশি তথ্য উপস্থাপন করে না যে তাদের গাদাতে বরাদ্দ করা দরকার। তাদের প্রতিনিধিত্ব আনবক্সড হয়। ডেটা সরাসরি শব্দের ভিতরে থাকে যা অন্যথায় পয়েন্টার হত। সুতরাং তালিকাগুলির একটি তালিকা আসলে পয়েন্টারগুলির একটি তালিকা, ইনটসের একটি তালিকাতে অন্তত একটি কম সংকেতযুক্ত অন্তর্নিহিত অন্তর্ভুক্ত রয়েছে। অ্যাক্সেস এবং তালিকা তৈরির ফাংশনগুলি লক্ষ্য করে না কারণ ইনট এবং পয়েন্টারগুলির একই আকার রয়েছে।
তবুও, আবর্জনা সংগ্রাহকের পূর্ণসংখ্যার থেকে পয়েন্টার সনাক্ত করতে সক্ষম হওয়া দরকার। একটি পয়েন্টারটি স্তূপের মধ্যে একটি সুসংহত ব্লকের দিকে ইঙ্গিত করে যা সংজ্ঞায়িতভাবে জীবন্ত (যেহেতু এটি জিসি দ্বারা পরিদর্শন করা হয়েছে) এবং এটি চিহ্নিত করা উচিত। একটি পূর্ণসংখ্যার কোনও মান থাকতে পারে এবং যদি সতর্কতা অবলম্বন না করা হয় তবে দুর্ঘটনাক্রমে পয়েন্টারের মতো দেখতে হবে। এটি মৃত ব্লকগুলিকে জীবন্ত দেখাতে পারে, তবে আরও খারাপ এটি জিসিকে একটি লাইভ ব্লকের শিরোনাম বলে মনে করে তাতে বিট পরিবর্তন করতে পারে, যখন এটি বাস্তবে কোনও পয়েন্টারের মতো দেখায় এবং ব্যবহারকারীকে বিশৃঙ্খল করে তোলে ডেটা।
এই কারণেই আনবক্সযুক্ত পূর্ণসংখ্যাগুলি ওসিএএমএল প্রোগ্রামারকে 31 বিট (32-বিট ওক্যামেলের জন্য) বা 63 বিট (64-বিট ওক্যামেলের জন্য) সরবরাহ করে। উপস্থাপনার মধ্যে, পর্দার আড়ালে, একটি পূর্ণসংখ্যাযুক্ত শব্দের অন্তত উল্লেখযোগ্য বিটটি সর্বদা সেট থাকে, এটি একটি পয়েন্টার থেকে আলাদা করতে। 31- বা -৩-বিট পূর্ণ সংখ্যার বদলে অস্বাভাবিক, সুতরাং যে কেউ OCaml ব্যবহার করেন তা এগুলি জানেন। ওসিএএমএল এর ব্যবহারকারীরা সাধারণত জানেন না যে কেন 64৪-বিট ওক্যামেলের জন্য 63৩-বিট আনবক্সড ফ্লোট প্রকার নেই।
OCaml এ কেবলমাত্র 31 টি বিট কেন?
মূলত, কোক উপপাদ্য প্রবাদে সেরা সম্ভাব্য পারফরম্যান্স পাওয়ার জন্য যেখানে প্রভাবশালী অপারেশন হ'ল প্যাটার্ন মেলানো এবং প্রভাবশালী ডেটা টাইপগুলি বৈকল্পিক ধরণের। আনবক্সযুক্ত ডেটা থেকে পয়েন্টার আলাদা করতে ট্যাগ ব্যবহার করে সেরা ডেটা উপস্থাপনাটি অভিন্ন উপস্থাপনা বলে দেখা গেছে।
তবে কেন এটি কেবল অন্তরগুলির জন্য নয় অন্যান্য মৌলিক ধরণের জন্য?
শুধু int
। অন্যান্য ধরণের যেমন char
এবং এনামগুলি একই ট্যাগযুক্ত উপস্থাপনা ব্যবহার করে।