العربية  

books job scope

If you do not find what you're looking for, you can use more accurate words.

View more

نطاق الوظيفة (Info)


تقدم معظم لغات البرمجة الشائعة طريقة لإنشاء متغير محلي "Local varibale" في وظيفة أو روتين فرعي: متغير ينتهي نطاقه (يخرج من السياق) عندما تعود الدالة. في معظم الحالات ، يكون عمر المتغير هو مدة استدعاء الدالة - وهو متغير تلقائي "automatic variable"، يتم إنشاؤه عند بدء الدالة (أو يتم الإعلان عن المتغير) ، يتم إتلافها عند إرجاع الدالة - في حين يكون نطاق المتغير داخل وظيفة ، على الرغم من أن معنى "داخل" يعتمد على ما إذا كان scoping معجمية أو ديناميكية. ومع ذلك ، فإن بعض اللغات ، مثل C ، توفر أيضًا للمتغيرات المحلية الثابتة ، حيث يمثل عمر المتغير عمر البرنامج بأكمله ، ولكن المتغير يكون فقط في السياق عندما يكون داخل الدالة. في حالة المتغيرات المحلية الثابتة ، يتم إنشاء المتغير عند تهيئة البرنامج ، ويتم إتلافه فقط عند إنهاء البرنامج ، كما هو الحال مع متغير عام ثابت "static global variable"، ولكن في سياق داخل دالة فقط ، مثل متغير محلي تلقائي " automatic local variable".

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

def square(n): return n * n def sum_of_squares(n): total = 0 i = 0 while i <= n: total += square(i) i += 1 return total

على سبيل المثال ، في مقتطف شفرة Python على اليمين ، يتم تعريف وظيفتين: square و sum_of_squares. مربع يحسب مربع العدد. يحسب sum_of_squares مجموع كل المربعات إلى رقم. (على سبيل المثال ، المربع (4) هو 42 = 16 ، و sum_of_squares (4) هو 02 + 12 + 22 + 32 + 42 = 30.)

كل من هذه الوظائف له متغير اسمه n يمثل الوسيط للدالة. هذان المتغيران n منفصلان تمامًا ولا يرتبطان ببعضهما ، على الرغم من وجودهما بنفس الاسم ، نظرًا لأنهما متغيرين نطاقًا محليًا مع نطاق وظيفي: نطاق كل منهما هو وظيفته المنفصلة ، وبالتالي لا يتداخلان. لذلك ، يمكن لـ sum_of_squares استدعاء مربع بدون تغيير n الخاص بها. وبالمثل يحتوي sum_of_squares على متغيرات باسم "i" ؛ هذه المتغيرات ، نظرًا لنطاقها المحدود ، لن تتداخل مع أي متغيرات تُسمى "الإجمالي" أو "i" والتي قد تنتمي إلى أي وظيفة أخرى. وبعبارة أخرى ، لا يوجد خطر اصطدام اسم بين هذه المعرفات وأية معرّفات لا علاقة لها ، حتى لو كانت متطابقة.

لاحظ أيضًا أنه لا يتم إخفاء أي اسم: لا يوجد سوى متغير واحد اسمه n في السياق في أي وقت ، نظرًا لعدم تداخل النطاقات. على النقيض من ذلك ، كانت هناك قطعة مماثلة مكتوبة بلغة ذات نطاق ديناميكي ، فإن n في وظيفة الاستدعاء ستبقى في السياق في الدالة المطلوبة - ستتداخل النطاقات - وتكون ملثمة ("مظللة") بواسطة n الجديدة في وظيفة تسمى.

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

Source: wikipedia.org
 
(4)
On The Job

On The Job