نموذج البرمجة

يُعدّ نموذج البرمجة طريقةً عالية المستوى نسبيًا لتصور وهيكلة تنفيذ برنامج حاسوبي . ويمكن تصنيف لغة البرمجة على أنها تدعم نموذجًا واحدًا أو عدة نماذج. [ 1 ]

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

تتضمن بعض نماذج البرمجة الشائعة (الموضحة في علاقة هرمية ): [ 2 ] [ 3 ] [ 4 ]

  • الأمرية يتحكم الكود بشكل مباشر في تدفق التنفيذ وتغيير الحالة، وهي عبارات صريحة تُغير حالة البرنامج.
  • الكود التصريحي يُعلن عن خصائص النتيجة المرجوة، لكنه لا يُحدد كيفية حسابها، ويصف ما يجب أن تُجريه العملية الحسابية، دون تحديد تغييرات الحالة التفصيلية.
    • الدالة ​​يتم تحديد النتيجة المرجوة كقيمة لسلسلة من تقييمات الدالة، وتستخدم تقييم الدوال الرياضية وتتجنب الحالة والبيانات القابلة للتغيير
    • المنطق يتم الإعلان عن النتيجة المرجوة كإجابة على سؤال حول نظام من الحقائق والقواعد، ويستخدم المنطق الرياضي الصريح للبرمجة
    • التفاعلي يتم الإعلان عن النتيجة المرجوة باستخدام تدفقات البيانات وانتشار التغيير
  • البرمجة المتزامنة – تحتوي على بنيات لغوية للتزامن، وقد تشمل هذه البنيات تعدد الخيوط، ودعم الحوسبة الموزعة، وتمرير الرسائل، والموارد المشتركة (بما في ذلك الذاكرة المشتركة)، أو المستقبلات.
    • برمجة الممثلين – الحوسبة المتزامنة مع ممثلين يتخذون قرارات محلية استجابةً للبيئة (قادرين على السلوك الأناني أو التنافسي)
  • البرمجة المقيدة – يتم التعبير عن العلاقات بين المتغيرات كقيود (أو شبكات قيود)، مما يوجه الحلول المسموح بها (يستخدم إرضاء القيود أو خوارزمية سيمبلكس ).
  • برمجة تدفق البيانات – إعادة حساب الصيغ إجبارياً عند تغيير قيم البيانات (مثل جداول البيانات )
  • البرمجة الموزعة – تدعم أجهزة كمبيوتر متعددة مستقلة تتواصل عبر شبكات الكمبيوتر
  • البرمجة العامة – تستخدم خوارزميات مكتوبة بأنواع يتم تحديدها لاحقًا، ثم يتم إنشاء مثيلات لها حسب الحاجة لأنواع محددة يتم توفيرها كمعاملات.
  • البرمجة الوصفية – كتابة برامج تكتب أو تعالج برامج أخرى (أو نفسها) كبيانات لها، أو تقوم بجزء من العمل في وقت الترجمة الذي كان سيتم تنفيذه في وقت التشغيل
    • البرمجة الوصفية باستخدام القوالب – أساليب البرمجة الوصفية التي يستخدم فيها المترجم قوالب لإنشاء شفرة مصدرية مؤقتة، والتي يقوم المترجم بدمجها مع بقية الشفرة المصدرية ثم يقوم بتجميعها.
    • البرمجة الانعكاسية – أساليب البرمجة الفوقية التي يقوم فيها البرنامج بتعديل نفسه أو توسيعه
  • برمجة خطوط الأنابيب – تغيير بسيط في بناء الجملة لإضافة بناء جملة إلى استدعاءات الدوال المتداخلة في لغة مصممة أصلاً بدون أي بناء جملة
  • البرمجة القائمة على القواعد - شبكة من القواعد العامة التي تشكل قاعدة معرفية ويمكن استخدامها لأنظمة الخبراء واستنتاج المشكلات وحلها
  • البرمجة المرئية – معالجة عناصر البرنامج بشكل رسومي بدلاً من تحديدها نصياً (مثل Simulink )؛ وتسمى أيضاً البرمجة التخطيطية

ملخص

نظرة عامة على نماذج البرمجة المختلفة وفقًا لبيتر فان روي [ 5 ] : 5 [ 6 ]

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

يمكن وصف لغة البرمجة من حيث نماذجها. تدعم بعض اللغات نموذجًا واحدًا فقط، مثل Smalltalk التي تدعم البرمجة الكائنية، و Haskell التي تدعم البرمجة الوظيفية. بينما تدعم معظم اللغات نماذج متعددة. فعلى سبيل المثال، يمكن لبرنامج مكتوب بلغة C++ أو Object Pascal أو PHP أن يكون إجرائيًا بحتًا ، أو كائني التوجه بحتًا ، أو قد يجمع بين خصائص كلا النموذجين، أو غير ذلك.

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

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

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

