تقسيم البرنامج

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

شهدت تقنيات التقطيع تطورًا سريعًا منذ تعريفها الأصلي من قِبل مارك وايزر . في البداية، كان التقطيع ثابتًا فقط، أي يُطبق على شفرة المصدر دون أي معلومات أخرى غير شفرة المصدر. ثم قدم بوغدان كوريل ويانوش لاسكي التقطيع الديناميكي ، الذي يعمل على تنفيذ محدد للبرنامج (لمسار تنفيذ معين). [ 1 ] توجد أشكال أخرى من التقطيع، مثل تقطيع المسار. [ 2 ]

التقطيع الثابت

استنادًا إلى تعريف وايزر الأصلي [ 3 ] ، تتكون شريحة البرنامج الثابتة S، بشكل غير رسمي، من جميع العبارات في البرنامج P التي قد تؤثر على قيمة المتغير v في العبارة x. تُعرَّف الشريحة وفقًا لمعيار التقطيع C=(x,v)، حيث x هي عبارة في البرنامج P وv هو المتغير في x. تشمل الشريحة الثابتة جميع العبارات التي يمكن أن تؤثر على قيمة المتغير v في العبارة x لأي مُدخل مُحتمل. تُحسب الشرائح الثابتة عن طريق تتبع التبعيات بين العبارات. وبشكل أكثر تحديدًا، لحساب الشريحة الثابتة لـ (x,v)، نجد أولًا جميع العبارات التي يمكن أن تؤثر بشكل مباشر على قيمة v قبل الوصول إلى العبارة x. وبشكل تكراري، لكل عبارة y التي يمكن أن تؤثر على قيمة v في العبارة x، نحسب الشرائح لجميع المتغيرات z في y التي تؤثر على قيمة v. اتحاد جميع هذه الشرائح هو الشريحة الثابتة لـ (x,v).

مثال

على سبيل المثال، لننظر إلى برنامج C أدناه. لنحسب الشريحة لـ (write(sum), sum). تتأثر قيمة sum مباشرةً بالعبارتين "sum = sum + i + w" إذا كان N>1 و "int sum = 0" إذا كان N ≤ 1. لذا، فإن slice(write(sum), sum) هي اتحاد ثلاث شرائح والعبارة "int sum = 0" التي لا تعتمد على أي منها.

  1. slice( sum = sum + i + w, sum),
  2. slice( sum = sum + i + w, i),
  3. slice( sum = sum + i + w, w), و
  4. { int sum=0 }.

