مهمة مُعززة

يُطلق مصطلح "التخصيص المُعزز" (أو "التخصيص المُركب ") على بعض عوامل التخصيص في لغات برمجة مُعينة (خاصةً تلك المُشتقة من لغة C ). يُستخدم التخصيص المُعزز عادةً لاستبدال عبارة تأخذ فيها العامل متغيرًا كأحد وسائطها، ثم تُسند النتيجة إلى نفس المتغير. مثال بسيط على ذلك هو `______` ، والذي يُوسّع إلى `______` . تتوفر تركيبات مُشابهة للعديد من عوامل التشغيل الثنائية.x += 1x = x + 1

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

مناقشة

على سبيل المثال، يمكن العثور على العبارة التالية أو بعض الاختلافات عنها في العديد من البرامج:

س = س + 1

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

x += 1

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

تحميل x أضف 1 المتجر x

وسيتم توليد نفس الكود لكلا النموذجين. ولكن إذا كان هناك كود عملية خاص، فقد يكون

MDM x,1

يعني ذلك "تعديل الذاكرة" بإضافة 1 إلى x، وسيقوم المترجم المُحسِّن بتوليد نفس الكود لكلا الشكلين. بعض أكواد الآلة تُتيح عمليات INC وDEC (لإضافة أو طرح واحد)، بينما قد تسمح أكواد أخرى بثوابت أخرى غير الواحد.

وبشكل أعم، فإن الشكل هو

x ؟ = تعبير

حيث يرمز الرمز ؟ إلى عامل ما (ليس بالضرورة + )، وقد لا توجد رموز عمليات خاصة للمساعدة. يبقى احتمال أن يُشجع المُترجم على تجنب التكرار عند الوصول إلى x إذا كان كيانًا معقدًا ، وبالطبع، إذا كان x اسمًا طويلًا، فسيقلّ عدد مرات الكتابة المطلوبة. كان هذا الأخير أساس الميزة المشابهة في مُترجمات ALGOL المُقدمة عبر أنظمة Burroughs B6700 ، باستخدام رمز التلدة (~ ) للدلالة على المتغير الذي يتم إسناده إليه، بحيث

LongName := x + sqrt ( LongName ) * 7 ;

سيصبح

LongName := x + sqrt ( ~ ) * 7 ;

وهكذا دواليك. هذا أكثر عمومية من مجرد x:=~ + 1;أن إنتاج الكود الأمثل سيظل من اختصاص المترجم.

علم الدلالة

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

أ += ب += ج

كما هو الحال مع التخصيص، فإن التخصيص المعزز في هذه اللغات هو شكل من أشكال التخصيص الترابطي الأيمن .

على عكس لغة C، فإن تعبيرات الإسناد المركبة في لغة C++ تُقيّم إلى قيمة قابلة للقراءة (lvalue) . [ 1 ] كونها قيمة قابلة للقراءة يسمح بكتابتها على الجانب الأيسر من عبارة إسناد أخرى: [ 2 ]

int x = 11 ; ( x *= 2 ) += 3 ; // تعيين قيمة x إلى 25

مواقع التعيين المحسوبة

في لغات مثل C و C++ و Python، يُشترط في عملية الإسناد المُعزز، التي يتضمن موقع الإسناد فيها استدعاءات دوال، استدعاء الدوال مرة واحدة فقط. أي في العبارة:

my_array [ f1 ()] += 1

f1يُشترط استدعاء هذه الوظيفة مرة واحدة فقط.

إذا كانت لغة البرمجة تُطبّق عملية الإسناد المُعزّز عن طريق توسيع الماكرو إلى:

my_array [ f1 ()] = my_array [ f1 ()] + 1

ثم f1يتم استدعاؤه مرتين.

حسب اللغة

أحفاد سي

في لغات البرمجة C و C++ و C# ، يكون عامل التعيين هو =، والذي يتم توسيعه على النحو التالي:

المشغلوصف
+=إضافة
-=الطرح
*=الضرب
/=قسم
%=معامل
<<=إزاحة البتات اليسرى
>>=إزاحة البتات إلى اليمين
&=عملية AND الثنائية
^=عملية أو الحصرية الثنائية
|=أو الشاملة على مستوى البت

يُطلق على كلٍّ من هذه العوامل اسم عامل التخصيص المركب في تلك اللغات. [ 1 ] [ 3 ] [ 4 ] [ 5 ]

اللغات المدعومة

القائمة التالية، على الرغم من أنها ليست كاملة أو شاملة، إلا أنها تسرد بعض لغات البرمجة الرئيسية التي تدعم عوامل التعيين المعززة.

انظر أيضاً

مراجع

  1. 1 2 "عوامل التخصيص" . cppreference.com . مرجع لغة C++ . تم الاطلاع عليه في 1 مارس 2021 .
  2. ستروستروب، بيارن (2013). لغة البرمجة سي++ ( الطبعة الرابعة). أديسون-ويسلي. ISBN  978-0-321-56384-2.
  3. "ISO/IEC 9899:201x مسودة اللجنة 12 أبريل 2011 N1570" .
  4. "عوامل التعيين والتعيين المركب" .
  5. "مواصفات لغة C#" . مايكروسوفت . تم الاطلاع عليه بتاريخ 17 مارس 2014 .