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

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

في هذا المقال سنقوم بشرح أنماط البرمجة المختلفة بشكل بسيط يستطيع أي شخص أن يفهمه مهما كان مستواه في البرمجة.

كما أنني سأقوم بالإجابة على بعض الأسئلة التي ربما تدور في ذهنك مثل:

  • لماذا يجب أن أتعرف على أنواع البرمجة الإلكترونية؟
  • ما هي العلاقة بين أنماط البرمجة ولغات البرمجة؟
  • كيف أتعلم نوع البرمجة الذي يناسبني؟

تصنيف لغات البرمجة

إن كنت تعرف معنى لغات البرمجة، وكيف نشأت فبالتأكيد تعلم أن لغات البرمجة ظهرت لكي تقلل من تعامل البشر مع لغة الآلة بشكل مباشر.

ولهذا أحد أشهر تصنيفات لغات البرمجة هو:

  • لغات منخفضة المستوى (Low Level Languages): وهي اللغات التي تقترب إلى حد بعيد من لغة الآلات.
  • لغات عالية المستوى (High Level Languages): وهي لغات تبتعد عن لغة الآلات وتقترب من لغتنا العادية، وهي الأكثر شيوعاً الآن، ويعتمد عليها أغلب المبرمجين في وظائفهم كل يوم.

ولكن ليس هذا التصنيف ما أقصده هنا… دعني أفسر لك أكثر عندما أسألك ” يا ترى ما هي لغة البرمجة؟ ما الذي تمثله تحديداً ؟ “.

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

والبرامج هي عبارة عن خطوات منطقية مرتبة لحل مشكلة معينة باستخدام الحاسوب – وكما أن كل شخص يفكر في حل المشكلات على حسب طريقته وخبرته…

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

كذلك يفكر المبرمجون في حل المشكلات بطريقة أو أسلوب معين… ومن هنا ظهرت أنواع البرمجة ( Programming Paradigms ).

ولهذا يتم تصنيف لغات البرمجة على حسب الأسلوب التي تعتمد عليه في حل المشكلات… هذا هو تصنيف لغات البرمجة الذي اقصده هنا.

فمثلاً هناك لغات برمجة وظيفية ولغات برمجة كائنية أو شيئية… لا تقلق ستفهم ما الذي أعنيه بذلك عندما تكمل هذا المقال، ولكن قبل ذلك لعلك تسأل نفسك سؤالاً هاماً.

هذا السؤال هو ” لماذا أخبرك بكل هذا؟ ” لماذا أتحدث معك عن تصنيفات لغات البرمجة والمعنى الحقيقي لها… ستجد الإجابة في العنصر التالي?.

لماذا يجب عليك أن تتعرف على أنواع البرمجة؟

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

دعني أعطيك مثالاً، هل تتذكر أيامك في المدرسة والمعلم يشرح لك المادة العلمية من الكتاب المدرسي… تخيل أن ذلك المعلم هو مؤلف الكتاب المدرسي نفسه.

حينها هذا المؤلف لن يشرح لك فقط المادة العلمية ولكنه سيشرح لك ترتيبها، لماذا تم وضع هذه المعلومات في الفصل الأول وليس الفصل الثالث، سيفسر لك أهمية كل ما تتعلمه وكيف تستفيد منه بعد ذلك.

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

ستجد نفسك تفهم كل سطر من الأكواد التي تكتبها، مثل:

  • لماذا نستخدم هنا دالة ( Function )؟
  • لماذا يجب عليك في الخطوة الأولى أن تقوم بتعريف متغير معين ( Variable )؟
  • لماذا نعتمد هنا على الحلقات المنطقية ( Logic Loops)؟

وغيرها من الأسئلة التي لن تعرف إجابتها إلا عندما تفهم جيداً نوع البرمجة التي تعتمد عليه لغتك… حينها ستجد نفسك تفهم الأكواد بسرعة كبيرة.

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

وعندما تتعرف على باقي أنماط البرمجة وتفهم كيف تعمل سيكون من السهل جداً عليك تعلم أي لغة برمجة تريد في وقت قياسي بدون أي عناء.

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

