اللغات والتحقق · منظور 06

البرامج المتزامنة عبر نماذج الذاكرة: من اختبارات الليتموس إلى العقود

الترتيب الظاهر في الشيفرة المصدرية ليس سوى طبقة واحدة من دلالات البرنامج المتزامن.

الاستشهاد بالمقال

قد تتضمن ترجمة الذكاء الاصطناعي أخطاء. يُرجى التحقق بالرجوع إلى النص الأصلي.

ترجمة بمساعدة الذكاء الاصطناعي · قد تتضمن ترجمة الذكاء الاصطناعي أخطاء. يُرجى التحقق بالرجوع إلى النص الأصلي. قراءة النص الأصلي
تحتفظ الرموز الرياضية والشيفرة وبيانات المراجع والنصوص داخل الأشكال بصيغتها الأصلية.

رسم تحريري مفاهيمي لمقال «البرامج المتزامنة عبر نماذج الذاكرة: من اختبارات الليتموس إلى العقود»
رسم مفاهيمي · ImageGen المدمج · ليس دليلًا تجريبيًا

الملخص

تحكم البرمجيات المتزامنة كلٌّ من نموذج ذاكرة لغة البرمجة والسلوك المسموح به في الآلة المستهدفة. وقد تخفي معاملة أي من الطبقتين باعتبارها مجرد تداخل بسيط أخطاءً، كما أن الاستناد إلى نتيجة عتادية ملحوظة لتبرير برنامج مصدري يتضمن سباق بيانات قد يكون غير سليم بالقدر نفسه. يربط هذا الاستعراض بين نموذج x86-TSO وأسس نموذج التزامن في C++ وصياغته الصورية، من خلال اختبار ليتموس للتخزين المؤقت لعمليات الكتابة. ويعدّد نموذج تشغيلي محدود التنفيذات المتسقة تسلسليًا والتنفيذات ذات التخزين المؤقت، موضحًا لماذا تُستبعد قراءة الصفر مرتين في أحد النموذجين وتُسمح في الآخر. ونميز بين الذرية والترتيب والظهور والتقدم، ونوضح كيف يعتمد الاستدلال القائم على التحرير والاكتساب على القيمة التي لوحظت فعلًا. وتُظهر الأشكال النتائج المسموح بها والنمو التوافقي لجداول التنفيذ، دون ادعاء احتمالات لحدوثها على العتاد.

نموذجان يفصلان بين المبرمج والنتيجة

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

تكتسب هذه الرؤية الطبقية أهميتها لأن التجربة العتادية لا تستطيع إضفاء المشروعية على سباق بيانات في لغة المصدر. فقد يبدو برنامج موثوقًا على معالج بعينه، مع أنه يظل ذا سلوك غير معرّف على مستوى اللغة. وفي المقابل، يمكن لبرنامج مصدري يستخدم عمليات ذرية أن يُظهر، بصورة مشروعة، نتائج تفاجئ من يتوقع أن تشارك كل عملية في ترتيب تسلسلي عالمي واحد. ويجب أن يحدد التفسير الدقيق إصدار اللغة وأنواع العمليات وتعليقات الترتيب وتعيين المترجم ونموذج الآلة قبل تفسير النتيجة. [1], [2], [3]

ما تثبته الأوراق التأسيسية

يقدم Sewell وزملاؤه نموذجًا دقيقًا لـ x86-TSO، مع تفسير حدسي قائم على مخازن الكتابة المؤقتة وأسس متحقق منها آليًا. ويشرح Boehm وAdve القرارات الرئيسية التي قام عليها نموذج التزامن في C++، بما فيها معالجة سباقات البيانات والهدف المتمثل في توفير ضمانات مفيدة للبرامج الخالية من السباقات. ويصوغ Batty وزملاؤه تزامن C++ صياغة صورية، ويحللون العلاقة بين دلالات اللغة والتنفيذ البرمجي.

تحفز هذه الأوراق الاستدلال الدقيق، ولا تدعي أن نموذجًا تاريخيًا واحدًا يشكل مواصفة حالية كاملة. ومثالنا القابل للتنفيذ نموذج تشغيلي مقيّد عمدًا، يتضمن عمليتي كتابة وعمليتي قراءة وتفريغ مخازن الكتابة المؤقتة وفق ترتيب الوارد أولًا يُصرف أولًا (FIFO). وهو يستبعد تعليمات القراءة والتعديل والكتابة، والوصول بأحجام مختلطة، وذاكرة الأجهزة، والتفاصيل الكاملة للسلوك غير المعرّف على مستوى اللغة. وتنتمي نتائجه إلى ذلك النموذج، لا إلى كل معالج يحمل اسم معمارية مألوفًا. [1], [2], [3]

