لا تخشى المفغره



D ، مثل العديد من اللغات المستخدمة اليوم ، يأتي مع جامع القمامة (GC). يمكن تطوير العديد من أنواع البرامج دون التفكير في GC على الإطلاق ، مع الاستفادة الكاملة من مزاياها. ومع ذلك ، فإن GC لديها عيوبها وجمع القمامة غير مرغوب فيه في بعض السيناريوهات. في مثل هذه الحالات ، تسمح لك اللغة بتعطيل جامع القمامة مؤقتًا ، أو حتى الاستغناء عنها تمامًا.



للحصول على أقصى استفادة من جامع القمامة وتقليل عيوبها ، تحتاج إلى فهم كيفية عمل GC في لغة D. نقطة انطلاق جيدة هي صفحة Garbage Collection على dlang.org ، والتي تقدم الأساس المنطقي ل GC في لغة D وتعطي القليل نصائح حول كيفية العمل معه. هذا هو المقال الأول في سلسلة من المقالات التي تغطي الموضوع بمزيد من التفصيل.



هذه المرة سوف نلمس الأساسيات فقط ، مع التركيز على وظائف اللغة التي يمكن أن تسبب تخصيص الذاكرة من خلال GC. ستعرض المقالات المستقبلية طرقًا لتعطيل GC إذا لزم الأمر ، بالإضافة إلى التعابير المساعدة في التعامل مع اللاإحتمالية (على سبيل المثال ، إدارة الموارد في أدوات تدمير الكائنات التي تتحكم فيها GC).



أول شيء يحتاج إلى توضيح: جامع القمامة في D يعمل فقط أثناء تخصيص الذاكرة وفقط إذا لم يكن هناك ذاكرة يمكن تخصيصها. لا يجلس في الخلفية ، ويقوم بفحص الكومة بشكل دوري وجمع القمامة. أنت بحاجة إلى فهم هذا من أجل كتابة كود فعال للذاكرة يتحكم فيه GC. خذ بعين الاعتبار المثال التالي:



void main() {
    int[] ints;
    foreach(i; 0..100) {
        ints ~= i;
    }
}


ينشئ هذا البرنامج صفيفًا ديناميكيًا من قيم النوع int، ثم يستخدم عامل الربط في D لإضافة أرقام من 0 إلى 99 إليه foreach. ما هو غير واضح للعين غير المدربة هو أن عامل الانضمام يخصص ذاكرة للقيم المضافة من خلال جامع القمامة.



D . , . , , . , , capacity. , , .



void main() {
    import std.stdio : writefln;
    int[] ints;
    size_t before, after;
    foreach(i; 0..100) {
        before = ints.capacity;
        ints ~= i;
        after = ints.capacity;
        if(before != after) {
            writefln("Before: %s After: %s",
                before, after);
        }
    }
}


DMD 2.073.2,  — GC. , GC . . , GC, .



, before after. : 0, 3, 7, 15, 31, 63, 127. ints 100 , 27 , , 255, . , , D, . , GC , (Steve Schveighoffer) .



, , GC . , , «» . GC .



, C C++, , . ,  — , . , GC D , . :



void main() {
    int[] ints = new int[](100);
    foreach(i; 0..100) {
        ints[i] = i;
    }
}


. , — . 100 . new 100, .



: reserve:



void main() {
    int[] ints;
    ints.reserve(100);
    foreach(i; 0..100) {
        ints ~= i;
    }
}


100 , ( length 0), . , 100 , , .



new reserve, , GC.malloc.



import core.memory;
void* intsPtr = GC.malloc(int.sizeof * 100);
auto ints = (cast(int*)intsPtr)[0 .. 100];


.



auto ints = [0, 1, 2];


, enum.



enum intsLiteral = [0, 1, 2];
auto ints1 = intsLiteral;
auto ints2 = intsLiteral;


enum .  — . , . ints1, ints2 , :



auto ints1 = [0, 1, 2];
auto ints2 = [0, 1, 2];


, . , ( D — ) — .



int[3] noAlloc1 = [0, 1, 2];
auto noAlloc2 = "No Allocation!";


:



auto a1 = [0, 1, 2];
auto a2 = [3, 4, 5];
auto a3 = a1 ~ a2;


D , , . : keys values, . , , - ,  — . , GC.



- , , , . , . , . D : byKey, byValue byKeyValue. , . , , . Ranges More Range (Ali Çehreli) Programming in D.



 — ,  — . , Garbage Collection — assert. , assert , AssertError, D, ( , GC).



, Phobos — D. - - Phobos’ GC, , . , Phobos GC. , , , , , . GC (, , ,  — - ).



الآن بعد أن فهمنا أساسيات العمل مع GC ، في المقالة التالية في هذه السلسلة ، سنلقي نظرة على الأدوات في اللغة والمترجم التي ستسمح لنا بتعطيل جامع القمامة والتأكد من عدم وصول المناطق الحرجة من البرنامج إلى GC.



بفضل Guillaume Piolat و Steve Schweihoffer لمساعدتهم في إعداد هذا المقال.




All Articles