أنواع ( أنماط ) البرمجة الإلكترونية ( Programming paradigms )

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

إن نظرت إلى الصورة الرئيسي لهذا المقال ستجد أن هذه الأنواع الرئيسية هي:

أ) نمط البرمجة الأمرية ( Imperative programming paradigm )

إن بحثت عن معنى كلمة ( Imperative ) ستجد أنها تعني الأمر أو الواجب الحتمي الذي يجب تنفيذه، ولو تعمقت أكثر ستجد أنها مشتقة من الكلمة اللاتينية ( impero )، وهي نفس الكلمة المشتق منها كلمة إمبراطور ( emperor ).

وكما هي عادة الأباطرة والقادة؛ يقومون بإعطاء التعليمات الدقيقة والواضحة… يحبون أن يخبرون من يتبعهم ما الذي عليهم فعله تحديداً خطوة بخطوة.

أنظر مثلاً إلى المثال التالي والمكتوب بلغة C والذي يهدف إلى جمع الأعداد من 1 إلى 10 ثم كتابة الناتج:

int main()

{

    int sum = 0;

    sum += 1;

    sum += 2;

    sum += 3;

    sum += 4;

    sum += 5;

    sum += 6;

    sum += 7;

    sum += 8;

    sum += 9;

    sum += 10;

    printf(“The sum is: %d\n”, sum); 

    return 0;

}

الخطوات السابقة إن قمت بتجربتها بنفسك ستعطي الناتج 55 وهي فعلاً الإجابة الصحيحة … ولكن هل دققت النظر في عدد الخطوات وطريقة كتابتها؟ إن فعلت ستجد أننا أخبرنا الحاسوب أن يقوم بعملية الجمع خطوة بخطوة بطريقة تفصيلية شديدة.

فلقد قمنا بتعريف متغير ( Sum ) وإعطاءه قيمة صفر ثم أخذ هذا المتغير وجمعه مع رقم 1 بحيث تصبح النتيجة الجديدة هي قيمة هذا المتغير… ثم أخذا هذا المتغير وجمع مع رقم 2 بحيث تصبح النتيجة هي القيمة الجديدة للمتغير … ثم مع رقم 3، و رقم 4 وصولاً إلى رقم 10.

ربما يكون هذا النظام للبرمجة سهلاً نوعاً ما إلا أن ما يعيبه:

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

نمط البرمجة الأمرية قديم لأنه يحاكي نوعاً ما الطريقة التي يعمل بها الحاسوب، ولهذا لغات البرمجة القديمة مثل BASIC و لغة C هي التي تعتمد عليه.

دعنا الآن نتحدث عن أنماط البرمجة التي لها نفس طابع البرمجة الأمرية في تنفيذ المهام ولكن مع بعض الخصائص الإضافية.

1. نمط البرمجة الإجرائية ( Procedural programming paradigm )

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

دعنا ننظر إلى نفس المثال السابق ونحاول جمع الأعداد من 1 إلى 10 بلغة C مرة أخرى:

int main()

{

    int sum = 0;

    int i =0;

    for(i=1;i<11;i++){

        sum += i;

    }

    

    printf(“The sum is: %d\n”, sum);

    return 0;

}

كما تلاحظ في هذه المرة قمنا بعمل إجراء جديد لتقسيم الخطوات، قمنا بتقديم متغير i وقيمته من 1 إلى 10 باستخدام For وقمنا بجمع متغير Sum مع i عدة مرات حتى نحصل على الناتج 55.

هذه هي البرمجة الإجرائية والتي تجدها متبعة في:

  • لغة C
  • لغة C++
  • لغة Java

2. نمط البرمجة كائنية التوجه ( Object-oriented programming paradigm )

البرمجة كائنية التوجه – يُطلق عليها ايضاً البرمجة الشيئية – هي واحدة من أكثر أنماط البرمجة استخداماً حالياً وأكثرها تعقيداً نوعاً ما.

في هذا النوع من البرمجة يتم تعريف البيانات التي تتعامل معها على أنها أغراض لها تصنيفات بحيث يمكنك عمل علاقات بين كل غرض وآخر للحصول على نتيجة معينة.

