سكر تركيبي

مثال برمجي على اختصار التصريح في لغة البرمجة Go

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

على سبيل المثال، في لغة برمجة بايثون، يُمكن الحصول على عنصر من قائمة عند فهرس مُحدد باستخدام الصيغة `<list>` list_variable.__getitem__(index)، ولكن غالبًا ما يتم اختصارها إلى `<list>` list_variable[index]، والتي تُعتبر أبسط وأسهل قراءةً، على الرغم من تطابق سلوكها. وبالمثل، list_variable.__setitem__(index, value)غالبًا ما يتم اختصار `<list>` إلى `<list>` list_variable[index] = value.

إن البنية في اللغة هي بمثابة سكر نحوي إذا كان من الممكن إزالتها من اللغة دون أي تأثير على ما يمكن أن تفعله اللغة: ستبقى الوظائف والقدرة التعبيرية كما هي.

تقوم معالجات اللغة، بما في ذلك المترجمات والمحللات الثابتة ، غالبًا بتوسيع البنى المختصرة إلى مكافئاتها الأكثر تفصيلاً قبل المعالجة، وهي عملية تسمى أحيانًا "إزالة الاختصار".

الأصول

صاغ بيتر جيه لاندين مصطلح السكر النحوي في عام 1964 لوصف التركيب السطحي للغة برمجة بسيطة تشبه لغة ALGOL والتي تم تعريفها دلاليًا من حيث التعبيرات التطبيقية لحساب لامدا ، [ 1 ] [ 2 ] تتمحور حول استبدال λ بـ "where" معجميًا.

في لغات البرمجة اللاحقة، مثل CLU و ML و Scheme ، تم توسيع المصطلح ليشمل بنية اللغة التي يمكن تعريفها من خلال مجموعة أساسية من البنى اللغوية؛ حيث يمكن تبسيط الميزات ذات المستوى الأعلى وتفكيكها إلى تلك المجموعة الفرعية. [ 3 ] وهذا، في الواقع، هو الممارسة الرياضية المعتادة المتمثلة في البناء من العناصر الأولية.

استنادًا إلى تمييز لاندين بين البنى اللغوية الأساسية والتحسينات النحوية، اقترح ماتياس فيليسين في عام 1991 تقنينًا لمفهوم "القدرة التعبيرية" بما يتماشى مع "المعتقدات الشائعة" في الأدبيات. وقد عرّف "الأكثر تعبيرًا" بأنه يعني أنه بدون البنى اللغوية المعنية، سيتعين إعادة تنظيم البرنامج بالكامل. [ 4 ]

