সি # এবং জাভা বাস্তবায়নে, বস্তুগুলির সাধারণত সাধারণত তার ক্লাসে একক পয়েন্টার থাকে। এটি সম্ভব কারণ তারা একক-উত্তরাধিকারের ভাষা। শ্রেণি কাঠামোটি তখন একক-উত্তরাধিকার শ্রেণিবিন্যাসের জন্য vtable ধারণ করে। তবে কলিং ইন্টারফেস পদ্ধতিতে একাধিক উত্তরাধিকারের সমস্ত সমস্যা রয়েছে। শ্রেণিক কাঠামোর মধ্যে সমস্ত বাস্তবায়িত ইন্টারফেসের জন্য অতিরিক্ত ভিটিবেল রেখে এটি সমাধান করা হয়। এটি সি ++ তে সাধারণত ভার্চুয়াল উত্তরাধিকার বাস্তবায়নের তুলনায় স্থান সাশ্রয় করে তবে ইন্টারফেস পদ্ধতি প্রেরণাকে আরও জটিল করে তোলে - যা ক্যাশে আংশিক ক্ষতিপূরণ দেওয়া যেতে পারে।
যেমন OpenJDK জেভিএম, প্রত্যেক বর্গ সব বাস্তবায়িত ইন্টারফেসের জন্য vtables একটি অ্যারের রয়েছে (একটি ইন্টারফেস vtable একটি বলা হয় itable )। যখন একটি ইন্টারফেস পদ্ধতি বলা হয়, তখন এই ইন্টারফেসটির অক্ষমতার জন্য এই অ্যারেটি রৈখিকভাবে অনুসন্ধান করা হয়, তারপরে সেই পদ্ধতিটি সেই সক্ষমের মাধ্যমে প্রেরণ করা যায়। ক্যাশিং ব্যবহার করা হয় যাতে প্রতিটি কল সাইট পদ্ধতি প্রেরণের ফলাফল মনে রাখে, সুতরাং যখন কংক্রিটের অবজেক্টের ধরণের পরিবর্তন হয় তখন এই অনুসন্ধানটি পুনরাবৃত্তি করতে হয়। পদ্ধতি প্রেরণের জন্য সিউডোকোড:
// Dispatch SomeInterface.method
Method const* resolve_method(
Object const* instance, Klass const* interface, uint itable_slot) {
Klass const* klass = instance->klass;
for (Itable const* itable : klass->itables()) {
if (itable->klass() == interface)
return itable[itable_slot];
}
throw ...; // class does not implement required interface
}
(ওপেনজেডকে হটস্পট ইন্টারপ্রেটার বা x86 সংকলকটিতে আসল কোডটি তুলনা করুন ))
সি # (বা আরও স্পষ্টভাবে, সিএলআর) একটি সম্পর্কিত পদ্ধতির ব্যবহার করে। যাইহোক, এখানে এটিটিবেলগুলি পদ্ধতিগুলির জন্য পয়েন্টারগুলি ধারণ করে না, তবে স্লট মানচিত্রগুলি: তারা শ্রেণীর মূল ভিটিবেলে এন্ট্রিগুলিকে নির্দেশ করে। জাভা হিসাবে, সঠিক কার্যকরযোগ্য অনুসন্ধান করা শুধুমাত্র সবচেয়ে খারাপ পরিস্থিতি, এবং এটি কল সাইটে ক্যাশে প্রায় সর্বদা এই অনুসন্ধান এড়াতে পারে বলে আশা করা হচ্ছে। সিএলআর বিভিন্ন ক্যাশে কৌশল নিয়ে জেআইটি-সংকলিত মেশিন কোডটি প্যাচ করার জন্য ভার্চুয়াল স্টাব ডিসপ্যাচ নামে একটি কৌশল ব্যবহার করে। pseudocode:
Method const* resolve_method(
Object const* instance, Klass const* interface, uint interface_slot) {
Klass const* klass = instance->klass;
// Walk all base classes to find slot map
for (Klass const* base = klass; base != nullptr; base = base->base()) {
// I think the CLR actually uses hash tables instead of a linear search
for (SlotMap const* slot_map : base->slot_maps()) {
if (slot_map->klass() == interface) {
uint vtable_slot = slot_map[interface_slot];
return klass->vtable[vtable_slot];
}
}
}
throw ...; // class does not implement required interface
}
ওপেনজেডিকে-সিউডোকোডের মূল পার্থক্যটি হ'ল ওপেনজেডিকে প্রতিটি শ্রেণীর প্রত্যক্ষ বা অপ্রত্যক্ষভাবে প্রয়োগ করা ইন্টারফেসগুলির একটি অ্যারে থাকে, যেখানে সিএলআর কেবল সেই শ্রেণিতে সরাসরি প্রয়োগ করা ইন্টারফেসের জন্য স্লট মানচিত্রের একটি অ্যারে রাখে। অতএব স্লট মানচিত্র না পাওয়া পর্যন্ত আমাদের উত্তরাধিকারের স্তরক্রমটি উপরের দিকে চলতে হবে। গভীর উত্তরাধিকারের স্তরক্রমের জন্য এটি স্থান সাশ্রয়ের ফলাফল। জেনেরিকগুলি কীভাবে বাস্তবায়িত হয় সে কারণে এগুলি সিএলআর-তে বিশেষভাবে প্রাসঙ্গিক: জেনেরিক বিশেষায়নের জন্য, শ্রেণি কাঠামোটি অনুলিপি করা হয় এবং মূল ভেটেবলের পদ্ধতিগুলি বিশেষায়িতকরণ দ্বারা প্রতিস্থাপন করা যেতে পারে। স্লট মানচিত্রগুলি সঠিক vtable এন্ট্রিগুলিতে নির্দেশ করে চলেছে এবং তাই শ্রেণীর সমস্ত জেনেরিক বিশেষায়নের মধ্যে ভাগ করা যায়।
শেষের নোট হিসাবে, ইন্টারফেস প্রেরণ প্রয়োগের আরও সম্ভাবনা রয়েছে। অবজেক্টে বা শ্রেণিবদ্ধ কাঠামোতে vtable / ইটেবল পয়েন্টার স্থাপনের পরিবর্তে আমরা অবজেক্টটিতে ফ্যাট পয়েন্টার ব্যবহার করতে পারি , এটি মূলত একটি (Object*, VTable*)
জোড়া। অপূর্ণতা হ'ল এটি পয়েন্টারগুলির আকার দ্বিগুণ করে এবং আপকাস্টগুলি (একটি কংক্রিট টাইপ থেকে ইন্টারফেসের ধরণে) নিখরচায় নয়। তবে এটি আরও নমনীয়, কম দিকনির্দেশনা রয়েছে এবং এর অর্থ হ'ল ইন্টারফেসগুলি কোনও শ্রেণি থেকে বাহ্যিকভাবে প্রয়োগ করা যেতে পারে। সম্পর্কিত ইন্টারফেসগুলি গো ইন্টারফেস, মরিচা বৈশিষ্ট্য এবং হাস্কেল টাইপক্লাসগুলি ব্যবহার করে।
তথ্যসূত্র এবং আরও পড়া:
- উইকিপিডিয়া: ইনলাইন ক্যাচিং । ক্যাচিং পদ্ধতির বিষয়ে আলোচনা করে যা ব্যয়বহুল পদ্ধতির অনুসন্ধান এড়ানোর জন্য ব্যবহার করা যেতে পারে। সাধারণত vtable- ভিত্তিক প্রেরণের জন্য প্রয়োজন হয় না, তবে উপরের ইন্টারফেস প্রেরণের কৌশলগুলির মতো আরও ব্যয়বহুল প্রেরণ প্রক্রিয়ার জন্য খুব আকাঙ্ক্ষিত।
- ওপেনজেডকে উইকি (২০১৩): ইন্টারফেস কল । এটি সম্পর্কে আলোচনা করে।
- পোবার, নিউয়ার্ড (২০০৯): এসএসসিএলআই ২.০ অভ্যন্তরীণ। বইয়ের ৫ ম অধ্যায়ে স্লট মানচিত্রের বিষয়ে বিস্তারিত আলোচনা করা হয়েছে। কখনও প্রকাশিত হয়নি তবে তাদের ব্লগে লেখকগণ উপলব্ধ করেছেন । পিডিএফ লিংক থেকে সরানো হয়েছে। এই বইটি সম্ভবত আর সিএলআরের বর্তমান অবস্থা প্রতিফলিত করে না।
- কোরসিএলআর (2006): ভার্চুয়াল স্টাব প্রেরণ । ইন: বুক অফ দ্য রানটাইম ব্যয়বহুল চেহারাগুলি এড়াতে স্লট মানচিত্র এবং ক্যাশে নিয়ে আলোচনা করে।
- কেনেডি, সিম (2001): .NET প্রচলিত ভাষা রানটাইমটির জন্য জেনেরিক্সের নকশা এবং বাস্তবায়ন । ( পিডিএফ লিঙ্ক )। জেনেরিকগুলি প্রয়োগ করতে বিভিন্ন পন্থা আলোচনা করে। জেনেরিক্স পদ্ধতি প্রেরণের সাথে ইন্টারঅ্যাক্ট করে কারণ পদ্ধতিগুলি বিশেষায়িত হতে পারে তাই ভ্যাটবিলগুলি আবারও লিখতে হতে পারে।