في البرمجة كائنية التوجه ، يُنظَّم الكود في كائنات تحتوي على حالة يملكها الكود الخاص بالكائن ويتحكم بها (عادةً). ومعظم لغات البرمجة كائنية التوجه هي أيضاً لغات إجرائية.

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

تُعرف العديد من نماذج البرمجة بالتقنيات التي تحظرها بقدر ما تُعرف بالتقنيات التي تدعمها . على سبيل المثال، تمنع البرمجة الوظيفية البحتة التأثيرات الجانبية ، بينما تمنع البرمجة الهيكلية استخدام عبارة goto . لهذا السبب جزئيًا، غالبًا ما يُنظر إلى النماذج الجديدة على أنها عقائدية أو جامدة للغاية من قِبل أولئك الذين اعتادوا على النماذج القديمة. [ 8 ] ومع ذلك، فإن تجنب بعض التقنيات قد يُسهّل فهم سلوك البرنامج، وإثبات النظريات المتعلقة بصحته.

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

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

نقد

ينتقد بعض الباحثين في لغات البرمجة مفهوم النماذج البرمجية كتصنيف للغات البرمجة، مثل هاربر [ 9 ] وكريشنامورثي [ 10 ] . ويجادلون بأن العديد من لغات البرمجة لا يمكن تصنيفها بدقة ضمن نموذج برمجي واحد، بل تتضمن سمات من عدة نماذج. انظر: مقارنة لغات البرمجة متعددة النماذج .

تاريخ

تطورت مناهج برمجة مختلفة عبر الزمن. وقد وُصفت تصنيفات كل منهج إما عند تطويره لأول مرة، أو غالبًا بعد فترة من الزمن، بأثر رجعي. ومن أوائل المناهج التي تم تحديدها بوعي على هذا النحو البرمجة الهيكلية ، التي دُعي إليها منذ منتصف الستينيات. ويعود مفهوم نموذج البرمجة، على هذا النحو، إلى عام 1978 على الأقل، في محاضرة جائزة تورينج التي ألقاها روبرت دبليو فلويد بعنوان "نماذج البرمجة" ، والتي استشهدت بمفهوم النموذج كما استخدمه توماس كون في كتابه "بنية الثورات العلمية " (1962). [ 11 ] لم تكن لغات البرمجة المبكرة تحتوي على نماذج برمجة محددة بوضوح، وفي بعض الأحيان كانت البرامج تستخدم عبارات "goto" بكثرة، مما أدى إلى ظهور شيفرة معقدة يصعب فهمها وصيانتها. وقد أدى ذلك إلى تطوير نماذج البرمجة الهيكلية التي منعت استخدام عبارات "goto"، واقتصرت على استخدام بنيات البرمجة الهيكلية. [ 12 ]

اللغات والنماذج

لغة الآلة

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

يُطلق عليها أحيانًا اسم لغة البرمجة من الجيل الأول .

حَشد

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

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

اللغات الإجرائية

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

  • لغة الأعمال الشائعة ( COBOL ) - تستخدم مصطلحات مثل ملف ، نقل ونسخ . 
  • ترجمة الصيغ ( FORTRAN ) - باستخدام مصطلحات اللغة الرياضية ، تم تطويرها بشكل أساسي للمشاكل العلمية والهندسية. 
  • لغة الخوارزميات ( ALGOL ) - تركز على كونها لغة مناسبة لتعريف الخوارزميات ، مع استخدام مصطلحات اللغة الرياضية، واستهداف المشكلات العلمية والهندسية، تمامًا مثل لغة FORTRAN. 
  • لغة البرمجة الأولى ( PL/I ) - لغة هجينة تجارية-علمية للأغراض العامة تدعم المؤشرات . 
  • لغة التعليمات الرمزية متعددة الأغراض للمبتدئين ( BASIC ) - تم تطويرها لتمكين المزيد من الأشخاص من كتابة البرامج. 
  • لغة البرمجة C لغة برمجة للأغراض العامة، تم تطويرها في البداية بواسطة دينيس ريتشي بين عامي 1969 و 1973 في مختبرات AT&T Bell . 

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

البرمجة الكائنية التوجه

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

أثار ألكسندر ستيبانوف وريتشارد ستالمان [ 13 ] ومبرمجون آخرون جدلاً حول فعالية نموذج البرمجة الكائنية التوجه (OOP) مقارنةً بالنموذج الإجرائي. إن حاجة كل كائن إلى أساليب ترابطية تدفع بعض المتشككين إلى ربط البرمجة الكائنية التوجه بتضخم حجم البرمجيات ؛ وقد جاءت محاولة حل هذه المعضلة من خلال تعدد الأشكال (Polymorphism ).

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

اللغات التصريحية

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

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

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

نماذج أخرى

البرمجة الرمزية هي نموذج برمجي يصف البرامج القادرة على معالجة الصيغ ومكونات البرنامج كبيانات. [ 4 ] وبذلك، تستطيع البرامج تعديل نفسها بفعالية، ويبدو أنها "تتعلم"، مما يجعلها مناسبة لتطبيقات مثل الذكاء الاصطناعي ، وأنظمة الخبراء ، ومعالجة اللغة الطبيعية ، وألعاب الحاسوب. ومن اللغات التي تدعم هذا النموذج البرمجي لغتا ليسب وبرولوج . [ 14 ]

