কম্পিউটার

রুবি ইন্টারনাল:রুবি অবজেক্টের মেমরি লেআউট অন্বেষণ করা

আপনি কি রুবি ইন্টারনালের একটি দ্রুত সফর করতে চান?

তারপর আপনি একটি ট্রিট জন্য আছে.

কারণ

আমরা একসাথে অন্বেষণ করতে যাচ্ছি কিভাবে একটি রুবি অবজেক্ট মেমরিতে রাখা হয় এবং কীভাবে আপনি কিছু দুর্দান্ত জিনিস করতে অভ্যন্তরীণ ডেটা স্ট্রাকচার ম্যানিপুলেট করতে পারেন।

আপনার সিটবেল্ট বেঁধে নিন এবং রুবি ইন্টারপ্রেটারের গভীরতায় ভ্রমণের জন্য প্রস্তুত হন!

অ্যারেগুলির মেমরি লেআউট

আপনি যখন একটি অ্যারে তৈরি করেন, তখন রুবিকে কিছু সিস্টেম মেমরি এবং কিছুটা মেটাডেটা দিয়ে ব্যাক আপ করতে হয়৷

মেটাডেটা অন্তর্ভুক্ত :

  • অ্যারের আকার (আইটেম সংখ্যা)
  • অ্যারে ক্ষমতা
  • শ্রেণী
  • বস্তুর স্থিতি (হিমায়িত বা না)
  • মেমরিতে ডেটা কোথায় সংরক্ষণ করা হয় তার নির্দেশক

যেহেতু প্রধান রুবি ইন্টারপ্রেটার (MRI) C তে লেখা সেখানে কোনো বস্তু নেই।

কিন্তু অন্য কিছু আছে:structs .

C-তে একটি স্ট্রাকট আপনাকে একসাথে সম্পর্কিত ডেটা সঞ্চয় করতে সাহায্য করে, এবং এটি Array এর মতো জিনিসগুলিকে উপস্থাপন করতে এমআরআই-এর সোর্স কোডে প্রচুর ব্যবহার করা হয়। , String 's এবং অন্যান্য ধরণের বস্তু।

এই স্ট্রাকটগুলির একটি দেখে আমরা একটি বস্তুর মেমরি বিন্যাস অনুমান করতে পারি।

তাহলে চলুন Array-এর struct-এর দিকে তাকাই , যাকে বলা হয় RArray :

struct RArray {
  struct RBasic basic;

  union {
    struct {
      long len;

      union {
        long capa;
        VALUE shared;
      } aux;

      const VALUE *ptr;
    } heap;

    const VALUE ary[RARRAY_EMBED_LEN_MAX];
  } as;
};

আমি জানি আপনি যদি C এর সাথে পরিচিত না হন তবে এটি কিছুটা ভয় দেখানো হতে পারে, তবে চিন্তা করবেন না! আমি আপনাকে এটিকে সহজে হজম করা বিটগুলিতে বিভক্ত করতে সাহায্য করব 🙂

আমাদের কাছে প্রথম জিনিসটি হল এই RBasic জিনিস, যা একটি struct:

struct RBasic {
  VALUE flags;
  VALUE klass;
}

এটি এমন কিছু যা বেশিরভাগ রুবি অবজেক্টে থাকে এবং এতে কিছু জিনিস রয়েছে যেমন এই বস্তুর ক্লাস এবং কিছু বাইনারি ফ্ল্যাগ যা বলে যে এই বস্তুটি হিমায়িত হয়েছে কিনা (এবং 'কলঙ্কিত' বৈশিষ্ট্যের মতো অন্যান্য জিনিস)।

অন্য কথায় :

RBasic বস্তুর জন্য জেনেরিক মেটাডেটা রয়েছে।

এর পরে আমাদের আরেকটি স্ট্রাকট আছে, যেখানে অ্যারের দৈর্ঘ্য রয়েছে (len )।

ইউনিয়ন অভিব্যক্তি বলছে যে aux capa হতে পারে (ক্ষমতার জন্য) অথবা shared . এটি বেশিরভাগই একটি অপ্টিমাইজেশান জিনিস, যা প্যাট শগনেসির এই দুর্দান্ত পোস্টে আরও বিশদে ব্যাখ্যা করা হয়েছে। মেমরি বরাদ্দের ক্ষেত্রে, কম্পাইলার একটি ইউনিয়নের মধ্যে সবচেয়ে বড় ধরনের ব্যবহার করবে।

তারপর আমাদের ptr আছে , যা মেমরি ঠিকানা ধারণ করে যেখানে প্রকৃত Array তথ্য সংরক্ষণ করা হয়।

