نمط برمجة

نظرة إجمالية

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

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

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

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

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