OCaml এ কেবলমাত্র 31 টি বিট কেন?


115

এই "বৈশিষ্ট্য" অন্য কোথাও দেখেনি। আমি জানি যে 32 তম বিট আবর্জনা সংগ্রহের জন্য ব্যবহৃত হয়। তবে কেন এটি কেবল অন্তরগুলির জন্য নয় অন্যান্য মৌলিক ধরণের জন্য?


10
মনে রাখবেন যে -৪-বিট অপারেটিং সিস্টেমে, ওকামেলের একটি ইনট 63৩ বিট, 31 নয় is এটি ট্যাগ বিটের বেশিরভাগ ব্যবহারিক সমস্যা (যেমন অ্যারের আকার সীমা) সরিয়ে দেয়। এবং অবশ্যই যদি কিছু স্ট্যান্ডার্ড অ্যালগরিদমের জন্য সত্যিকারের 32-বিট পূর্ণসংখ্যার প্রয়োজন হয় তবে 32 টি ইন্টিরিও টাইপ রয়েছে।
পোরকুলাস

1
nekoVM ( nekovm.org ) এ সম্প্রতি পর্যন্ত 31 টি বিট ইনট ছিল।
দি হিপ্পো

উত্তর:


244

একে ট্যাগযুক্ত পয়েন্টার উপস্থাপনা বলা হয় এবং এটি বেশ কয়েক দশক ধরে বহু ভিন্ন অনুবাদক, ভিএম এবং রানটাইম সিস্টেমে ব্যবহৃত একটি সাধারণ সাধারণ অপ্টিমাইজেশন ট্রিক। খুব সুন্দরভাবে প্রতিটি লিস্প বাস্তবায়ন সেগুলি ব্যবহার করে, অনেক স্মার্টলাক ভিএম, অনেক রুবি ইন্টারপ্রেটার ইত্যাদি 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


5
এমন লোকেরা আছেন যারা বলে যে এই উত্তরটি অনর্থক । আমি জানি না যদি এই ঘটনাটি হয় বা তারা নিটপিক করছে। আমি কেবল ভেবেছিলাম এটিতে যদি কিছু সত্য থাকে তবে আমি এটিকে নির্দেশ করব।
surfmuggle

5
@threeFourOneSixOneThree এই উত্তরটি ওক্যামেলের জন্য পুরোপুরি সঠিক নয় কারণ ওসিএএমএলে এই উত্তরের "এটিকে সংশ্লেষিত করুন" অংশটি কখনই ঘটে না। ওসিএএমএল কোনও বস্তু-ভিত্তিক ভাষা নয় যেমন স্মলটাক বা জাভা। ওসিএএমএল এর পদ্ধতির টেবিলটি পুনরুদ্ধার করার কোনও কারণ নেই int
পাস্কেল কুয়াক

ক্রোমের ভি 8 ইঞ্জিনটি একটি ট্যাগ পয়েন্টারও ব্যবহার করে এবং 31-বিট পূর্ণসংখ্যা সংরক্ষণ করে যা একটি অপ্টিমাইজেশন হিসাবে
স্মি

@ ফুকলভ: অবশ্যই অবাক হওয়ার কিছু নেই। হটস্পট জেভিএমের মতোই ভি 8ও অ্যানিমর্ফিক স্মার্টটাক ভিএম এর উপর ভিত্তি করে তৈরি হয়েছে যা ঘুরেফিরে সেলফ ভিএম এর উপর ভিত্তি করে তৈরি হয়। এবং ভি 8 একই ব্যক্তির দ্বারা হটস্পট জেভিএম, অ্যানিমর্ফিক স্মলটাক ভিএম, এবং সেলফ ভিএম বিকাশ করেছিল (কিছু লোক) was লারস বাক, বিশেষত, এই সকলের জন্য কাজ করেছেন, তার নিজের স্মলটাল্ক ভিএম ওওভিএম নামে পরিচিত। সুতরাং, এটি মোটেও অবাক হওয়ার মতো নয় যে ভি 8 স্মার্টটাক বিশ্ব থেকে সুপরিচিত কৌশলগুলি ব্যবহার করে, যেহেতু এটি স্মলটালক প্রযুক্তির উপর ভিত্তি করে ছোট্ট টালিকরা তৈরি করেছিলেন।
Jörg ডব্লু মিটাগ

28

ভাল বর্ণনার জন্য https://ocaml.org/learn/tutorials/performance_and_profiling.html এর "ইন্টিজার, ট্যাগ বিটস, হিপ-বরাদ্দ মানগুলি" বিভাগটি দেখুন ।

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

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