لنفترض مثلاً أنك تريد التعامل مع بيانات بعض العملاء من أكثر من دولة، كل فئة من العملاء ( العملاء من مصر مثلاً ) سنقوم بوضعها في تصنيف ( Class ) محدد.

وسنقوم بتحديد الأغراض ( Objects ) المتعلقة بكل صنف مثل ( العمر – الجنس – الأسم – الرصيد البنكي – وغيرها )، وبعد ذلك سنقوم بالربط بين هذه الأغراض وجمعها أو عمل إحصاء لها كما نريد.

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

إن أردت أن تتعمق في هذا النمط الهام الذي تجده في لغات برمجة عديدة مثل:

  • لغة Python
  • لغة Java
  • لغة C++
  • لغة Objective-C
  • لغة Ruby 

البرمجة كائنية التوجه هامة للغاية ولها العديد من المميزات وهي:

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

لهذا أنصحك بشدة التعمق في تعلم هذا النوع من أنواع البرمجة الإلكترونية خصوصاً إن كنت على دراية بأحد لغات البرمجة التي تعتمد عليه.

3. نهج المعالجة المتوازية ( Parallel processing approach )

نهج المعالجة المتوازية هي أحد أنواع البرمجة التي يتم فيها تقسيم المهام على أكثر من معالج بيانات ( Processor ) في نفس الحاسوب أو السيرفر.

في الحواسيب التي يستخدمها أغلبنا اليوم يحتوي المعالج الواحد على أكثر من نواة ( core )، أو بمعنى آخر يمكننا أن نعتبر أن الحاسوب الواحد يحتوي على عدد معالجات يساوي عدد الأنوية الموجودة به.

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

لغات البرمجة التي يمكنها الإعتماد على هذا النمط هي:

  • لغة C
  • لغة C++

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

ب) نمط البرمجة التصريحية ( Declarative programming paradigm )

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

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

فمثلاً عندما أردنا من الحاسوب أن يجمع الأرقام من 1 إلى 10 حددنا له خطوات واضحة يقوم بها ( اجمع 0 +1 ثم استخدم الناتج +2 ثم استخدم الناتج+3 وهكذا ).

أما في البرمجة التصريحية أنت ستخبر الحاسوب ( اجمع من 1 إلى 10 ) وانتهي الأمر على ذلك دون الحاجة لتحديد الخطوات.

البرمجة التصريحية تستخدم في لغات البرمجة التي تتعامل مع البيانات والتفكير المنطقي مثل لغة Prolog و لغة SQL.

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

1. نمط البرمجة المنطقية ( Logic programming paradigm )

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

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

البرمجة المنطقية تستخدم في بعض لغات البرمجة مثل Prolog و Alice ، والتي ربما لا يستخدمها الكثير من المبرمجين في الوقت الحالي.

2. نمط البرمجة الوظيفية ( Functional programming paradigm )

البرمجة الوظيفية هي أحد الأمثلة على البرمجة التصريحية، والتي تعتمد على فكرة الدوال ( Functions ) بحيث كل دالة تقوم بوظيفة معينة.

يمكن للمبرمج الإستعانة بدالة معينة لها وظائف محددة ( مثلاً هناك دالة إن قمنا بإعطائها مجموعة من الأرقام تقوم بترتيبها من الأكبر إلى الأصغر )

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

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

والسبب الآخر الذي يجعل هذا النمط مشهوراً بين المبرمجين أن لغة Javascript – والتي تُعد من أشهر لغات البرمجة في الوقت الحالي – تعتمد على البرمجة الوظيفية بالإضافة إلى بعض اللغات الأخرى مثل Haskell و Scala.

3. نهج معالجة البيانات ( Database processing approach )

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

تخيل أن البيانات التي تتعامل معها هي عبارة عن مجموعة من الجداول والخلايا ( مثل برنامج إكسيل )، تقوم بتعريفها ثم تتعامل معها بالإضافة والتعديل والمسح و غيرها من الأوامر البسيطة.

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

كيف تتعلم أنواع البرمجة التي تناسب اهتماماتك

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

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