إضافة سندات ذكية (مؤشرات ذكية)

قدمت الطلب التالي لإضافة صنفي سندات ذكية: https://github.com/Alusus/Alusus/pull/105
الفكرة أن يدير الصنف الذاكرة نيابة عن المبرمج فيعمل تلقائيا على تحرير الذاكرة عند انتفاء الحاجة إليها. وهناك صنفان:

سـندنا = SrdRef (اختصار SharedRef) : سند مشترك. أي يمكن تعريف عدة سندات تؤشر إلى نفس الكائن ولا يتم تحرير الذاكرة إلا بعد أن تُتلف جميع هذه السندات. يعتمد على عداد داخلي.

سـندي = UnqRef (اختصار UniqueRef): سند مفرد، أي لا يمكن مشاركة نفس الكائن بين عدة سندات من هذا النوع. هذا السند لا يحتاج إلى عداد وبالتالي قد يكون أسرع من الصنف الآخر.

طريقة الاستخدام بسيطة:

%D9%84%D9%82%D8%B7%D8%A9%20%D8%B4%D8%A7%D8%B4%D8%A9%20%D9%85%D9%86%202020-03-08%2006-05-47

أريد آراءكم بالنسبة للتسميات العربية والانجليزية. هل من اقتراحات أفضل؟

1 Like

هل بإمكانك مشاركة الشفرة اللاتينية مع المخرجات؟ لتوضح الفكرة اكثر

ما زلت لم تحترف قراءة شفرة عربية؟ تحتاج الممارسة يا صاحبي :grin:
هذه الشفرة باللاتينية:

type Num {
  def x: Int;
  handler this~terminate() {
    Console.print("Num %d is terminated.\n", this.x);
  }
}

func test1 {
  def n: SrdRef[Num];
  n.alloc()~init();
  n.x = 5;
}

func test2 {
  def n: UnqRef[Num] = Memory.alloc(Num~size)~cast[ptr[Num]];
  n.x = 11;
}

الصنف مشابه لصنفي shared_ptr و unique_ptr في لغة سي++. والفكرة عموما مشابهة لفكرة الصنف String حيث يتولى الصنف تحرير الذاكرة عند انتفاء الحاجة لها.

المخرجات عن تنفيذ دالة test1:
Num 5 is terminated.

المخرجات عند تنفيذ دالة test2:
Num 11 is terminated.

الفكرة تقيدم الشفرة الاتينية على العربية في الشرح
وصلتني الفكرة وهي مفيدة جدًا لكن ستزيد بعض التعقيد على اللغة
الافضل جعل المفسر يستخدم احدها بشكل تلقائي والاخر يكون اختياري للمبرمج
مارأيك؟

ماذا تقصد بجعل المفسر يستخدم أحدها تلقائيا؟ كيف يكون تلقائيا إذا كان المستخدم بحاجة لكتابة اسم الصنف في كل الأحوال؟ هل يمكن التوضيح بمثال؟

ما اعنيه ان يستخدم احد الصنفين بشكل تلقائي لعملية التحرير مثل استخدام سندنا دون كتابته وعند حاجة المبرمج لاستخدام سندي فيلغا سندنا
لان في الغالب المبرمج يسهو او ينسى تفريغ الذاكرة فالافضل تحديد احدها تلقائيا

مثال

type Num {
  def x: Int;
  handler this~terminate() {
    Console.print("Num %d is terminated.\n", this.x);
  }
}

func test1 {
  def n: Num; // يعمل التعريف هنا عمل StrRef[Num]
  n.alloc()~init();
  n.x = 5;
}

وكيف لو أراد المبرمج تعريف المتغير كقيمة وليس كسند؟ أقصد، حاليا الوضع كالتالي:

def n: Num; // تعريف كقيمة
def n: SrdRef[Num]; // تعريف كسند إلى تلك القيمة

فإذا غيرنا التعريف الأول ليكون سند وليس قيمة، فكيف يكون الشكل الجديد لتعريف القيم؟

براي ان نجعلها تلقائيا على SrdRef الاوان رأيت ان ذلك قد يسبب تعارض

هل تقصد أن نلغي إمكانية تعريف المتغيرات كقيم وتلقائيا نعتبر كل تعريف سند (مثلما هو الحال في جافاسكريبت)؟ فعل ذلك سيؤثر على التوافقية مع مكتبات النظام بالإضافة لتأثيرها السلبي على الأداء.

يمكننا فعل ما تقترحه إذا حددناه في مجال محدد وجعلناه اختياريا. مثلا:

@use_srd_ref module MyProgram {
  // كل ما في داخل هذه الوحدة يستخدم السندات الذكية تلقائيا
}

في هذه الحالة يكون عند المستخدم تحكم، فيستخدم المبدل في الوحدات الملائمة ويتجنبه في الوحدات التي تحتاج التعامل مع مكتبات النظام أو تحتاج أداءًا أعلى.

@useSrdRef
سيكون افضل ونعم هكذا افضل

1 Like