من السهل ملاحظة أن الدالة `slice(sum = sum + i + w, sum)` تتكون من "sum = sum + i + w" و "int sum = 0" لأن هاتين العبارتين السابقتين هما الوحيدتان اللتان تؤثران على قيمة `sum` عند "sum = sum + i + w". وبالمثل، فإن الدالة `slice(sum = sum + i + w, i)` تحتوي فقط على "for(i = 1; i < N; ++i) {"`، بينما تحتوي الدالة `slice(sum = sum + i + w, w)` فقط على العبارة "int w = 7".

عندما ندمج كل تلك العبارات، لا نحصل على كود قابل للتنفيذ، لذلك لجعل الشريحة قابلة للتنفيذ، نضيف ببساطة قوس النهاية لحلقة for وإعلان i. تظهر الشريحة الثابتة القابلة للتنفيذ الناتجة أسفل الكود الأصلي أدناه.

int i ; int sum = 0 ; int product = 1 ; int w = 7 ; for ( i = 1 ; i < N ; ++ i ) { sum = sum + i + w ; product = product * i ; } write ( sum ); write ( product );

الشريحة التنفيذية الثابتة للمعايير ( write(sum)، المجموع) هي البرنامج الجديد الموضح أدناه.

int i ; int sum = 0 ; int w = 7 ; for ( i = 1 ; i < N ; ++ i ) { sum = sum + i + w ; } write ( sum );

في الواقع، معظم تقنيات التقطيع الثابتة، بما في ذلك تقنية وايزر نفسها، ستزيل العبارة أيضًا . لأن قيمة المتغير write(sum)عند العبارة لا تعتمد على العبارة نفسها. غالبًا ما يتضمن التقطيع لعبارة معينة x أكثر من متغير واحد. إذا كانت V مجموعة من المتغيرات في العبارة x، فإن التقطيع لـ (x, V) هو اتحاد جميع التقطيعات التي تحقق المعيار (x, v) حيث v متغير في المجموعة V.write(sum)sum

نهج تقطيع ثابت أمامي خفيف الوزن

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

التقطيع الديناميكي

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

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

انظر أيضاً

ملحوظات

  1. كوريل، بوغدان؛ لاسكي، يانوش (1988). "تقسيم البرامج الديناميكي". رسائل معالجة المعلومات . 29 (3): 155-163 . CiteSeerX 10.1.1.158.9078 . doi : 10.1016/0020-0190(88)90054-3 . 
  2. جالا، رانجيت؛ ماجومدار، روباك (2005). "تقطيع المسار". وقائع مؤتمر ACM SIGPLAN لعام 2005 حول تصميم لغات البرمجة وتنفيذها . PLDI '05. نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM. الصفحات 38-47 . doi : 10.1145/1065010.1065016 . ISBN  9781595930569. S2CID 5065847 . 
  3. وايزر، مارك ديفيد (1979). شرائح البرنامج: دراسات رسمية ونفسية وعملية لطريقة تجريد البرامج التلقائية (أطروحة دكتوراه). آن أربور، ميشيغان، الولايات المتحدة الأمريكية: جامعة ميشيغان.
  4. العمري، حكام و.؛ كولارد، مايكل ل.؛ ماليتيك، جوناثان إ.؛ الهنداوي، نوح؛ مقدادي، عمر (19-05-2014). "srcSlice: تقطيع ثابت أمامي عالي الكفاءة وقابل للتوسع". مجلة البرمجيات: التطور والعمليات . 26 (11): 931-961 . CiteSeerX 10.1.1.641.8891 . doi : 10.1002/smr.1651 . ISSN 2047-7473 . S2CID 18520643 .   

مراجع

  • مارك وايزر . "تقسيم البرامج". وقائع المؤتمر الدولي الخامس لهندسة البرمجيات، الصفحات 439-449 ، مطبعة جمعية IEEE للحاسبات ، مارس 1981.
  • مارك وايزر . "تقسيم البرامج". معاملات IEEE في هندسة البرمجيات، المجلد 10، العدد 4، الصفحات 352-357 ، مطبعة جمعية IEEE للحاسبات ، يوليو 1984.
  • سوزان هورويتز ، وتوماس ريبس ، وديفيد بينكلي، التقطيع بين الإجراءات باستخدام رسوم بيانية للتبعية، معاملات ACM في لغات البرمجة والأنظمة، المجلد 12، العدد 1، الصفحات 26-60، يناير 1990.
  • فرانك تيب. "دراسة استقصائية لتقنيات تقسيم البرامج". مجلة لغات البرمجة، المجلد 3، العدد 3، الصفحات 121-189، سبتمبر 1995.
  • ديفيد بينكلي وكيث برايان غالاغر. "تقسيم البرامج". التقدم في الحوسبة، المجلد 43، الصفحات 1-50، دار النشر الأكاديمية ، 1996.
  • أندريا دي لوسيا. "تقسيم البرامج: الأساليب والتطبيقات"، ورشة العمل الدولية حول تحليل ومعالجة شفرة المصدر، الصفحات 142-149، 2001، مطبعة جمعية IEEE للحاسبات .
  • مارك هارمان وروبرت هيرونز. "نظرة عامة على تقسيم البرامج"، مجلة Software Focus، المجلد 2، العدد 3، الصفحات 85-92، يناير 2001.
  • ديفيد بينكلي ومارك هارمان. "مسح للنتائج التجريبية حول تقسيم البرامج"، التقدم في الحوسبة، المجلد 62، الصفحات 105-178، دار النشر الأكاديمية ، 2004.
  • ينس كرينكه. "تقسيم البرامج"، في كتاب "دليل هندسة البرمجيات وهندسة المعرفة"، المجلد 3: التطورات الحديثة. دار النشر العالمية العلمية ، 2005
  • سيلفا، جوزيب. "مفردات التقنيات القائمة على تقطيع البرامج"، مجلة ACM Computing Surveys، المجلد 44، العدد 3، رابطة آلات الحوسبة ، يونيو 2012
  • Alomari HW et al. "srcSlice: تقطيع ثابت أمامي عالي الكفاءة وقابل للتوسع". مجلة وايلي للبرمجيات: التطور والعمليات ( JSEP )، DOI: 10.1002/smr.1651، المجلد 26، العدد 11، الصفحات 931-961، 2014.