مشغل (برمجة حاسوبية)
في برمجة الحاسوب ، يُعدّ المُعامل بنيةً لغويةً تُوفّر وظائف قد لا يُمكن تعريفها كدالة مُعرّفة من قِبل المستخدم (مثل sizeof في لغة C )، أو قد يكون لها صيغة مختلفة عن صيغة الدالة (مثل الجمع الوسطيa+b ). وكغيره من مفاهيم لغات البرمجة، فإنّ للمُعامل معنىً مُتفقًا عليه عمومًا، وإن كان محلّ نقاش، بين المُبرمجين.
تُستخدم الرموز لتمثيل بعض المعاملات - وهي أحرف لا يُسمح بها عادةً في مُعرّفات الدوال - وذلك لجعل عرض الكود أكثر شيوعًا من صيغة الدوال التقليدية. على سبيل المثال، يمكن تسمية دالة تختبر ما إذا كانت القيمة أكبر من أو تساوي صفرًا gt، ولكن العديد من لغات البرمجة توفر معاملًا رمزيًا وسطيًا لجعل الكود يبدو أكثر وضوحًا. على سبيل المثال:
if gt(x, y) then return
يمكن أن يكون:
if x > y then return
تسمح بعض اللغات بتجاوز عامل التشغيل المحدد في اللغة بسلوك محدد من قبل المستخدم، وتسمح بعضها برموز عوامل التشغيل المحددة من قبل المستخدم.
قد تختلف المعاملات أيضًا عن الدوال من الناحية الدلالية. على سبيل المثال، لا تُقيّم عمليات الاختصار المنطقي الوسائط اللاحقة إلا إذا لم تكن الوسائط السابقة خاطئة.
الاختلافات عن الوظائف
بناء الجملة
تختلف العديد من المعاملات نحويًا عن الدوال المعرفة من قبل المستخدم. في معظم لغات البرمجة، تُكتب الدالة باستخدام صيغة البادئة مع مستوى أسبقية وترابط ثابتين، وغالبًا ما تتضمن أقواسًا إلزامية (مثل " Func(a)أو " (Func a)في لغة ليسب ). في المقابل، تُكتب العديد من المعاملات باستخدام صيغة الوسط، وتتضمن استخدامًا مختلفًا للفواصل مثل الأقواس.
بشكل عام، قد يكون المعامل بادئًا، أو وسطيًا، أو لاحقًا، أو مطابقًا ، أو محيطيًا، أو ثنائيًا، [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] ، ويعتمد بناء جملة التعبير الذي يتضمن معاملًا على عدد معاملاته ، وأسبقيته ، و(إن وُجد) ترابطيته . تدعم معظم لغات البرمجة المعاملات الثنائية وعددًا قليلًا من المعاملات الأحادية ، مع دعم بعضها لعدد أكبر من المعاملات، مثل المعامل ?: في لغة C، وهو معامل ثلاثي. توجد معاملات أحادية بادئة، مثل الطرح الأحادي ، ومعاملات أحادية لاحقة، مثل الزيادة اللاحقة ؛ والعمليات الثنائية وسطية، مثل أو . تتطلب العمليات الوسطية ذات العدد الأكبر من المعاملات رموزًا إضافية، مثل المعامل الثلاثي ?: في لغة C، والذي يُكتب على النحو التالي: - في الواقع، نظرًا لأن هذا هو المثال الشائع الوحيد، فإنه يُشار إليه غالبًا باسم المعامل الثلاثي. يمكن لعمليات البادئة واللاحقة دعم أي عدد من المعاملات المطلوبة، مثل .-xx++x + yx = y a ? b : c1 2 3 4 +
علم الدلالة
قد تختلف دلالات المعامل اختلافًا كبيرًا عن دلالات الدالة العادية. على سبيل المثال، تُقيّم عملية الجمع كما تُقيّم الدالة العادية. فمثلاً، x + yيمكن أن تكون عملية الجمع مكافئة للدالة add(x, y)من حيث تقييم الوسائط ثم تطبيق سلوك الدالة. مع ذلك، يختلف الإسنادa = b . فمثلاً، عند إعطاء قيمة للهدف ، aلا تُقيّم هذه القيمة، بل تُستبدل قيمتها بقيمة الهدف b. تعمل معاملات تحديد النطاق والوصول إلى العناصر (كما في ` resource` Foo::Barو` a.bresource` على التوالي، في حالة لغة C++ مثلاً ) على أسماء المعرفات، وليس على القيم.
في لغة C، على سبيل المثال، يمكن استخدام عامل فهرسة المصفوفات للقراءة والتخصيص. في المثال التالي، يقرأ عامل الزيادة قيمة عنصر من مصفوفة ثم يُسندها إلى قيمة العنصر.
++ a [ i ];تتيح خاصية المعاملات في لغة C++ استخدام بنية سلسة من خلال دعم سلسلة من المعاملات التي تؤثر على وسيط واحد. على سبيل المثال:<<
cout << "Hello" << " " << "world!" << endl ;متعدد الأشكال المخصص
توفر بعض اللغات عوامل تشغيل متعددة الأشكال مخصصة - أي أنها محملة بشكل زائد بطبيعتها. على سبيل المثال، في لغة جافا، يقوم عامل +التشغيل بجمع الأرقام أو دمج السلاسل النصية .
التخصيص
تدعم بعض لغات البرمجة خاصية التحميل الزائد المُعرّف من قِبل المستخدم (مثل C++ و Fortran ). يمكن تحميل عامل مُعرّف في اللغة بشكل زائد ليتصرف بشكل مختلف بناءً على نوع المُدخلات.
تُعرّف بعض لغات البرمجة (مثل C وC++ و PHP ) مجموعة ثابتة من المعاملات، بينما تسمح لغات أخرى (مثل Prolog وF# وOCaml وHaskell) بمعاملات يُعرّفها المستخدم. وتقتصر بعض لغات البرمجة على استخدام رموز المعاملات بأحرف خاصة مثل + أو : = ، بينما تسمح لغات أخرى باستخدام أسماء مثل ( مثل Pascal ) ، وحتى أسماء عشوائية (مثل Fortran حيث يُحاط اسم المعامل الذي يصل طوله إلى 31 حرفًا بنقطتين ) .div
لا تدعم معظم لغات البرمجة عوامل التشغيل المُعرَّفة من قِبل المستخدم، لأن هذه الميزة تُعقِّد عملية التحليل بشكل كبير. يُغيِّر إدخال عامل تشغيل جديد عدد المعاملات وأسبقيتها في اللغة، مما يؤثر على التحليل المعجمي على مستوى العبارة . غالبًا ما تجعل عوامل التشغيل المُخصَّصة، لا سيما عند تعريفها أثناء التشغيل، التحليل الثابت الصحيح للبرنامج مستحيلاً، لأن بنية اللغة قد تكون كاملة تورينج، وبالتالي قد يتطلب بناء شجرة البنية حل مشكلة التوقف، وهو أمر مستحيل. يحدث هذا في لغة بيرل ، على سبيل المثال، وبعض لهجات لغة ليسب .
إذا سمحت لغة ما بتعريف عوامل تشغيل جديدة، فقد تتضمن آليات القيام بذلك البرمجة الوصفية - تحديد عامل التشغيل بلغة منفصلة.
إكراه الفاعل
تقوم بعض لغات البرمجة بتحويل المعاملات ضمنيًا (أو ما يُعرف بالتحويل القسري ) لجعلها متوافقة. على سبيل المثال، في لغة بيرل ، تُحوّل القيمة النصية إلى 3.14 قبل إجراء عملية الجمع. علاوة على ذلك، تُعامل القيمة النصية كعدد عشري، لذا تكون النتيجة عددًا عشريًا حتى وإن كانت القيمة النصية عددًا صحيحًا. أما في جافا سكريبت، فتُحوّل القيمة النصية إلى 3.14، حيث تُحوّل القيمة النصية إلى سلسلة نصية ثم تُدمج مع المعامل الثاني.12 + "3.14"15.14"3.14"3.1412"123.14"12
بشكل عام، يجب أن يكون المبرمج على دراية بالقواعد المحددة المتعلقة بإجبار المعاملات لتجنب السلوك غير المتوقع وغير الصحيح.
أمثلة
- المؤثرات الرياضية
- الحساب : مثل الجمع،
a + b - العلاقات : مثل أكبر من ،
a > b - المنطق : مثل أو
a AND ba && b - مهمة : مثل أو
a = ba := b - مقارنة ثلاثية (أو ما يُعرف بالمركبة الفضائية):
x <=> y
- عوامل بنية البرنامج
- الوصول إلى حقول السجلات أو الكائنات : مثل
a.b - دقة النطاق : مثل أو
a::ba.b
- عوامل التشغيل الشرطية
- الشرط الثلاثي :
condition ? a : b - إلفيس :
x ?: y - اندماج الصفر :
x ?? y
- عوامل التشغيل البارزة في لغتي C و C++
- عنوان المشغل:
&x - إلغاء الإحالة :
*p - فاصلة :
e, f
- مشغلو المركبات
- التعيين المركب (المعروف أيضًا بالتعيين المعزز) في لغة C/C++:
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|= - مُدمجة : مثل cis x = cos x + i sin x
ميزات المشغل في لغات البرمجة
يوضح الجدول التالي خصائص المعامل في العديد من لغات البرمجة:
| لغة | المؤثرات الرمزية | المعاملات الأبجدية الرقمية | بادئة | أقحم | بوستفيكس | أسبقية | الترابط | التحميل الزائد | التحميل الزائد المحدد من قبل المستخدم | الرموز التي يحددها المستخدم |
|---|---|---|---|---|---|---|---|---|---|---|
| في لغة ALGOL 68، لكل عامل رمزي مكافئ أبجدي رقمي، وبعضها مكافئ غير ASCII | +* ** * / % %* %× - + < <= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:غير ASCII: | not abs arg bin entier leng level odd repr round shorten i shl shr up down lwb upb lt le ge gt eq ne and or over mod elem minusab plusab timesab divab overab modab plusto is isnt | نعم | نعم | لا | نعم (معاملات البادئة لها الأولوية 10 دائمًا) | المعاملات الوسطية ذات تجميع يساري، والمعاملات البادئة ذات تجميع يميني. | نعم | نعم | نعم |
| APL | + - × ÷ ⌈ ⌊ * ⍟ | ! ○ ~ ∨ ∧ ⍱ ⍲ < ≤ = ≥ > ≠ . @ ≡ ≢ ⍴ , ⍪ ⍳ ↑ ↓ ? ⍒ ⍋ ⍉ ⌽ ⊖ ∊ ⊥ ⊤ ⍎ ⍕ ⌹ ⊂ ⊃ ∪ ∩ ⍷ ⌷ ∘ → ← / ⌿ \ ⍀ ¨ ⍣ & ⍨ ⌶ ⊆ ⊣ ⊢ ⍠ ⍤ ⌸ ⌺ ⍸ | (يتطلب بادئة ⎕) | نعم (للدوال من الدرجة الأولى فقط) | نعم | نعم (للدوال ذات الرتبة العليا فقط) | الدوال ذات الرتبة الأعلى تسبق الدوال ذات الرتبة الأولى | الدوال ذات الرتبة العليا تكون تجميعية من اليسار، بينما الدوال ذات الرتبة الأولى تكون تجميعية من اليمين. | نعم | نعم | نعم (للأحرف والأرقام فقط) |
| ب | () [] ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | ?: = =+ =- =* =/ =% =& =^ =| =<< =>> === =|= =< => =<= =>=[ 8 ] [ 9 ] | نعم | نعم | نعم | نعم | نعم | لا | لا | لا | |
| ج | () [] -> . ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= | sizeof | نعم | نعم | نعم | نعم | نعم | نعم | لا | لا |
| لغة سي++ | (نفس الشيء بالنسبة لـ ج) | (نفس الشيء بالنسبة لـ C+)typeidnewdeletethrowdecltypestatic_castdynamic castreinterpret_castconst_cast | نعم | نعم | نعم | نعم | نعم | نعم | نعم | لا |
| سي شارب | (نفس الشيء بالنسبة لـ C+)?. ?[] ????= | sizeof nameof new stackalloc await throw checked unchecked is as delegate default true falseرابط : from select where group...by group...by...into join...in...on...equals join...in...on...equals...into orderby orderby...descendingروزلين فقط:__makeref __refvalue __reftype | نعم | نعم | نعم | نعم | نعم | نعم | نعم | لا |
| جافا | (نفس الشيء بالنسبة لـ ج) | newthrowinstanceof | نعم | نعم | نعم | نعم | نعم | نعم | لا | لا |
| إيفل | [] + - * / // = /= | not and or implies "and then" "or else" | نعم | نعم | لا | نعم | نعم | لا | نعم | نعم |
| هاسكل | + - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! :(وغيرها الكثير) | (يجب وضع اسم الدالة بين علامتي اقتباس معكوسة) | نعم | نعم | لا | نعم | نعم | نعم، باستخدام فئات النوع | نعم | |
| mvBasic Databasic/Unibasic | + - * / ^ ** : = ! & [] += -= := # < > <= >= <> >< =< #> => #< | AND OR NOT EQ NE LT GT LE GE MATCH ADDS() ANDS() CATS() DIVS() EQS() GES() GTS() IFS() | نعم | نعم | نعم | نعم | نعم | نعم | نعم | لا |
| باسكال | * / + - = < > <> <= >= := | notdivmodandor in | نعم | نعم | لا | نعم | نعم | نعم | لا | لا |
| بيرل | -> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ &&|| ' ''// .. ... ?: = += -= *= , => | print sort chmod chdir rand and or not xor lt gt le ge eq ne cmp x | نعم | نعم | نعم | نعم | نعم | نعم | نعم | لا |
| PHP | [] ** ++ -- ~ @![10] * / % + - . << >> < <= > >= == != === !== <> <=> & ^ | && ||???: = += -= *= **= /= .= %= &= |= ^= <<= >>= | clone new unset print echo isset instanceofandorxor | نعم | نعم | نعم | نعم | نعم | لا | لا | لا |
| PL/I | ( ) -> + - * / ** > ¬> >= = ¬= <= < ¬< ¬ &||| | نعم | نعم | لا | نعم | نعم | لا | لا | لا | |
| مقدمة | :- ?- ; , . =.. = \= < =< >= > == \== - + / * | spy nospy not is mod | نعم | نعم | نعم | نعم | نعم | لا | لا | نعم |
| راكو | ++ -- ** ! ~ ~~ * / + - . < > <= >= == != <=> & | ^ &&|| //[ 11 ] | print sort chmod chdir rand and or not xor lt gt le ge eq ne leg cmp x xx | نعم | نعم | نعم | نعم | نعم | نعم | نعم | نعم [ 12 ] |
| الصدأ | () [] . ! + - * & ? / % << >> < <= > >= == != ^ | && || .. ..= = += -= *= /= %= &= ^= |= <<= >>=[ 13 ] | &mut&raw const&raw mutas[ 13 ] | نعم | نعم | نعم | نعم | نعم | نعم | نعم | لا |
| أحاديث قصيرة | (حتى حرفين [ 14 ] ) | (تحتاج الرموز الأبجدية الرقمية إلى لاحقة نقطتين رأسيتين) | لا | نعم | نعم | لا | لا | نعم | نعم | نعم |
| سويفت | (أي سلسلة رموز يونيكود باستثناء) .(بما في ذلك)! ~ + - * / % =+ =- =* =/ =% &+ &- &* =&+ =&- =&* && || << >> & | ^ == != < <= > >= ?? ... ..< | is as as? | نعم | نعم | نعم | نعم (يُعرَّف بأنه ترتيب جزئي في مجموعات الأسبقية) | نعم (معرّفة كجزء من مجموعات الأسبقية) | نعم | نعم | نعم |
| فيجوال بيسك دوت نت | () . ! ?() ?. ?! + - * / \ & << >> < <= > >= ^ <> = += -= *= /= \= &= ^= <<= >>= | New Await Mod Like Is IsNot Not And AndAlso Or OrElse Xor If(...,...) If(...,...,...) GetXmlNamespace(...) GetType(...) NameOf(...) TypeOf...Is TypeOf...IsNot DirectCast(...,...) TryCast(...,...) رابط :From Aggregate...Into Select Distinct Where <Order By>...[Ascending|Descending] Take <Take While> Skip <Skip While> Let Group...By...Into Join...On <Group Join...On...Into> | نعم | نعم | نعم | نعم | نعم | نعم | نعم | لا |
| زيج | () [] {} . ! ~ + +% +| - -% -| * *% *| & / % << <<| >> < <= > >= == != ^ | ++ ** .* .? = += +%= +|= -= -%= -|= *= *%= *|= /= %= &= ^= |= <<= <<|= >>=[ 15 ] | and or orelse catch[ 15 ] | نعم | نعم | نعم | نعم | نعم | نعم | لا | لا |
انظر أيضاً
مراجع
- ↑ "نماذج إدخال المشغل - وثائق لغة Wolfram" . reference.wolfram.com .
- ↑ "دليل ماكسيما 5.42.0: 7. المشغلون" . maxima.sourceforge.net .
- ↑ "معاملات البادئة واللاحقة والمحيطة" . mythryl.org .
- ↑ "المعاملات" . doc.perl6.org .
- ↑ بريبافكينا، إيلينا ف.؛ رودارو، إيمانويل (2010). "تعقيد حالة عوامل البادئة واللاحقة والثنائية والوسطية في اللغات المنتظمة". تطورات في نظرية اللغة . سلسلة محاضرات في علوم الحاسوب. المجلد 6224. الصفحات 376-386 . doi : 10.1007/978-3-642-14455-4_34 . ISBN 978-3-642-14454-7.
- ^ "SWI-Prolog -- المرجع / 3" . www.swi-prolog.org .
- ↑ "العمليات المحددة" . إنتل . تم الاطلاع عليه بتاريخ 6 مايو 2025 .
- ↑ "مقدمة تعليمية للغة ب" . مؤرشف من الأصل بتاريخ 2017-04-03 . تم الاطلاع عليه بتاريخ 2024-08-03 .
- ↑ "دليل تومسون B" . www.bell-labs.com . مؤرشف من الأصل بتاريخ 17-09-2024 . تم الاطلاع عليه بتاريخ 04-02-2026 .
- ↑ "PHP: عوامل التحكم في الأخطاء - دليل المستخدم" . php.net .
- ↑ "المعاملات" . docs.perl6.org .
- ↑ "الدوال" . docs.perl6.org .
- 1 2 "تعبيرات المعاملات - مرجع Rust" . doc.rust-lang.org . تم الاسترجاع في 2026-02-04 .
- ↑ غولدبيرغ، أديل؛ روبسون، ديفيد (1983). سمول توك-80: اللغة وتطبيقها (ملف PDF) . ريدينغ، ماساتشوستس: أديسون-ويسلي. ISBN 0-201-11371-6.
- 1 2 "التوثيق - لغة برمجة Zig" . ziglang.org . تم الاطلاع عليه بتاريخ 2026-02-05 .
- المشغلون (البرمجة)
- بنى البرمجة
