C তে tracing GC,
mark & sweep এলগো সবার জানা। কিন্তু C তে root pointers বাহির করবো কি করে?
এর একটা নিয়ম হলো প্রোগ্রামের প্রথমেই এর stack address নেয়া
void* ptr=NULL;
void* stack_addr=&ptr;
এর পর যখন GC এর সময় হবে তখন আবার stack address নিয়ে দুয়ের মাঝে যা আছে সবগুলোকে root pointers ধরে নিতে হবে। 64 bit system হলে প্রতি 8 byte পর পর একটা পয়েন্টার। যেহেতু কম্পাইলার memory address সব সময় এর সাইজ মতো byte aligned করে রাখে। রেন্ডম জায়গা থেকে আরম্ভ করে না।
এগুলো mark করতে হবে, পরে sweep.
এর বাইরে processor's registers এ pointer থাকতে পারে। এর জন্য assembly দিয়ে registor পড়তে না চাইলে setjmp() একটা function আছে C তে যেটা সবগুলো register এর ভ্যলু একটা স্ট্রাকচারে পড়ে নেয়। এই ডাটা pointer tracer এ শামিল করতে হবে।
তৃতীয় হলো global variables. এগুলো stack এ আসবে না। সহজ সমাধান হলো সবগুলো global variables একটা structure এ রেখে structure টা trace এ শামিল করা।
এর বাইরে আছে function's static variable. এটা কম্পাইলার কোথায় রাখে ঠিক নেই। তাই static ব্যবহার করা যাবে না। global pointer ব্যবহার করে একই কাজ করা যায়।
Fox ল্যংগুয়েজ এ এভাবে করেছি।
http://github.com/sanjirhabib/fox
- Comments:
- google করলে পাবেন।
- লাইক কমেন্ট দিয়ে একটিব থাকলাম।