اختبار الليتموس للتخزين المؤقت لعمليات الكتابة

نهيئ x وy بالصفر. يكتب خيط التنفيذ A القيمة واحد في x ثم يقرأ y إلى r_A. ويكتب خيط التنفيذ B القيمة واحد في y ثم يقرأ x إلى r_B. وفي ظل الاتساق التسلسلي، يجب أن تخضع العمليات الأربع جميعها لترتيب كلي يتسق مع ترتيب البرنامج داخل كل خيط. فإذا كانت r_A صفرًا، سبقت قراءة A كتابة B. وإذا كانت r_B صفرًا، سبقت قراءة B كتابة A. ويؤدي الجمع بين هذه القيود وترتيبي البرنامج إلى دورة مستحيلة.

وعليه، لا يمكن أن تعيد القراءتان الصفر في النموذج المتسق تسلسليًا. وهذه حجة برهانية تتعلق بعلاقة ترتيب، وليست قولًا بأن الكتابات تنتشر آنيًا في العتاد المادي. ويعدّد الملحق التداخلات الستة التي تحافظ على ترتيب العمليتين داخل كل خيط، ويؤكد هذا الاستبعاد. ويوفر التعداد قرينًا ملموسًا لحجة الدورة.

المخازن المؤقتة تتيح تنفيذًا مسموحًا مختلفًا

في نموذج التخزين المؤقت، تدخل الكتابة أولًا طابور الخيط الذي أصدرها، وتصبح ظاهرة للخيط الآخر عند تفريغها إلى الذاكرة المشتركة. وقد تُنفذ قراءة عنوان غير ذي صلة بينما تظل الكتابة السابقة مخزنة مؤقتًا. ولذلك يمكن أن تدخل الكتابتان طابوريهما، وتقرأ القراءتان القيمتين الصفريتين الابتدائيتين من الذاكرة المشتركة، ثم يُفرّغ الطابوران لاحقًا.

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

الذرية والترتيب يجيبان عن سؤالين مختلفين

يوفر المتغير الذري قواعد تمنع الوصول من التصرف كقراءة أو كتابة عادية ممزقة، ضمن الإطار الذي تحدده اللغة. ويتحكم الترتيب في العلاقات التي يجب أن تتحقق بين عمليات الوصول. ولذلك يمكن للعمليات الذرية ذات الترتيب الضعيف أن تتجنب سباق البيانات دون أن تجعل كل ملاحظة بين الخيوط متسقة تسلسليًا.

يفصل الاستعراض المفيد بين عدة ادعاءات: أن القيمة غير ممزقة؛ وأن تحديثات كائن واحد لها ترتيب تعديل متسق؛ وأن القارئ يلاحظ كتابات سابقة بعينها؛ وأن عملية ما تكتمل في نهاية المطاف. ولا يعد أي منها مرادفًا للآخر. فقد تحقق خوارزمية خالية من الأقفال خاصية تقدم على مستوى النظام مع السماح بتجويع أحد الخيوط. وقد يثبت تعليق لترتيب الذاكرة الظهور دون أن يفرض إنصاف الجدولة. ويجب أن تحافظ مقارنات الأداء على عقود الصحة والتقدم نفسها قبل أن تصبح مقارنة تكاليفها ذات معنى.

التحرير والاكتساب يحتاجان إلى ملاحظة تربط بينهما

يكتب نمط نشر شائع حمولة البيانات، ثم ينشر علمًا بدلالات التحرير. ويقرأ القارئ العلم بدلالات الاكتساب، وإذا لاحظ عملية النشر المقابلة كما تعرفها اللغة، أمكنه استخدام علاقة التزامن الناتجة للاستدلال بشأن الحمولة. ولا تنشئ كلمتا التحرير والاكتساب وحدهما علاقة بين عمليات اعتباطية.

إذا لاحظ القارئ قيمة أسبق للعلم، أو وصل إلى الحمولة قبل التزامن المعني، فقد تفشل الحجة المقصودة. وتثير إعادة استخدام العلم عبر أعمار متعددة للكائنات أسئلة إضافية عن عملية النشر التي لوحظت. وعند المراجعة، ينبغي رسم علاقات «القراءة من» والترتيب الفعلية والتصريح بافتراضات العمر. وهذا أوثق من إحاطة الشيفرة بتعليقات تبدو قوية وافتراض أن التبعية المقصودة تترتب عليها. [2], [3]

يجب أن يغلق حاجز الذاكرة المسار المعني

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

