x32x01
  • بواسطة x32x01 ||
ازاي الـGarbage Collector بيهندل الـMemory في الـJavaScript ؟!
مقارنة بين اتنين Algorithms مهمين في عالم الـGarbage Collection في لغات كتير مشهورة زي JavaScript و #C و Python و Java !!

وفي الطريق هنشرح كام مفهوم مهم زي الـCircular Reference Problem و Primitive vs Reference Values...
يلا شد حزام الأمان يا صديق وخليك فاتح الـdiagrams اللي مع البوست فى المرفقات وانت بتقرأ وبسم الله...

النمط العام للغات اللي بتستخدم الـGarbage Collector علشان يـmanage الـmemory هي انها بتقسم اي بيانات هتخزنها في الـVariables لنوعين وهما Primitive Values و Reference Values (في لغات تانية بتستخدم الـGC ولكن بتشذ عن القاعدة دي زي Go و Lua و Haskell و Erlang)... يعني ايه الكلام ده؟

اللغة بتعتبر القيم اللي زي الـNumbers والـStrings والـBooleans وغيرها من القيم البسيطة Primitive Values وبتخزنها في الـStack
اما الـObjects والـArrays بتعتبرها Reference Values وبتخزنها في الـHeap

برضه مفهمناش يعني ايه الفرق؟
الفرق هو ان الـPrimitive Values بتتخزن مباشرةً في الـVariables أما الـReference Values الـVariables مش بتخزنها هي بس بتخزن موقعها "Reference" في الـMemory علشان تقدر توصلها بعد كده.. زي الـPointers كده للي ليه خلفية مع لغات زي Cpp
تمام؟... خلي المعلومة دي في دماغك علشان هنحتاجها كمان شوية ان شاء الله

لما تبص على الكود تحت هتلاقي اننا عملنا تلاتة Variables وهما دلوقتي بيشاوروا على الـobjects الفاضية دي في الـMemory (هنرمز للـVariables في الـDiagrams بحرف Capital والـObject بتاعها بحرف small)...

وبعدين عملنا Property جديدة للـObject اللي اسمه a وخليناها تشاور على الـObject اللي اسمه b وكذلك مع باقي الـObjects...
خليك بالك اننا قولنا بتشاور مش بتخزن علشان الـProperty دي اصلاً Variable وخليتها بتساوي Object فزي ما قولنا هي هتشاور عليه مش هتخزنه

فلما تتنفذ الأسطر الرابع والخامس والسادس هتبقا عملت المشكلة اللي بنقول عليها وهي الـCircular Reference Problem...
لأنك عملت حلقة من الداتا اللي بتشاور على بعض ودي لو متعرفش ليها مشاكل كتيرة جداً ولو حاولت تدور شوية في الموضوع هتستفاد جداً ولكن احنا هنا هنكتفي بمشكلة واحدة بس...

بعيداً عن المثال اللي كنا بنتكلم عنه ده ... في حالة انك خليت الـVariable يشاور علي null او على اي object تاني فهنا مش هيشيل الـObject اللي كان مشاور عليه قبل كده من الميموري هو بس هيشاور على واحد تاني...

فهنا الـObject القديم لسه موجود وواخد Memory Space بالرغم اني مش هعرف اوصله تاني اصلاً فاعمل ايه علشان اشيله؟

دي بقى شغلانة الـAlgorithms اللي جايين نتكلم عنها وهما الـReference Counting والـMark-And-Sweep...

الـReference Counting بيقولك انا مش هشيل حاجة من الميموري الا لو مفيش ولا variable مشاور عليها…
فهنا هو ساعدني انه شال الـObject اللي مقدرش اوصله ده من الميموري علشان مفيش ولا Variable اقدر استخدمه علشان اوصل بيه للـObject... ولكن الـAlgorithm ده هيظهر قصوره قدام مشكلة الـCircular Reference لأن حتى لو خلينا كل الـVariables اللي اسمهم A و B و C يشاوروا على null هيفضل كل Object فيه Variable من Object تاني مشاور عليه (الـProperty بتاع الـObject التاني) بالرغم اني برضه مستحيل هعرف اوصلهم تاني لأني مش هعرف اوصل لأي داتا الا عن طريق Variables (فيه طرق تانية بس خطيرة جداً)...

