# نمط برمجة

نمط البرمجة، (بالإنجليزية: Programming paradigm)‏، هو أسلوب في برمجة الحاسوب (وثمة فرق بينه وبين المنهجية Methodology، والتي هي أسلوب حل مشاكل محددة تتبع لهندسة البرمجيات). تختلف أنماط البرمجة في المفاهيم والتجريدات التي تستخدمها لتمثيل عناصر برنامج (كالكائنات والتوابع والمتحولات والقيود وغيرها) وخطوات العمل والحساب (كالتعيين وبنى التحكم والإيجاد).
يمكن للغة البرمجة أن تدعم عدة أنماط برمجة. فمثلاً: برامج سي++ أو أوبجكت باسكال يمكن أن تكون وظيفية تماماً أو كائنية تماماً، أو قد تحتوي خليطاً من الإثنين. مصممو البرامج والمبرمجون هم الذين يحددون كيف يستخدمون الأنماط المختلفة.

## نظرة إجمالية

ان لغات البرمجة يمكنها أن تدعم العديد من الأنماط. على سبيل المثال لا الحصر في لغة C++ أو في أوبجيكت باسكال Object Pascal أو في لغة Ring يمكن ان يكون البرنامج مكتوب بشكل إجرائي procedural أو كائني object-oriented كاملا. أو يمكن أن يحوي عناصر من كلا النمطين السابقين.
إن متطلبات تصميم البرمجيات والمبرمجين يقررون كيف يتم استعمال عناصر الأنماط.
في البرمجة غرضية التوجه، المبرمج يمكن ان يفكر بالبرنامج من منظور انه يتألف من مجموعة من الكائنات المتفاعلة فيما بينها، بينما في البرمجة الوظيفية functional programming البرنامج يمكن أن ينظر له على أنه سلسلة من تقييمات التوابع المتتالية. عند البرمجة بالحاسب أو أنظمة تملك عدة معالجات فإن نمط process-oriented يسمح للمبرمجين لينظروا للتطبيقات كأنها مجموعة من العمليات المتزامنة تتصرف وفقاً لبنية المعطيات المشتركة.
النموذج الحاسوبي هو تجريد لنظام حاسوبي، مثل «نموذج فون نيومان» المستخدمة في أجهزة الحواسيب التسلسلية التقليدية. أما بالنسبة للحوسبة التفرعية، فهناك العديد من النماذج الممكنة التي تعكس عادة الوسائل المختلفة التي يمكن من خلال ربط المعالجات. وتعتمد النماذج الأكثر شيوعاً على الذاكرة المشتركة، أو على توزيع الذاكرة مع تمرير الرسائل، أو على مزيج من الاثنين.
ويمكن للغة البرمجة دعم نماذج عديدة، فيمكن استخدام لغات مثل سي++ أو أوبجيكت باسكال لكتابة برامج إجرائية بحتة، أو كائنية بحتة أو مزيجاً من النمطينأو لغة Ring التي تدعم البرمجة الكائنية والوظيفية بالإضافة الي البرمجة الطبيعية التي تسمح باستخدام اللغات الطبيعية في البرمجة (وهي تقنية جديدة). ويرجع قرار اختيار الأنموذج الأنسب إلى مبرمجي ومصممي النظام البرمجي.
في البرمجة الكائنية، ينظر المبرمج إلى البرنامج على أنه مجموعة من الكائنات التي تتفاعل مع بعضها، بينما في البرمجة الوظيفية يمكن اعتبار البرنامج على أنه سلسلة من عمليات إيجاد للتوابع. وعندما تبرمج نظم حاسوبية بمعالجات عديدة، تسمح البرمجة العملياتية (process-oriented programming) للمبرمجين بالنظر إلى البرنامج على أنه مجموعة من العمليات المتزامنة التي تنفذ على مجموعة من بنى المعطيات التي يتم تشاركها بشكل منطقي.
وكما توجد مجموعات مختلفة من المنهجيات في هندسة البرمجيات، توجد مجموعات مختلفة من أنماط البرمجة. حيث صممت بعض اللغات لدعم نمط واحد (مثل Smalltalk التي تدعم البرمجة الكائنية التوجه فقط، وهاسكل التي تدعم البرمجة الوظيفية فقط)، بينما صمم بعضها الآخر لدعم عدة أنماط (مثل أوبجيكت باسكال، سي++، سي شارب، فيجوال بيسك، بايثون، پيرل وغيرها).
تعرف أنماط البرمجة أيضاً بالميزات التي تمنعها. فعلى سبيل المثال، لا تسمح البرمجة الوظيفية باستخدام الآثار الجانبية، في حين لا تسمح البرمجة الهيكلية باستخدام العبارة goto. وربما لهذا السبب تنتقد الكثير من الأنماط الجديدة التي تتيح كثيراً من الميزات الإضافية، حيث يفيد منع ميزة معينة في إمكانية إثبات مبرهنة ما حول صحة البرنامج، أو ببساطة فإنه ربما يتيح فهماً أفضل للبرنامج.

## أنماط البرمجة
### لغة الآلة Machine Code

لغة الآلة Machine Language هي اللغة البرمجية الوحيدة التي تفهمها وحدة المعالجة المركزية CPU مباشرة بدون وسائط.وهي من لغاة البرمجة المتدنية المستوى low level programming language.تعتبر لغة الآلة من لغات البرمجة الأولية primitive فهي تمثل اخفض مستوى (من ناحية قربه من العتاديات hardware) برمجي يمكن للمبرمج التعامل معه.
إن البرامج المبرمجة وفق لغات البرمجة المترجمة compiled يتم نقل الرماز المصدري الخاص بها إلى لغة الآلة بينما البرامج المبرمجة بلغات مفسرة interpreted لا تمثل بلغة الآلة.
يجب عدم الخلط بين لغة الآلة وبين bytecode التي تنفذ من قبل مفسر interpreter.
لقد تم اعتماد نظام الاعداد الثنائي عن غيرها من أنظمة الاعداد لترميز لغة الآلة نظراً لسهولة تمثيل حالتين في الدارات الإلكترونية on,off التي تقابل 1 و 0
مثال على لغة الترميز الثنائي 000000 00001 00010 00110 00000 000000

### لغة التجميع Assembly languages

لجعل البرمجة أسهل تم تطوير لغة التجميع assembly languages. ان لغة التجميع هي لغة برمجة من المستوى المنخفض مخصصة لبرمجة أجهزة الحاسب، المعالجات الصغرية، المايكروكونترولر microcontrollers والدارات المتكاملة.IC integrated circuits.
تعتمد هذه اللغة مبدأ استبدال العديد من تعليمات المعالج الثنائية بتعليمة معينة حرفياً symbolic وذلك بهدف أساسي جعل البرنامج قابل للقراءة من قبل المبرمجين على الرغم من ذلك لم تلغ لغة التجميع عمل لغة الآلة وانما هي تطوير لمقروئية لغة الآلة.
تتميز لغة التجميع بانها تختلف وفقاً للمعالج المبرمج وفقه ففي حين نجد تعليمات لمعالج انتل 86x نجد تعليمات لمعالجات مثل Mips «لالمنشأ لأهداف تعليمية», كما نجد ان البرامج المكتوبة بلغة تدعم معالج 32 بت تختلف عن معالج 64 بت بشكل عام.
تعتبر لغة التجميع ذات مستوى منخفض، أيضاً على الرغم من ذلك إلا انه تعتبر الجيل الثاني لانماط البرمجة.
=مثال على كود يعتمد لغة تجميع مثال على كود يعتمد لغة تجميع (من معالج Mips 3000)

### اللغات الإجرائية Procedural Languages

الخطوة التالية كانت بتطوير اللغات الإجرائية procedural languages. في الحقيقة هذا النمط يملك عدة أسماء فالتسمية الرئيسية لهذا النمط من انماط لغات البرمجة يدعى Procedural programming أي لغة اجرائية كونها تعتمد الاجرائيات ويمكن ان تدعى ب imperative programming أي لغة امرية وذلك من كونها لغة امرية بحيث تعتمد على تلقين الحاسب الحل خطوة بخطوة كما قد نجد تسمية structured programming أي برمجة هيكلية بحيث تعتمد على مفهوم استدعاء الاجرائيات أو كما هي معروفة بالروتين.
تعتمد هذه اللغة عدة مبادئ:
* تقسيم البرنامج إلى عدة اقسام جزئية لتسهيل القراءة واعادة الاستخدام تسمى هذه الاجزاء بعدة أسماء:
** Procedures اجراءات
** functions توابع
** methods منهجيات
** routines روتين
** subroutines روتين فرعي
* توصيف حل المشكلة خطوة بخطوة والتي تعد من مساوئ هذا النمط حيث يجب على المبرمج ان يقوم بحل المشكلة المتناولة بنفسه وليس الحاسب.
هذا النمط كان يعتبر الجيل الثالث من انماط البرمجة.

### اللغات غرضية التوجه object-oriented languages

ظهر فيما بعد مفهوم اللغات غرضية التوجه object-oriented languages في هذا المفهوم يفرض ان المعطيات والتوابع يجب أن تكون مغلفة وعندما نريد استعمالها يجب أن يكون لدينا غرض من هذا العنصر كي نستعمل التوابع والمعطيات
.الطريقة الوحيدة تتيح للمستخدم الوصول إلى العناصر هي عن طريق توابع الغرض العامة فقط.
لقد كانت لغات البرمجة غرضية التوجه هي تطوير للغات الإجرائية ولا تختلف اختلافاً جذرياً إلا ببعض المفاهيم كالتغليف والوراثة.... الخ

### اللغات الأمرية Imperative Languages

ظهر فيما بعد اللغات الامرية imperative نمط اللغات الامرية هي نمط من انماط لغات البرمجة التي تصف الحوسبة وفق تعليمات تغير حالة البرنامج. تعبر اللغات الامرية عن الاوامر لفعل عمل محدد. كما انها تصف سلسلة من التعليمات كي يؤديها الحاسب.
يستخدم مصطلح البرمجة الامرية لوصف مصطلح مضاد للبرمجة التصريحية declarative programming الني نعبر عن ما يراد الوصول إليه من دون شرح كيفية الوصول إليه.
تعتبر اللغات المنطقية والدالية هي أشهر الامثلة للغات البرمجة التصريحية. كذلك لغة الاستعلامات SQL

### اللغات المنطقية Logic Languages

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

# اللغات متعددة أنماط البرمجة

اللغة متعددة أنماط البرمجة هي لغة تدعم أكثر من نمط برمجي واحد، يعرّف تيموثي بَد مصمم لغة البرمجة Leda هذه اللغة بقوله: «تكمن فكرة لغة البرمجة متعددة أنماط البرمجة في توفير إطار عمل يتيح للمبرمج العمل بأساليب متعددة بحيث يدمج بحرية بنى تتبع لأنماط برمجة مختلفة». وبالتالي فإن الهدف من تصميم لغات كهذه هو السماح للمبرمج باستخدام الأداة الأفضل للقيام بالمهمة المطلوبة على اعتبار أنه لا يوجد نمط برمجي واحد قادر على إيجاد أفضل الحلول لكافة المشاكل أو أكثرها فعالية دائماً.
على سبيل المثال توفر لغة #C نمطاً برمجياً أمرياً وآخراً غرضي التوجه بالإضافة إلى دعمها البرمجة الوظيفية إلى حد ما عبر التوابع غير المسماة واستنباط الأنماط والاستعلامات المدمجة باللغة (بالإنجليزية: Language Integrated Query)‏. توفر لغات أخرى مثل لغة #F وScala وظيفية شبيهة لتلك الموجودة في #C إضافة إلى دعم كامل للبرمجة الوظيفية (بما فيها ميزة الكاريينغ (بالإنجليزية: Currying)‏ ومطابقة النماذج وأنماط البيانات الجبرية والتقييم الكسول والعودية الذيلية والثبوتية (بالإنجليزية: immutability)‏ وغيرها). إن لغة البرمجة Oz هي مثال صارخ عن تعددية أنماط البرمجة إذ أنها تشتمل على أنماط برمجة منطقية ووظيفية وغرضية التوجه وتدفق معطيات متوازي بالإضافة إلى أنماط أخرى. استغرق تصميم لغة البرمجة Oz عشر سنوات تم خلالها التوفيق بين أنماط برمجة مختلفة في لغة واحدة.

# تاريخ أنماط البرمجة

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

## انظر أيضا

* برمجة وظيفية
* سلسلة عملية يحركها الحدث
* دراكون
* برمجة كائنية التوجه
* برمجة جانبية المنحى
* لغة نمذجة
* بارادايم
* رينج (لغة برمجة)

## مراجع

* ↑ Overview of the four main programming paradigms. Aalborg University, 9 May 2011. Retrieved 22 September 2012. نسخة محفوظة 24 يناير 2018 على موقع واي باك مشين.
* ↑ Frank Rubin (مارس 1987). "'GOTO Considered Harmful' Considered Harmful" (PDF). Communications of the ACM. ج. 30 ع. 3: 195–196. DOI:10.1145/214748.315722. مؤرشف من الأصل (PDF) في 2009-03-20.
* ↑ "Richard+Stallman"+oop&rnum=5&hl=en "Mode inheritance, cloning, hooks & OOP (Google Groups Discussion)". مؤرشف من الأصل في 2013-05-28.
* ↑ "What exactly is a programming paradigm?". freeCodeCamp.org. 12 نوفمبر 2019. مؤرشف من الأصل في 2022-04-19. اطلع عليه بتاريخ 2022-05-13.
* ↑ Programming Languages: Principles and Paradigms (بالإنجليزية). DOI:10.1007/978-1-84882-914-5. Archived from the original on 2022-05-13.
* ↑ "Introduction of Programming Paradigms - GeeksforGeeks". www.geeksforgeeks.org. مؤرشف من الأصل في 2021-07-16. اطلع عليه بتاريخ 2022-05-13.
* ↑ "What Is A Programming Paradigm? Data Defined". Indicative (بالإنجليزية الأمريكية). Archived from the original on 2022-04-19. Retrieved 2022-05-13.

## وصلات خارجية

* أنماط البرمجة
* تصنيف لغات البرمجة الأساسية
* بوابة برمجة الحاسوب
* بوابة تقانة المعلومات
* بوابة علم الحاسوب