الآثار الجانبية (علوم الحاسوب)
في علوم الحاسوب ، يُقال إن عمليةً أو تعبيرًا ما له تأثير جانبي إذا كان له أي تأثير ملحوظ بخلاف تأثيره الأساسي المتمثل في قراءة قيمة وسيطاته وإرجاع قيمة إلى مُستدعي العملية. تشمل أمثلة التأثيرات الجانبية تعديل متغير غير محلي ، أو متغير محلي ثابت ، أو وسيط قابل للتغيير مُمرر بالمرجع ؛ أو إجراء عمليات إدخال/إخراج ؛ أو استدعاء دوال أخرى ذات تأثيرات جانبية. [ 1 ] في وجود التأثيرات الجانبية، قد يعتمد سلوك البرنامج على تاريخه؛ أي أن ترتيب التقييم مهم. يتطلب فهم دالة ذات تأثيرات جانبية وتصحيح أخطائها معرفة السياق وتاريخه المحتمل. [ 2 ] [ 3 ] تلعب التأثيرات الجانبية دورًا مهمًا في تصميم لغات البرمجة وتحليلها . يعتمد مدى استخدام التأثيرات الجانبية على نموذج البرمجة. على سبيل المثال، تُستخدم البرمجة الإجرائية عادةً لإنتاج تأثيرات جانبية، لتحديث حالة النظام. في المقابل، تُستخدم البرمجة التصريحية عادةً للإبلاغ عن حالة النظام، دون تأثيرات جانبية.
يهدف البرمجة الوظيفية إلى تقليل الآثار الجانبية أو إزالتها. ويُسهّل غياب الآثار الجانبية عملية التحقق الرسمي من البرنامج. تتخلص لغة البرمجة الوظيفية هاسكل من الآثار الجانبية، مثل عمليات الإدخال والإخراج والحسابات الأخرى التي تعتمد على الحالة، باستبدالها بعمليات أحادية . [ 4 ] [ 5 ] لا تُقيّد لغات البرمجة الوظيفية الأخرى، مثل ستاندرد إم إل ، وسكيم، وسكالا ، الآثار الجانبية، ولكن من المعتاد أن يتجنبها المبرمجون. [ 6 ]
تُوسّع أنظمة التأثيرات نطاق الأنواع لتتبع التأثيرات، مما يسمح بتدوين موجز للدوال ذات التأثيرات، مع الحفاظ على معلومات حول مدى وطبيعة التأثيرات الجانبية. وعلى وجه الخصوص، فإن الدوال التي لا تُحدث تأثيرات تُقابل الدوال النقية.
يجب على مبرمجي لغة التجميع الانتباه إلى الآثار الجانبية الخفية ، وهي التعليمات التي تُعدّل أجزاءً من حالة المعالج دون ذكرها في رمزها. ومن الأمثلة الكلاسيكية على الآثار الجانبية الخفية تعليمات حسابية تُعدّل ضمنيًا رموز الحالة (أثر جانبي خفي) بينما تُعدّل صراحةً سجلًا (الأثر المقصود). من عيوب مجموعة التعليمات ذات الآثار الجانبية الخفية أنه إذا كان للعديد من التعليمات آثار جانبية على جزء واحد من الحالة، مثل رموز الحالة، فقد تُصبح المنطق اللازم لتحديث تلك الحالة بالتسلسل عائقًا أمام الأداء. وتبرز هذه المشكلة بشكل خاص في بعض المعالجات المصممة بتقنية خطوط الأنابيب (منذ عام 1990) أو بتقنية التنفيذ خارج الترتيب . قد يتطلب هذا النوع من المعالجات دوائر تحكم إضافية لاكتشاف الآثار الجانبية الخفية وإيقاف خط الأنابيب مؤقتًا إذا كانت التعليمات التالية تعتمد على نتائج تلك الآثار.
الشفافية المرجعية
يُعدّ غياب الآثار الجانبية شرطًا ضروريًا، ولكنه غير كافٍ، للشفافية المرجعية. تعني الشفافية المرجعية إمكانية استبدال تعبير (مثل دالة) بقيمته. يتطلب هذا أن يكون التعبير نقيًا ، أي أن يكون حتميًا (يعطي دائمًا القيمة نفسها لنفس المدخلات) وخاليًا من الآثار الجانبية.
الآثار الجانبية المؤقتة
عادةً ما يتم تجاهل الآثار الجانبية الناتجة عن الوقت المستغرق لتنفيذ عملية ما عند مناقشة الآثار الجانبية والشفافية المرجعية. توجد بعض الحالات، مثل توقيت الأجهزة أو اختبارها، حيث تُدرج العمليات خصيصًا لآثارها الجانبية الزمنية، على سبيل المثال، sleep(5000)أو for (int i = 0; i < 10000; ++i) {}. لا تُغير هذه التعليمات الحالة إلا من خلال استغراقها وقتًا محددًا لإتمامها.
العجز الجنسي
تكون الدالة الفرعية ذات التأثيرات الجانبية متطابقة التأثير إذا كان لاستدعاءات متعددة لهذه الدالة نفس التأثير على حالة النظام كما لو تم استدعاؤها مرة واحدة، أي إذا كانت الدالة المرتبطة بالدالة الفرعية من فضاء حالة النظام إلى نفسها متطابقة التأثير بالمعنى الرياضي . على سبيل المثال، انظر إلى برنامج بايثون التالي :
x = 0تعريف setx ( n ): عالمي x x = nsetx ( 3 ) assert x == 3 setx ( 3 ) assert x == 3setxهي متطابقة لأن الاستدعاء الثاني للقيمة setx3 له نفس التأثير على حالة النظام مثل الاستدعاء الأول: xتم تعيينها بالفعل إلى 3 بعد الاستدعاء الأول، ولا تزال مع ذلك معينة إلى 3 بعد الاستدعاء الثاني.
تكون الدالة النقية متطابقة إذا كانت متطابقة بالمعنى الرياضي . على سبيل المثال، انظر إلى برنامج بايثون التالي:
دالة abs ( n ): تُرجع -n إذا كان n < 0، وإلا تُرجع nassert abs ( abs ( - 3 )) == abs ( - 3 )absهي دالة متكررة لأن الاستدعاء الثاني absللقيمة المرجعة من الاستدعاء الأول لـ -3 يعيد نفس القيمة التي أعادها الاستدعاء الأول لـ -3.
مثال
من الأمثلة الشائعة على سلوك التأثير الجانبي عامل الإسناد في لغة C. الإسناد a = bعبارة عن تعبير يُقيّم إلى نفس قيمة التعبير b، مع تأثير جانبي يتمثل في تخزين القيمة اليمنى للتعبير bفي القيمة اليسرى للتعبير a. وهذا يسمح بإسناد قيم متعددة.
a = ( b = 3 ); // b = 3 تُقيّم إلى 3، والتي تُسند بعد ذلك إلى aلأن عامل الربط الأيمن ، فإن هذا يعادل
أ = ب = 3 ؛يمثل هذا الأمر عقبة محتملة للمبرمجين المبتدئين الذين قد يشعرون بالارتباك
بينما ( ب == 3 ) {} // يختبر ما إذا كانت قيمة ب تساوي 3مع
بينما ( ب = 3 ) {} // ب = 3 تُقيّم إلى 3، والتي تُحوّل بدورها إلى صحيح، لذا فإن الحلقة لا نهائيةانظر أيضاً
مراجع
- ↑ سبولر، ديفيد أ.؛ ساجيف، أ. سيد محمد (يناير 1994). كشف المُصرّف عن الآثار الجانبية لاستدعاءات الدوال . جامعة جيمس كوك . CiteSeerX 10.1.1.70.2096 .
يُشير مصطلح "الأثر الجانبي" إلى تعديل البيئة غير المحلية. يحدث هذا عادةً عندما تُعدّل دالة (أو إجراء) متغيرًا عامًا أو وسائط مُمرّرة كمرجع. ولكن توجد طرق أخرى لتعديل البيئة غير المحلية. نناقش الأسباب التالية للآثار الجانبية الناتجة عن استدعاء دالة: 1. إجراء عمليات الإدخال/الإخراج. 2. تعديل المتغيرات العامة. 3. تعديل المتغيرات المحلية الدائمة (مثل المتغيرات الثابتة في لغة C). 4. تعديل وسيط مُمرّر كمرجع. 5. تعديل متغير محلي، سواء كان تلقائيًا أو ثابتًا، لدالة أعلى في تسلسل استدعاء الدوال (عادةً عبر مؤشر).
- ↑ تيرنر، ديفيد أ. ، محرر. (1990). موضوعات بحثية في البرمجة الوظيفية . أديسون-ويسلي . ص 17-42 . عن طريق هيوز، جون. "لماذا تُعدّ البرمجة الوظيفية مهمة" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 14 يونيو 2022. تم الاطلاع عليه بتاريخ 6 أغسطس 2022 .
- ↑ كولبيرغ، كريستيان س. (22 أبريل 2005). "مبادئ لغات البرمجة CSc 520" . قسم علوم الحاسوب، جامعة أريزونا . مؤرشف من الأصل في 6 أغسطس 2022. تم الاطلاع عليه في 6 أغسطس 2022 .
- ↑ "تقرير هاسكل 98" . 1998.
- ↑ جونز، سيمون بيتون؛ وادلر، فيل (1993). البرمجة الوظيفية الإجرائية . وقائع المؤتمر السنوي العشرين لجمعية آلات الحوسبة حول مبادئ لغات البرمجة. الصفحات 71-84 .
- ↑ فيليسين، ماتياس ؛ فيندلر، روبرت بروس؛ فلات، ماثيو؛ كريشنامورثي، شري رام (2014-08-01). "كيفية تصميم البرامج" ( الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا .
- برمجة الحاسوب
- نظرية لغات البرمجة
- البرمجة الوظيفية