فهنا يظهر الـGoat الحقيقي الـMark-And-Sweep Algorithm وهو بيقولك انا هضيف عنصر جديد للمعادلة وهو الـRoot... طب ايه هو الـRoot ده؟
الRoot باختصار هو اي Object او Reference تقدر توصله مباشرةً عن طريق البرنامج من غير ما تعدي على اي Object تاني...

يعني ايه برضه؟
في سياق الـJavaScript ممكن تعتبره الـGlobal Object في الـNode JS او الـWindow Object في الـBrowser...
فالـAlgorithm ده بيقول ان مش هشيل اي داتا من الميموري الا لو مقدرتش اوصلها من الـRoot...

لو بصيت على الـdiagram اللي موجود تحت بتاع الـAlgorithm ده هتلاقي انه لما نخلي كل الـVariables يشاوروا على null الـAlgorithm هيشوف كل الـObjects اللي اسمهم a و b و c هل دول اقدر اوصلهم من الـRoot؟
الإجابة لأ... فيشيلهم من الميموري ببساطة.

ملحوظة : لو فيه Variable واحد بس فضل مشاور على Object من الـObjects المشاركين في الـCircular Reference الـMark-And-Sweep Algorithm مش هيشيل الـObjects من الميموري لأن الـVariable ده هيعتبر لسه طريق مفتوح تقدر توصل بيه من الـRoot الـObjects دول... شوف الـDiagram تحت 👇 فى المرفقات
مش عايزك تفهم غلط وتحس ان الـMark-And-Sweep Algorithm احسن من الـReference Counting Algorithm إجمالاً...

الـMark-And-Sweep Algorithm بيتميز انه بيحل مشكلة الـCircular Reference ومش بيحتاج يعد الـVariables اللي بتشاور على الـObject على عكس الـ Reference counting Algorithm اللي مش بيشيل الـObject من الميموري الا لو وصل عدد الـVariables دول لصفر ولكن عيوبه انه بيعمل Puase مؤقت للبرنامج وهو شغال علشان عملية المسح وبيستهلك Resources زيادة في التنفيذ

اما الـReference Counting Algorithm عيوبه انه مش بيعرف يحل مشكلة الـCircular Reference وكمان لو قعدت تغير الـObject اللي بيشاور عليه الـVariable مرات كتير هيكون مكلف وهيستهلك Resources كتير ولكنه بيتميز انه مش بيعمل Pause للبرنامج يعني بيمسح على طول وبرضه فهمه وتنفيذه سهل
بس كدا... لو عندكم اي تصحيح لمعلومة هنا اتمنى تشاركوها ويارب تكونوا استفدتم وجزاكم الله خيراً ❤️
 

المرفقات :

  • 01.jpg
    01.jpg -
    38.2 كيلوبايت · المشاهدات: 0
  • 02.jpg
    02.jpg -
    12.5 كيلوبايت · المشاهدات: 2
  • 03.jpg
    03.jpg -
    15.3 كيلوبايت · المشاهدات: 1
  • 04.jpg
    04.jpg -
    16.9 كيلوبايت · المشاهدات: 2
  • 05.jpg
    05.jpg -
    18.9 كيلوبايت · المشاهدات: 1
  • 06.jpg
    06.jpg -
    19.8 كيلوبايت · المشاهدات: 1
  • 07.jpg
    07.jpg -
    22.5 كيلوبايت · المشاهدات: 2
  • 08.jpg
    08.jpg -
    23.9 كيلوبايت · المشاهدات: 1
  • 09.jpg
    09.jpg -
    24.4 كيلوبايت · المشاهدات: 1

المشاركات المتشابهة

x32x01
الردود
0
المشاهدات
93
x32x01
x32x01
x32x01
الردود
0
المشاهدات
9
x32x01
x32x01
x32x01
الردود
0
المشاهدات
15
x32x01
x32x01
x32x01
الردود
0
المشاهدات
164
x32x01
x32x01
x32x01
الردود
0
المشاهدات
36
x32x01
x32x01
الوسوم : الوسوم
البرمجة والخوارزميات

الدخول أو التسجيل السريع

نسيت كلمة مرورك؟

آخر المشاركات

أحدث المنتجات

إحصائيات المنتدى

المواضيع
1,600
المشاركات
1,787
أعضاء أكتب كود
193
أخر عضو
HAa
عودة
أعلى