التسمية المستعارة (الحوسبة)

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

المؤشرات المستعارة

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

التسمية المستعارة المحددة

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

my @array = ( 1 , 2 , 3 );foreach my $element ( @array ) { # زيادة قيمة $element، وبالتالي تعديل @array تلقائيًا # لأن $element مرتبط # بكل عنصر من عناصر @array بدوره. $element ++ ; }print "@array \n" ;

سيطبع الناتج "2 3 4". إذا أراد المرء تجاوز تأثيرات التداخل، فيمكنه نسخ محتويات متغير الفهرس إلى متغير آخر وتغيير النسخة.

تعارضات مع التحسين

غالبًا ما يضطر مُحسِّنو الأداء إلى وضع افتراضات متحفظة بشأن المتغيرات عندما يكون التداخل بين المتغيرات ممكنًا. على سبيل المثال، معرفة قيمة متغير ما (مثل x5) تسمح عادةً بإجراء بعض التحسينات (مثل نشر الثوابت ). مع ذلك، لا يمكن للمُصرِّف استخدام هذه المعلومة بعد إسناد قيمة إلى متغير آخر (على سبيل المثال، في لغة C، *y = 10)، لأنه قد يكون *yاسمًا بديلًا لـ x. قد يحدث هذا بعد إسناد قيمة إلى y = &x. نتيجةً لهذا الإسناد إلى ، ستتغير *yقيمة أيضًا، لذا فإن نشر المعلومة بأن 5 إلى العبارات التالية قد يكون خاطئًا (إذا كان اسمًا بديلًا لـ ). مع ذلك، إذا كانت هناك معلومات حول المؤشرات، فيمكن لعملية نشر الثوابت إجراء استعلام مثل: هل يمكن أن يكون اسمًا بديلًا لـ ؟ ثم، إذا كانت الإجابة لا، فيمكن نشر بأمان.xx*y = 10*yxx*yx = 5

من التحسينات الأخرى التي تتأثر بالأسماء المستعارة إعادة ترتيب التعليمات البرمجية. إذا قرر المترجم أن ` xis` غير مستعار بواسطة `is` *y، فيمكن نقل التعليمات البرمجية التي تستخدم `is` أو تغير قيمتها xقبل عملية الإسناد *y = 10، إذا كان ذلك سيحسن الجدولة أو يسمح بإجراء المزيد من تحسينات الحلقات .

لتمكين هذه التحسينات بطريقة قابلة للتنبؤ، ينص معيار ISO للغة البرمجة C (بما في ذلك إصدار C99 الأحدث ، انظر القسم 6.5، الفقرة 7) على أنه من غير القانوني (مع بعض الاستثناءات) الوصول إلى نفس موقع الذاكرة باستخدام مؤشرات من أنواع مختلفة. لذلك، قد يفترض المترجم أن هذه المؤشرات لا تُسبب تداخلًا. هذه القاعدة، المعروفة بقاعدة التداخل الصارم ، تسمح أحيانًا بزيادات ملحوظة في الأداء، [ 1 ] ولكنها قد تُسبب أعطالًا في بعض التعليمات البرمجية الصحيحة. تتعمد العديد من مشاريع البرمجيات انتهاك هذا الجزء من معيار C99. على سبيل المثال، فعلت Python 2.x ذلك لتنفيذ عد المراجع ، [ 2 ] وتطلبت تغييرات في هياكل الكائنات الأساسية في Python 3 لتمكين هذا التحسين. تفعل نواة Linux ذلك لأن التداخل الصارم يُسبب مشاكل في تحسين التعليمات البرمجية المضمنة. [ 3 ] في مثل هذه الحالات، عند التجميع باستخدام gcc ، يتم استدعاء الخيار -fno-strict-aliasingلمنع التحسينات غير المرغوب فيها التي قد تُنتج تعليمات برمجية غير متوقعة.

التداخل في الأجهزة

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

مثال

في هذا المثال، بافتراض تصميم ذاكرة بثمانية مواقع، يتطلب الأمر ثلاثة خطوط عناوين فقط (أو بتات ، لأن 2 ^3 = 8). يتم فك تشفير بتات العناوين (المسماة من A2 إلى A0) لاختيار مواقع ذاكرة فريدة كما يلي، وفقًا لطريقة العداد الثنائي القياسية :

A2A1A0موقع الذاكرة
0000
0011
0102
0113
1004
1015
1106
1117

في الجدول أعلاه، يحدد كلٌّ من التوليفات الثمانية الفريدة لبتات العنوان موقعًا مختلفًا في الذاكرة. مع ذلك، إذا تم توصيل بت عنوان واحد (مثلاً A2) بالأرض، فسيتم تعديل الجدول كما يلي:

A2A1A0موقع الذاكرة
0000
0011
0102
0113
0000
0011
0102
0113

في هذه الحالة، وبما أن قيمة A2 تساوي صفرًا دائمًا، فإن أول أربعة مواقع في الذاكرة تتكرر وتظهر مرة أخرى كالأربعة الثانية. أما مواقع الذاكرة من 4 إلى 7 فقد أصبحت غير قابلة للوصول.

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

انظر أيضاً

مراجع