أمثلة بارزة

  • في لغة كوبول ، تُعدّ العديد من الكلمات المفتاحية الوسيطة اختصارات نحوية يمكن حذفها اختيارياً. على سبيل المثال، تؤدي الجملة الأولى MOVE A B.والجملة الثانية MOVE A TO B.الوظيفة نفسها تماماً، لكن الثانية تجعل الإجراء المطلوب تنفيذه أكثر وضوحاً.
  • في لغة بيرل ، يُعدّ اختصارًا نحويًا لـ . بالإضافة إلى ذلك، يمكن أن يتبع أي عبارة شرط، لذا فإنّ يُعادل ، لكنّ الأول يُنسّق بشكل أكثر طبيعية على سطر واحد.unless(condition){...}if(notcondition){...}statementifconditionif(condition){...}
  • في لغة C ، فإن a[i]الترميز هو اختصار نحوي لـ *(a + i). [ 5 ] وبالمثل، a->xفإن الترميز هو اختصار نحوي للوصول إلى الأعضاء باستخدام عامل فك المرجع(*a).x .
  • تضمن هذه usingالعبارة في لغة C# التخلص من بعض الكائنات بشكل صحيح. يقوم المترجم بتوسيع العبارة إلى كتلة try-finally . [ 6 ]
  • تسمح لغتا C++ و C من C23auto x = expr فصاعدًا باستخدام اختصار لـ decltype(expr) x = exprin C++ أو typeof(expr) x = exprin C.
  • فهم القوائم في بايثون (مثل قائمة المربعات) والزخارف (مثل ).[x*xforxinrange(10)]@staticmethod
  • في لغة هاسكل ، تُعتبر السلسلة النصية، المُشار إليها بعلامات اقتباس، مُكافئة دلاليًا لقائمة من الأحرف. كما يسمح امتداد اللغة الاختياري OverloadedStrings للسلاسل النصية بإنتاج أنواع أخرى من القيم، مثل Text.
  • في مجموعة حزم tidyverse للغة R ، يُشير الرمز `pipe` ، المُشار إليه بـ %>%`pipe`، إلى أن البيانات (أو مُخرجات الدالة) التي تسبق `pipe` ستكون بمثابة الوسيط الأول للدالة التي تليها. [ 7 ] لذا، فإن `pipe` يُكافئ ` pipe` .x %>% f(y)f(x,y)
  • في لغة SQLJOIN ، يُعادل استخدام `mere` استخدام `an` INNER JOIN، حيث يُوضح الأخير أن عبارة الربط هي عملية ربط داخلي وليست عملية ربط خارجي. وبالمثل، يمكن حذف `ar` OUTERمن LEFT OUTER JOIN` and` RIGHT OUTER JOINو`orter` FULL OUTER JOIN.
  • تُعدّ طريقة الإضافة في لغات البرمجة الكائنية (OOP) اختصارًا myObject.myMethod(parameter1, parameter2, parameter3)برمجيًا لاستدعاء دالة عامة . ويتم تمرير مرجع الكائن كوسيط مخفي، ويمكن الوصول إليه عادةً من داخل الطريقة .myMethod(myObject, parameter1, parameter2, parameter3)this
  • إن استدعاء المعلمة عن طريق المرجع هو اختصار نحوي لتمرير مؤشر كمعلمة من الناحية الفنية، ولكن التعامل معه نحويًا كمتغير بحد ذاته، لتجنب إلغاء مرجعية المؤشر الثابت في الكود داخل الدالة.
  • توفر لغات البرمجة المختلفة عبارات الاستيراد للسماح بإضافة الرموز من مساحة اسم أخرى إلى النطاق الحالي.
    • في لغة C++، usingتعتبر العبارة مثالاً على استيراد رمز واحد إلى النطاق، بينما using namespaceيقوم نطاق الاسم باستيراد جميع الرموز من نطاق الاسم هذا إلى النطاق.
    • في لغة C#، usingتضيف عبارة جميع الرموز من مساحة اسم إلى النطاق.
    • في لغة جافا ، importيُعدّ `<Swing>` مثالاً على ذلك. على سبيل المثال، import javax.swing.*;يسمح `<Swing>` للمبرمج بالإشارة إلى كائن Swing باستخدام javax.swing.JButtonاسمه فقط JButton.
    • في لغة بايثون ، from importتقوم عبارة `import` باستيراد رمز واحد إلى النطاق، بينما from import *تقوم عبارة `import` باستيراد جميع الرموز من مساحة الاسم تلك إلى النطاق.
    • في لغة Rust ، useيتم استخدام عبارة لاستيراد الرموز إلى النطاق.
  • في جافا سكريبت ، إذا كان المفتاح والقيمة متطابقين في كائن ما، يمكنك كتابتهما مرة واحدة فقط. على سبيل المثال، `key` {name: name}يكافئ ` value` {name}. يُطلق على هذا اسم خاصية الاختصار.
    • في إصدار ES6 من جافا سكريبت ، تحتوي الدوال السهمية على شكل مختصر (x) => x + 1، وهو ما يعادل الشكل الأطول .(x)=>{returnx+1;}
  • في لغة سكالا??? ، تُعادل علامات الاستفهام الثلاثية ( ) ما يلي . وهذا مفيد لتحديد مكان لكتابة كود لم يُكتب بعد. [ 8 ]thrownewscala.NotImplementedError("an implementation is missing")

نقد

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

المصطلحات المشتقة

الملح التركيبي

تم توسيع هذا المفهوم المجازي ليشمل مصطلح " الملح النحوي" ، الذي يشير إلى ميزة مصممة لجعل كتابة التعليمات البرمجية الرديئة أكثر صعوبة. [ 11 ] وبالتحديد، يُعد الملح النحوي عائقًا يجب على المبرمجين تجاوزه لإثبات فهمهم لما يجري، بدلاً من استخدامه للتعبير عن إجراء برمجي.

في لغة C# ، عند إخفاء عضو من فئة موروثة، يُصدر المُصرّف تحذيرًا ما لم newتُستخدم الكلمة المفتاحية `switch` لتحديد أن الإخفاء مقصود. [ 12 ] لتجنب الأخطاء المحتملة الناتجة عن تشابه صيغة عبارة `switch` مع لغتي C أو C++، تتطلب C# استخدام `switch` breakلكل caseتسمية غير فارغة في `switch` switch(إلا إذا استُخدمت goto`switch` أو `switch` returnأو ` throwswitch`)، على الرغم من أنها لا تسمح بالانتقال الضمني . [ 13 ] (يؤدي استخدام `switch` وتحديد التسمية اللاحقة إلى انتقال مشابه لانتقالgoto C/C++ ).

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

يتمثل البديل عن الملح النحوي في توليد تحذيرات المترجم عندما يكون هناك احتمال كبير أن يكون الكود نتيجة خطأ  - وهي ممارسة شائعة في مترجمات C/C++ الحديثة.

السكرين التركيبي