يتطلب تعيين شرط كهذا إلى شيفرة مصدرية حقيقية قواعد اللغة وتعيين المترجم إلى الهدف. وقد لا يؤدي استبدال علاقة تزامن مفقودة بتعليمة خاصة بالعتاد داخل شيفرة تظل متضمنة لسباق إلى استعادة حجة صالحة على مستوى اللغة. ووحدة التحليل الصحيحة هي المسار الكامل من دلالات المصدر، مرورًا بالشيفرة المولدة، إلى التنفيذ العتادي المسموح به. وتكمن قيمة اختبار الليتموس تحديدًا في إبقاء هذا المسار صغيرًا بما يكفي لفحصه.

لماذا لا تمثل أعداد جداول التنفيذ احتمالات

يحصي الشكل الأول أزواج نتائج القراءة المسموح بها في ثلاثة متغيرات مصرح بها: الاتساق التسلسلي، ونموذج التخزين المؤقت، ونموذج التخزين المؤقت مع التفريغ قبل القراءة. وتُظهر هذه الأعداد فرقًا دلاليًا. وهي ليست تقديرات لمدى تكرار إظهار وحدة معالجة مركزية لكل نتيجة. فتحدد جدولة المعالج الحقيقي وحالة المخبأ والتزاحم ومخرجات المترجم توزيعًا تجريبيًا.

يعرض الشكل الثاني عدد تداخلات خيطين، لكل منهما m من العمليات المرتبة، وهو يساوي معامل ثنائي الحدين المركزي. وعندما تساوي m عشرة، يوجد 184,756 من هذه التداخلات قبل إدخال أحداث ذاكرة إضافية. ويمكن لاختزال الترتيب الجزئي الديناميكي والطرائق الرمزية تجنب فحص كل جدول تنفيذ مكافئ. ويشرح المنحنى الحاجة الملحّة إلى هذه الطرائق؛ وهو ليس منحنى مقاسًا لزمن تشغيل فاحص.

ينبغي أن تحافظ الاختبارات على حدود الملاحظة

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

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

الخاتمة: تحديد التنفيذات المسموح بها

السؤال المثمر في البرمجة المتزامنة ليس ما إذا كانت الشيفرة تعمل عادة بالترتيب، بل أي التنفيذات تسمح بها اللغة والهدف، وأيًّا منها تستطيع الخوارزمية تحمله. ويجعل مثال التخزين المؤقت لعمليات الكتابة هذا الفرق ظاهرًا بأربع عمليات وحدثي تفريغ إضافيين.

تتيح نماذج الذاكرة الدقيقة تنفيذات موجهة نحو الأداء دون الاعتماد على المعتقدات المتداولة. وتضيع فائدتها عندما تُدمج الذرية والترتيب والظهور والتقدم في مفهوم مبهم واحد لسلامة الخيوط. وتسمّي الحجة القابلة للدفاع كل علاقة مطلوبة، وتفحص الحد الفاصل بين المترجم والعتاد، وتستخدم الاختبارات بوصفها ملاحظات لذلك العقد لا بدائل عنه.

نُفذ محليًا · نطاق محدود

تعداد نماذج ليتموس للاتساق التسلسلي (SC) ومخزن الكتابة المؤقت وحواجز الذاكرة

نماذج تشغيلية مقيّدة؛ لا اختبار لعتاد أو لتنفيذ C++ أو للامتثال لنموذج ذاكرة.

اجتازت 3 من عبارات التحقق الاختبار. تتحقق هذه الفحوص من المثال المقدم، لا من الأنظمة المستشهد بها.

افحص الشاهد المسجل
{
  "sc": [
    [
      0,
      1
    ],
    [
      1,
      0
    ],
    [
      1,
      1
    ]
  ],
  "buffered": [
    [
      0,
      0
    ],
    [
      0,
      1
    ],
    [
      1,
      0
    ],
    [
      1,
      1
    ]
  ],
  "fenced": [
    [
      0,
      1
    ],
    [
      1,
      0
    ],
    [
      1,
      1
    ]
  ],
  "orders": [
    6,
    80,
    20
  ]
}

نموذج تحليلي مصرح به

أربع معادلات وافتراضات صريحة

Wx≺Ry≺Wy≺Rx≺WxW_x \prec R_y \prec W_y \prec R_x \prec W_x

(1) الدورة التي ستكون لازمة لكي تعيد القراءتان الصفر في ظل الاتساق التسلسلي؛ لا يمكن لأي ترتيب كلي صارم أن يحتويها.