এটি দেখতে কেমন তা এখানে একটি ছবি (প্রতিটি সাদা/ধূসর বাক্স হল 32-বিট সিস্টেমে 4 বাইট ):

রুবি ইন্টারনাল:রুবি অবজেক্টের মেমরি লেআউট অন্বেষণ করা

আপনি অবজেক্টস্পেস মডিউল ব্যবহার করে একটি বস্তুর মেমরি আকার দেখতে পারেন:

require 'objspace'

ObjectSpace.memsize_of([])
# 20

এখন আমরা কিছু মজা করার জন্য প্রস্তুত!

ফিডল:একটি মজার পরীক্ষা

RBasic একটি 32-বিট সিস্টেমে ঠিক 8 বাইট এবং একটি 64-বিট সিস্টেমে 16 বাইট। এটি জেনে আমরা একটি বস্তুর জন্য কাঁচা মেমরি বাইট অ্যাক্সেস করতে এবং কিছু মজাদার পরীক্ষার জন্য তাদের পরিবর্তন করতে ফিডল মডিউল ব্যবহার করতে পারি।

উদাহরণস্বরূপ :

আমরা এক বিট টগল করে হিমায়িত অবস্থা পরিবর্তন করতে পারি।

এটি মূলত হিমায়িত পদ্ধতি যা করে, তবে লক্ষ্য করুন যে কীভাবে কোনও আনফ্রিজ পদ্ধতি নেই৷

শুধু মজা করার জন্য এটি বাস্তবায়ন করা যাক!

প্রথমে Fiddle প্রয়োজন মডিউল (রুবি স্ট্যান্ডার্ড লাইব্রেরির অংশ) এবং একটি হিমায়িত স্ট্রিং তৈরি করুন।

require 'fiddle'

str = 'water'.freeze
str.frozen?
# true

পরবর্তী:

আমাদের স্ট্রিং এর জন্য আমাদের মেমরি ঠিকানা প্রয়োজন, যা এইভাবে পাওয়া যেতে পারে।

memory_address = str.object_id * 2

অবশেষে:

কোন বস্তু হিমায়িত হয়েছে কিনা তা দেখতে রুবি চেক করে আমরা সঠিক বিটটি ফ্লিপ করি। আমরা frozen? কল করে এটি কাজ করে কিনা তাও পরীক্ষা করি পদ্ধতি।

Fiddle::Pointer.new(memory_address)[1] ^= 8

str.frozen?
# false

লক্ষ্য করুন যে সূচী [1] পতাকা-এর ২য় বাইটকে বোঝায় মান (যা মোট 4 বাইটের সমন্বয়ে গঠিত)।

তারপর আমরা ^= ব্যবহার করি যেটি "XOR" (এক্সক্লুসিভ OR) অপারেটর যেটি বিট ফ্লিপ করে।

আমরা এটি করি কারণ পতাকা এর ভিতরে বিভিন্ন বিট রয়েছে বিভিন্ন অর্থ আছে এবং আমরা সম্পর্কহীন কিছু পরিবর্তন করতে চাই না।

আপনি যদি আমার রুবি ট্রিক্স পোস্টটি পড়ে থাকেন তবে আপনি এটি আগে দেখে থাকতে পারেন, কিন্তু এখন আপনি জানেন এটি কীভাবে কাজ করে 🙂

আরেকটি জিনিস যা আপনি চেষ্টা করতে পারেন তা হল অ্যারের দৈর্ঘ্য পরিবর্তন করা এবং অ্যারের মুদ্রণ করা।

আপনি দেখতে পাবেন কিভাবে অ্যারে ছোট হয়ে যায়!

এমনকি আপনি Array তৈরি করতে ক্লাস পরিবর্তন করতে পারেন মনে করুন এটি একটি String

উপসংহার

রুবি কিভাবে হুডের নিচে কাজ করে সে সম্পর্কে আপনি কিছুটা শিখেছেন। রুবি অবজেক্টের মেমরি কীভাবে সাজানো হয় এবং আপনি কীভাবে Fiddle ব্যবহার করতে পারেন এর সাথে খেলার জন্য মডিউল।

আপনার সম্ভবত Fiddle ব্যবহার করা উচিত নয় একটি বাস্তব অ্যাপে এটির মতো, তবে এটি নিয়ে পরীক্ষা করা মজাদার৷

এই পোস্টটি শেয়ার করতে ভুলবেন না যাতে আরও বেশি মানুষ এটি দেখতে পারে 🙂


  1. রুবির সাথে মার্জ সাজানোর অন্বেষণ

  2. রুবিতে একটি প্রোগ্রামিং ভাষা তৈরি করা:পার্সার

  3. রুবিতে ডেকোরেটর ডিজাইন প্যাটার্ন

  4. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং