رمز مكرر

في برمجة الحاسوب ، يُعرف الكود المكرر بأنه وجود نسخ متعددة من نفس الكود المصدري في قاعدة البيانات . ويُطلق على جزء الكود المكرر أيضًا اسم "نسخة الكود" ، وتُسمى عملية البحث عن النسخ في الكود المصدري " كشف النسخ" . للكود المكرر جوانب سلبية متعددة . [ 1 ]

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

يكلف

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

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

ومن التكاليف الأخرى حجم الذاكرة، حيث يتطلب الكود المكرر ذاكرة لتخزين كل نسخة.

الظهور

تتضمن بعض الممارسات التي تؤدي إلى تكرار التعليمات البرمجية ما يلي:

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

تحديد

مثال على إصلاح الكود المكرر عن طريق استبدال الكود بالأسلوب

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

على سبيل المثال، يقوم الكود التالي بحساب متوسط ​​مصفوفة من الأعداد الصحيحة .

extern int array_a [ 4 ]; extern int array_b [ 4 ]; int sum_a = 0 ;for ( int i = 0 ; i < 4 ; i ++ ) { sum_a += array_a [ i ]; }int average_a = sum_a / 4 ; int sum_b = 0 ;for ( int i = 0 ; i < 4 ; i ++ ) { sum_b += array_b [ i ]; }int average_b = sum_b / 4 ;

يمكن إعادة كتابة الحلقتين على شكل الدالة التالية:

دالة حساب متوسط ​​أربعة عناصر ( int a []) { int sum = 0 ; for ( int i = 0 ; i < 4 ; i ++ ) { sum += a [ i ]; }أعد المجموع مقسومًا على 4 ؛ }

يؤدي استخدام هذه الوظيفة إلى التخلص من الكود المكرر.

extern int array1 [ 4 ]; extern int array2 [ 4 ];int average1 = calc_average_of_four ( array1 ); int average2 = calc_average_of_four ( array2 );

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

الكشف

تم اقتراح عدد من الخوارزميات للكشف عن التعليمات البرمجية المكررة. على سبيل المثال:

انظر أيضاً

مراجع

  1. سبينليس، ديوميديس. "دليل اكتشاف التعليمات البرمجية السيئة" . InformIT.com . تم الاطلاع عليه بتاريخ 2008-06-06 .
  2. لي، هونغتشي؛ كوون، هيوكمين؛ كوون، جونغهون؛ لي، هيجو (25 أبريل 2016). "CLORIFI: اكتشاف ثغرات البرمجيات باستخدام التحقق من استنساخ الشفرة". التزامن والحوسبة: الممارسة والتجربة . 28 (6): 1900-1917 . doi : 10.1002/cpe.3532 . S2CID 17363758 . 
  3. ^ أرتشيلي فونتانا، فرانشيسكا؛ زانوني، ماركو؛ رانشيتي، أندريا؛ رانشيتي ، دافيد (2013). "اكتشاف استنساخ البرامج وإعادة هيكلتها" (PDF) . ISRN هندسة البرمجيات . 2013 : 1 – 8. دوي : 10.1155/2013/129437 .
  4. كابسر، سي.؛ جودفري، إم دبليو، "يُعتبر الاستنساخ ضارًا "، المؤتمر الثالث عشر للعمل حول الهندسة العكسية (WCRE)، الصفحات 19-28، أكتوبر 2006
  5. فاغنر، ستيفان؛ عبد الخالق، عاصم؛ كايا، كامر؛ بار، ألكسندر (2016). "حول العلاقة بين نسخ البرمجيات غير المتناسقة والأخطاء: دراسة تجريبية" . المؤتمر الدولي الثالث والعشرون لمعهد مهندسي الكهرباء والإلكترونيات (IEEE) حول تحليل البرمجيات وتطويرها وإعادة هندستها (SANER) لعام 2016. الصفحات 79-89 . arXiv : 1611.08005 . doi : 10.1109/SANER.2016.94 . ISBN  978-1-5090-1855-0. S2CID 3154845 . 
  6. https://arxiv.org/html/2504.12608v1 معضلة نسخ الشيفرة: تبسيط التكرار في توليد الشيفرة القائم على نموذج LLM
  7. أوجه التشابه في التعليمات البرمجية التي تتجاوز النسخ واللصق بقلم إلمار يورغنز، وفلوريان دايسنبوك، وبنيامين هومل.
  8. بريندا س. بيكر . برنامج لتحديد التعليمات البرمجية المكررة. علوم الحاسوب والإحصاء، 24:49-57، 1992.
  9. إيرا د. باكستر وآخرون. الكشف عن النسخ باستخدام أشجار بناء الجملة المجردة
  10. الكشف المرئي عن التعليمات البرمجية المكررة مؤرشف في 2006-06-29 في Wayback Machine بواسطة ماتياس ريجر، ستيفان دوكاس.
  11. يوان، واي. وغو، واي. CMCD: الكشف عن نسخ التعليمات البرمجية باستخدام مصفوفة العد، في المؤتمر الثامن عشر لهندسة البرمجيات في منطقة آسيا والمحيط الهادئ لعام 2011. IEEE، ديسمبر 2011، الصفحات 250-257.
  12. تشين، إكس.، وانغ، أي واي، وتيمبيرو، إي دي (2014). تكرار وإعادة إنتاج دراسات الكشف عن نسخ التعليمات البرمجية . في ACSC (ص 105-114).
  13. بوليتشيف، بيتر، وماريوس مينيا. " اكتشاف التعليمات البرمجية المكررة باستخدام أداة مكافحة التوحيد ." وقائع ندوة الربيع والصيف للباحثين الشباب حول هندسة البرمجيات. رقم 2. دعم الميزانية الحكومية الفيدرالية لمعهد نظام برمجة الأكاديمية الروسية، 2008.