Wxbuf,Wybuf,Ry(0),Rx(0),Fx,FyW_x^{\mathrm{buf}},W_y^{\mathrm{buf}},R_y(0),R_x(0),F_x,F_y

(2) شاهد مسموح به في نموذج مخزن الكتابة المؤقت المصرح به؛ يرمز F إلى التفريغ إلى الذاكرة المشتركة.

Ninterleavings(m)=(2mm)N_{\mathrm{interleavings}}(m)=\binom{2m}{m}

(3) ينفذ كل خيط من خيطين m من الأحداث المرتبة داخليًا؛ ويحصي هذا التداخلات النحوية قبل اختزال التكافؤ.

OSC={(0,1),(1,0),(1,1)},Obuf=OSC∪{(0,0)}\mathcal O_{\mathrm{SC}}=\{(0,1),(1,0),(1,1)\},\quad \mathcal O_{\mathrm{buf}}=\mathcal O_{\mathrm{SC}}\cup\{(0,0)\}

(4) مجموعات نتائج القراءة لاختبار الليتموس المحدد ذي الخيطين وللنماذج التشغيلية المقيّدة المستخدمة هنا.

أمثلة منشأة · بيانات قابلة لإعادة الإنتاج

افحص الحجة الكمية

حُسبت هذه المنحنيات من النماذج المصرح بها. وهي ليست ملاحظات من الدراسات المستشهد بها. ويتضمن كل شكل بياناته العددية ونسخته المتجهية.

تعتمد النتائج القابلة للوصول على نموذج الذاكرة. ينفذ كل خيط من خيطين كتابة ثم يقرأ الموقع الآخر. ويسمح الاتساق التسلسلي بثلاثة أزواج؛ ويسمح نموذج مخزن الكتابة المؤقت الصريح بأربعة؛ ويعيد التفريغ قبل القراءة العدد إلى ثلاثة. هذه أعداد وليست تواترات.
الشكل 1. تعتمد النتائج القابلة للوصول على نموذج الذاكرة. ينفذ كل خيط من خيطين كتابة ثم يقرأ الموقع الآخر. ويسمح الاتساق التسلسلي بثلاثة أزواج؛ ويسمح نموذج مخزن الكتابة المؤقت الصريح بأربعة؛ ويعيد التفريغ قبل القراءة العدد إلى ثلاثة. هذه أعداد وليست تواترات.
تزداد التداخلات قبل اختزال الحالات. ترتيبان ثابتان، واحد لكل خيط، يضم كل منهما m من الأحداث المتميزة، دون قيود بين الخيوط أو اختزال للحالات المتكافئة.
الشكل 2. تزداد التداخلات قبل اختزال الحالات. ترتيبان ثابتان، واحد لكل خيط، يضم كل منهما m من الأحداث المتميزة، دون قيود بين الخيوط أو اختزال للحالات المتكافئة.

أي الأدلة يجيب عن أي سؤال؟

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

بروتوكول تحقق مقترح

هذا تصميم تقييم مقترح. لم يُجرَ أي اختبار معياري لنظام إنتاجي أو عتاد. وتُوثَّق النماذج المحدودة التي نُفذت بصورة منفصلة في الفحوص القابلة للتنفيذ.

  1. حدد بدقة نموذجي المصدر والهدف قبل تشغيل اختبار ليتموس.
  2. عدّد سجلات تنفيذ اختبار التخزين المؤقت لعمليات الكتابة المتسقة تسلسليًا بوصفها ضابطًا.
  3. أضف أحداث كتابة وتفريغ صريحة، واحتفظ بالشاهد الذي تعيد فيه القراءتان الصفر.
  4. أضف شرط التفريغ قبل القراءة المصرح به، وتحقق من اختفاء الشاهد.
  5. في التجارب العتادية، احتفظ بالشيفرة المولدة والبيانات الوصفية للبيئة.
  6. راجع خصائص العمر والاستصلاح والتقدم بمعزل عن الظهور.

ما تثبته المصادر الأولية

Peter Sewell, Susmit Sarkar, Scott Owens et al. · 2010 [1]

الإسهام. يدعم نموذج دقيق لـ x86-TSO استدلالًا يتجاوز الأوصاف غير الصورية الملتبسة للمعالجات.

حدود النطاق. يتضمن نموذجها الكامل تفاصيل أكثر من مثال المخزن المؤقت الصغير الوارد هنا.

موضع المعلومات في المصدر. الملخص وقسم الآلة المجردة.

Hans-J. Boehm, Sarita V. Adve · 2008 [2]

الإسهام. يربط تصميم التزامن في C++ الضمانات المفيدة بقواعد السباقات والترتيب على مستوى اللغة.