تُبنى البرامج القابلة للتفاضل بحيث يمكن تفاضلها بالكامل، عادةً عن طريق التفاضل التلقائي . [ 15 ] [ 16 ]

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

يمكن اعتبار تقنيات البرمجة الرمزية، مثل البرمجة الانعكاسية (الانعكاس)، التي تسمح للبرنامج بالإشارة إلى نفسه، نموذجًا برمجيًا. مع ذلك، فهي متوافقة مع النماذج الرئيسية، وبالتالي لا تُعدّ نموذجًا قائمًا بذاته.

انظر أيضاً

مراجع

  1. "لغة برمجة متعددة الأنماط" . شبكة مطوري موزيلا . مؤسسة موزيلا . 21 يونيو 2013. مؤرشف من الأصل في 21 أغسطس 2013.
  2. نورمارك، كيرت. نظرة عامة على نماذج البرمجة الأربعة الرئيسية . جامعة ألبورج، 9 مايو 2011. تم استرجاعه في 22 سبتمبر 2012.
  3. فرانس كوينين (11 أكتوبر 1999). "خصائص لغات البرمجة التصريحية" . cgi.csc.liv.ac.uk. مؤرشف من الأصل بتاريخ 27 فبراير 2014. تم الاطلاع عليه بتاريخ 20 فبراير 2014 .
  4. 1 2 مايكل أ. كوفينجتون (23 أغسطس 2010). "CSCI/ARTI 4540/6540: المحاضرة الأولى حول البرمجة الرمزية ولغة ليسب" (ملف PDF) . جامعة جورجيا. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 7 مارس 2012. تاريخ الاطلاع: 20 نوفمبر 2013 .
  5. بيتر فان روي (12 مايو 2009). "نماذج البرمجة: ما يجب أن يعرفه كل مبرمج" (ملف PDF) . info.ucl.ac.be. تاريخ الاسترجاع: 27 يناير 2014 .
  6. بيتر فان روي؛ سيف حريدي (2004). مفاهيم وتقنيات ونماذج برمجة الحاسوب . مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-22069-9.
  7. "نماذج البرمجة: ما هي مبادئ البرمجة؟" . دليل IONOS الرقمي . 20 أبريل 2020. مؤرشف من الأصل في 29 يونيو 2022. تم الاطلاع عليه في 3 مايو 2022 .
  8. فرانك روبين (مارس 1987). "«يُعتبر استخدام أمر GOTO ضارًا» (ملف PDF) . مجلة اتصالات رابطة الحوسبة الآلية . 30 (3): 195-196 . doi : 10.1145/214748.315722 . S2CID 6853038. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 20 مارس 2009. 
  9. هاربر، روبرت (1 مايو 2017). "ما هو نموذج البرمجة، إن وجد؟" . FifteenEightyFour . مطبعة جامعة كامبريدج.
  10. كريشنامورثي، شري رام (نوفمبر 2008). "تدريس لغات البرمجة في عصر ما بعد لينيوس" . إشعارات ACM SIGPLAN . 43 (11). ACM: 81-83 . doi : 10.1145/1480828.1480846 . S2CID 35714982 . .
  11. فلويد، ر. و. (1979). "نماذج البرمجة" . اتصالات رابطة آلات الحوسبة . 22 (8): 455-460 . doi : 10.1145/359138.359140 .
  12. سوروكا، باري آي. (2006). جافا 5: الكائنات أولاً . جونز وبارتليت ليرنينج. ISBN 9780763737207.
  13. "الوراثة، والاستنساخ، والخطافات، والبرمجة الكائنية التوجه (مناقشة مجموعات جوجل)" .
  14. "قاموس المصطلحات التجارية: تعريف البرمجة الرمزية" . allbusiness.com . تم الاطلاع عليه بتاريخ 30-07-2014 .
  15. وانغ، فاي؛ ديكر، جيمس؛ وو، شيلون؛ إيسرتل، غريغوري؛ رومبف، تيارك (2018)، بينجيو، س.؛ والاش، هـ.؛ لاروشيل، هـ.؛ غراومان، ك. (محررون)، "الانتشار العكسي مع الاستدعاءات: أسس البرمجة التفاضلية الفعالة والمعبرة" (ملف PDF) ، التطورات في أنظمة معالجة المعلومات العصبية 31 ، كوران أسوشيتس، ص 10201-10212 ، تاريخ الاسترجاع 13 فبراير 2019 
  16. إينيس، مايك (2018). "حول تعلم الآلة ولغات البرمجة" (ملف PDF) . مؤتمر SysML 2018. مؤرشف من الأصل (ملف PDF) بتاريخ 20 سبتمبر 2018. تم الاطلاع عليه بتاريخ 13 فبراير 2019 .