1
"সংক্ষিপ্ত উত্তরটি হল এটি পারফরম্যান্সের জন্য"। বিশেষত কোকের পারফরম্যান্স। প্রায় সবকিছুর পারফরম্যান্স এই নকশার সিদ্ধান্তে ভুগছে।
জেডি

17

এটি হুবহু "আবর্জনা সংগ্রহের জন্য ব্যবহৃত হয় না"। এটি পয়েন্টার এবং একটি আনবক্স করা পূর্ণসংখ্যার মধ্যে অভ্যন্তরীণ পার্থক্য করার জন্য ব্যবহৃত হয়।


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

2
তথ্যটি জিসি ঠিক পয়েন্টার গ্রাফ নেভিগেট করার জন্য প্রয়োজন।
টুবু

"এটি পয়েন্টার এবং একটি আনবক্সযুক্ত পূর্ণসংখ্যার মধ্যে অভ্যন্তরীণ পার্থক্য করার জন্য ব্যবহৃত হয়"। জিসি বাদে অন্য কিছুর জন্য এটি ব্যবহার করে?
জেডি

13

আমাকে এই লিঙ্কটি যুক্ত করতে হবে l৪-বিট ওক্যামেলের জন্য আরও একটি more৩-বিট ভাসমান-পয়েন্ট টাইপ বুঝতে ওপিকে সহায়তা করতে

যদিও নিবন্ধটির শিরোনামটি সম্পর্কে মনে হচ্ছে float, এটি আসলে সম্পর্কে talkingextra 1 bit

ওসিএএমএল রানটাইম বিভিন্ন ধরণের অভিন্ন উপস্থাপনার মাধ্যমে বহুবিজ্ঞানের অনুমতি দেয়। প্রতিটি ওসিএএমএল মানকে একটি শব্দ হিসাবে উপস্থাপন করা হয়, যাতে অ্যাক্সেসের ফাংশনগুলি (উদাহরণস্বরূপ তালিকা। দৈর্ঘ্য) এবং এই তালিকা তৈরি করতে (উদাহরণস্বরূপ তালিকা.ম্যাপ) তৈরি করার জন্য, "জিনিসগুলির তালিকা" বলার জন্য একটি একক প্রয়োগ সম্ভব হয় is এটি কেবল একই কাজ করে যদিও সেগুলি ইনট, ফ্লোটের তালিকা বা পূর্ণসংখ্যার সেটগুলির তালিকা।

কোনও শব্দের সাথে খাপ খায় না এমন কোনও কিছুই গাদা একটি ব্লকে বরাদ্দ করা হয়। এই ডেটা উপস্থাপন শব্দটি ব্লকের একটি পয়েন্টার হয়। যেহেতু গাদাতে কেবলমাত্র শব্দের ব্লক রয়েছে, এই সমস্ত পয়েন্টারগুলি সারিবদ্ধ হয়: তাদের কয়েকটি স্বল্পতম তাত্পর্য বিট সর্বদা আনসেট থাকে না।

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

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

এই কারণেই আনবক্সযুক্ত পূর্ণসংখ্যাগুলি ওসিএএমএল প্রোগ্রামারকে 31 বিট (32-বিট ওক্যামেলের জন্য) বা 63 বিট (64-বিট ওক্যামেলের জন্য) সরবরাহ করে। উপস্থাপনার মধ্যে, পর্দার আড়ালে, একটি পূর্ণসংখ্যাযুক্ত শব্দের অন্তত উল্লেখযোগ্য বিটটি সর্বদা সেট থাকে, এটি একটি পয়েন্টার থেকে আলাদা করতে। 31- বা -৩-বিট পূর্ণ সংখ্যার বদলে অস্বাভাবিক, সুতরাং যে কেউ OCaml ব্যবহার করেন তা এগুলি জানেন। ওসিএএমএল এর ব্যবহারকারীরা সাধারণত জানেন না যে কেন 64৪-বিট ওক্যামেলের জন্য 63৩-বিট আনবক্সড ফ্লোট প্রকার নেই।


3

OCaml এ কেবলমাত্র 31 টি বিট কেন?

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

তবে কেন এটি কেবল অন্তরগুলির জন্য নয় অন্যান্য মৌলিক ধরণের জন্য?

শুধু int। অন্যান্য ধরণের যেমন charএবং এনামগুলি একই ট্যাগযুক্ত উপস্থাপনা ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.