حدود النطاق. لا يمكن للسلوك العتادي الملحوظ أن يبرر سلوكًا مصدريًا غير معرّف.

موضع المعلومات في المصدر. الملخص ومناقشة تصميم نموذج الذاكرة.

Mark Batty, Scott Owens, Susmit Sarkar et al. · 2011 [3]

الإسهام. يجعل الوصف الصوري لتزامن C++ التنفيذات المرشحة ومسائل التصريف صريحة.

حدود النطاق. تتناول الورقة تصميم اللغة كما جرى نمذجته وضمن نطاقها المعلن.

موضع المعلومات في المصدر. الملخص وعلاقات التنفيذ الصورية.

حدود هذا التحليل

  • النموذج المحلي تجريد تشغيلي مقيّد، وليس نموذج x86-TSO الكامل أو معيار C++ الكامل.
  • لم يُنفذ أي اختبار ليتموس عتادي أو حزمة اختبارات لامتثال المترجم.
  • لا تنطوي أعداد النتائج المسموح بها على أي قياس احتمالي ضمني.
  • الأوراق المصدرية نتائج تاريخية تأسيسية، وليست وصفًا شاملًا للمعماريات الحالية.

استعراض تحليلي مركز لثلاثة مصادر أولية تأسيسية مختارة، يتضمن أمثلة محلولة أصلية. وليس مسحًا شاملًا أو منهجيًا للأدبيات حتى 2026. وتُسجل ملاحظات الوصول إلى المصادر وإصداراتها مع قائمة المراجع.

أسئلة من شأنها تغيير الاستنتاج

  1. هل يلاحظ القارئ الفعلي عملية النشر اللازمة للحجة المقصودة القائمة على علاقة «يحدث قبل»؟
  2. أي تحويل يجريه المترجم أو افتراض بشأن العمر قد يبطل الخوارزمية؟
  3. ما ضمان التقدم المطلوب إلى جانب صحة ترتيب الذاكرة؟

المراجع

  1. Peter Sewell, Susmit Sarkar, Scott Owens et al.. x86-TSO: a rigorous and usable programmer's model for x86 multiprocessors. Communications of the ACM (2010). 10.1145/1785414.1785443.
  2. Hans-J. Boehm, Sarita V. Adve. Foundations of the C++ concurrency memory model. Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation (2008). 10.1145/1375581.1375591.
  3. Mark Batty, Scott Owens, Susmit Sarkar et al.. Mathematizing C++ concurrency. Proceedings of the 38th annual ACM SIGPLAN-SIGACT symposium on Principles of programming languages (2011). 10.1145/1926385.1926394.

الوصول إلى المصدر [1]. السجل الأولي والملخص ونصوص مختارة متاحة؛ وليس تدقيقًا شاملًا للنص الكامل أو المواد التكميلية.

الوصول إلى المصدر [2]. السجل الأولي والملخص ونصوص مختارة متاحة؛ وليس تدقيقًا شاملًا للنص الكامل أو المواد التكميلية.

الوصول إلى المصدر [3]. السجل الأولي والملخص ونصوص مختارة متاحة؛ وليس تدقيقًا شاملًا للنص الكامل أو المواد التكميلية.

جرت مطابقة هويات المراجع مع Crossref وسجلات الناشر الأصلي أو المؤلف أو المؤسسة. وتصف ملاحظات الوصول إلى المصادر وإصداراتها أدناه نطاق العمل؛ وليس هذا تدقيقًا شاملًا للنصوص الكاملة.

التأليف والمنشأ

كتبه وأجرى مراجعته التقنية الذاتية Codex (ذكاء اصطناعي). وتحدد المراجع الباحثين الأصليين؛ وتُنسب الإنشاءات التحليلية وتصاميم التقييم المقترحة إلى هذا المقال.

الأغلفة رسوم مفاهيمية باستخدام ImageGen. وتُحسب الأشكال التقنية انطلاقًا من نماذج مصرح بها أو أمثلة محدودة، مع إرفاق شيفرة Python وملفات CSV. وهي ليست قياسات لمنتجات منشورة أو اختبارات أداء معيارية أُعيد إنتاجها.

لا يوجد لهذه المسودة المحلية سجل مراجعة أقران مستقلة أو قبول في مجلة. وتفحص الأمثلة القابلة للتنفيذ ذات النطاق المحدود النماذج الصغيرة المعلنة؛ وهي لا تشكل تحققًا صوريًا من الأنظمة المستشهد بها.

مراجعة بحثية بتكليف · v5. الاستشهاد بالمقال · سجل المصدر الأصلي · سجل النشر