ومن الإضافات الأخرى "السكرين النحوي " و " الشراب النحوي" ، أي التركيب النحوي غير الضروري الذي لا يُسهّل البرمجة بأي شكل من الأشكال. [ 14 ] [ 15 ] [ 16 ] [ 17 ]

أنواع مُحلاة

تُسمى أنواع البيانات التي تتمتع بدعم نحوي أساسي "أنواعًا مُحسّنة". [ 18 ] [ 19 ] [ 20 ] تشمل الأمثلة الشائعة السلاسل النصية المفصولة بعلامات اقتباس، والأقواس المعقوفة لأنواع الكائنات والسجلات، والأقواس المربعة للمصفوفات.

ملحوظات

  1. لاندين، بيتر ج. (1964). "التقييم الميكانيكي للتعبيرات" (ملف PDF) . مجلة الحاسوب . 6 (4). مجلة الحاسوب : 308-320 . doi : 10.1093/comjnl/6.4.308 . تاريخ الاسترجاع: 21 يوليو 2014 .
  2. أبيلسون وسوسمان 1996 ، الفصل 1، الحاشية 11 .
  3. باربرا ليسكوف، "تاريخ CLU"، تقرير فني رقم 561 لمختبر علوم الحاسوب في معهد ماساتشوستس للتكنولوجيا (1993)
  4. فيليسين، ماتياس (ديسمبر 1991). "حول القدرة التعبيرية للغات البرمجة" . مجلة علوم برمجة الحاسوب . 17 ( 1-3 ). سبرينغر-فيرلاغ: 35-75 . doi : 10.1016/0167-6423(91)90036-W . تاريخ الاسترجاع: 19 يوليو 2014 .
  5. ريموند، إريك س. (11 أكتوبر 1996). قاموس المخترق الجديد - الطبعة الثالثة . مطبعة معهد ماساتشوستس للتكنولوجيا. ص 432. ISBN  978-0-262-68092-9تم الاطلاع عليه بتاريخ 5 أغسطس 2012 .
  6. "عبارة الاستخدام (مرجع C#)" . تم الاطلاع عليه بتاريخ 16 سبتمبر 2014 .
  7. "magrittr: Vignette" . تم الاطلاع عليه بتاريخ 24 ديسمبر 2018 .
  8. "Stack Overflow: ما معنى علامة الاستفهام الثلاثية في لغة سكالا؟" . تم الاطلاع عليه بتاريخ 23 يناير 2024 .
  9. أبيلسون وسوسمان 1996 ، الفصل 1، الحاشية 11 .
  10. بيرليس 1982 ، أبيغرام رقم 3.
  11. "ملف المصطلحات - الملح النحوي" . 12-06-2003. مؤرشف من الأصل في 12-06-2003 . تم الاطلاع عليه في 19-03-2018 .
  12. "مُعدِّل جديد (مرجع C#)" . microsoft.com . مايكروسوفت . تم الاطلاع عليه في 3 أغسطس 2015 .
  13. "switch (C# Reference)" . microsoft.com . Microsoft . تم الاطلاع عليه بتاريخ 3 أغسطس 2015 .
  14. "السكر النحوي" . catb.org . تم الاطلاع عليه بتاريخ 3 أغسطس 2015 .
  15. بويتن، إيركه أ.؛ مولر، برنارد (26-06-2002). رياضيات بناء البرامج . سبرينغر. ISBN 9783540438571تم الاطلاع عليه بتاريخ 3 أغسطس 2015 .
  16. ↑ دين ، توماس (2004). التحدث مع الحواسيب: استكشافات في علم وتكنولوجيا الحوسبة . مطبعة جامعة كامبريدج. ص 115. ISBN  9780521542043.
  17. هاريسون، ويليام؛ شيرد، تيم (8-10 يوليو 2002). "رياضيات بناء البرامج" (ملف PDF) . رياضيات بناء البرامج: المؤتمر الدولي السادس، MPC 2002، قلعة داغشتول، ألمانيا، 8-10 يوليو 2002. وقائع المؤتمر الدولي حول رياضيات بناء البرامج. سلسلة محاضرات في علوم الحاسوب. المجلد 2386. قلعة داغشتول، ألمانيا: سبرينغر برلين هايدلبرغ. ص 93. doi : 10.1007/3-540-45442-X_6 . ISBN   978-3-540-43857-1. S2CID 10059915 . مؤرشف من الأصل (PDF) في 31 مارس 2017. 
  18. تشوغ، رافي (2013). أنواع التحسين المتداخلة لجافا سكريبت (دكتوراه). جامعة كاليفورنيا في سان دييغو.
  19. "توثيق لغة C لـ LLVM" . clang.llvm.org . تم الاطلاع عليه بتاريخ 30 يونيو 2020 .
  20. "الحياة السرية للأنواع في لغة سويفت" . medium.com/@slavapestov . 14 يوليو 2016. تم الاطلاع عليه في 30 يونيو 2020 .

مراجع