يحتاج أي مطور محترف للتعرف على أنواع لغات البرمجة المختلفة ومعرفة ميزاتها ومحدوديتها كي يتمكن من استخدام النوع الأنسب عند في كتابة برامجه وتطبيقاته، وفي مقال اليوم سنتعرف على مفهوم لغة البرمجة الإجرائية التي هي أحد أقدم وأبسط نماذج البرمجة ونكتشف استخداماتها وآلية عملها وطريقة كتابة البرامج باستخدامها ونستعرض أهم خصائصها وعيوبها ومميزاتها.
أنواع لغات البرمجة
تختلف لغات البرمجة وتتفاوت في عدة أوجه ما يجعل علماء البرمجة والمطورين يصنفونها وفق تصنيفات مختلفة وفق السمات أو الخصائص المشتركة فيما بينها. ومن بين المعايير التي يتم اعتمادها لتصنيف أنواع لغات البرمجة هو أسلوب هيكلة الشيفرة وطريقة تنظيم عناصر البرنامج حيث تقسم لغات البرمجة بناء على هذا المعيار إلى ثلاثة أصناف أو نماذج رئيسية هي:
- لغات البرمجة الإجرائية Procedural Programming
- لغات البرمجة الوظيفية Functional Programming
- لغات البرمجة الكائنية Object-Oriented Programming
من الضروري لك كمبرمج أن تفهم الفروقات بين هذه النماذج البرمجية واختيار النموذج المناسب لمشروعك، وسنخصص فقراتنا التالية لشرح لغات البرمجة الإجرائية والتي تعد أحد أقدم نماذج البرمجة ونكتشف معًا طريقة عملها وأشهر لغات البرمجة التي تعتمدها وأبرز مزاياها وعيوبها.
إذا كنت مهتمًا بمعرفة المزيد من المعايير التي تصنف وفقها لغات البرمجة وأهم مميزات كل نوع يمكنك مطالعة مقال أنواع لغات البرمجة.
ما هي البرمجة الإجرائية Procedural Programming؟
البرمجة الإجرائية Procedural Programming هي أحد نماذج البرمجة التي تعتمد بشكل أساسي على إخبار الحاسوب بالمهام التي تريد منه القيام به بدقة وخطوة بخطوة من خلال كتابة إجراءات procedures أو دوال برمجية functions تؤدي كل منها مهمة محددة.
سابقًا في بدايات البرمجة كانت البرامج تتألف من إجراء واحد يتكون من سلسلة متتالية من التعليمات البرمجية التي تنفذ بالتسلسل من أعلى الكود إلى أسفله لتؤدي المطلوب وكان هذا يجعل الكود مكررًا وطويلًا جدًا، أما مع أسلوب البرمجة الإجرائية أصبح بإمكان المبرمج تقسيم البرامج الطويلة إلى مجموعة من الإجراءات تحل كل منها مشكلة فرعية منفصلة وإعادة استخدامها عند الحاجة ضمن الإجراء الرئيسي أو ضمن إجراءات أخرى لتحقيق الهدف الكلي للبرنامج.
فالإجراءات procedures أو الدوال functions أو ما يعرف أيضًا البرامج الفرعية subroutines أو الوظائف هي عبارة عن كتل من التعليمات البرمجية لها اسم محدد تحصل على المدخلات من المستخدم وتعالجها بطريقة معينة لأداء المهمة المطلوبة ثم تعيد مجموعة من النتائج كمخرجات.
وتجدر الإشارة بأنه لا يتم تنفيذ تعليمات الإجراءات مباشرة عند كتابته بل يجب استدعاء الإجراء من خلال كتابة اسمه وتمرير قيم المتغيرات المناسبة له ليتم تنفيذ كتلة تعليماته البرمجية، بعبارة أخرى الإجراء البرمجي هو كتلة من التعليمات المجمعة بشكل وحدة واحدة والتي تؤدي مهمة محددة ويتم استخدامها في البرامج عند الحاجة لتنفيذ هذه المهمة المعينة.
تصنف البرمجة الإجرائية كذلك بأنها أحد أنواع البرمجة الأمرية imperative وهي برمجة نعطي فيها الحاسوب مجموعة من الأوامر أو التعليمات أو الخطوات المرتبة لنخبره بشكل مفصل بما يجب عليه القيام به من أجل تحقيق مهمة ما.
أمثلة على لغات برمجة إجرائية
قد تدعم بعض لغات البرمجة نموذج البرمجة الإجرائية فقط، لكن في الغالب ستجد أن معظم لغات البرمجة تدعم أكثر من نموذج برمجة بذات الوقت للاستفادة من ميزات كل نموذج ومنح المبرمج مزيدًا من المرونة في كتابة برامجه على سبيل المثال تدعم لغة بايثون Python ولغة C++ كلًا من نموذج البرمجة الإجرائية والبرمجة كائنية التوجه بذات الوقت.
من الأمثلة الشائعة على لغات البرمجة الإجرائية نذكر:
- سي C: لغة برمجة إجرائية شهيرة تم تطويرها عام 1972 وتستخدم في العديد من المجالات أهمها تطوير نظم التشغيل والتطبيقات المضمنة وألعاب الفيديو.
- بيسك BASIC: لغة برمجة عالية المستوى تم تطويرها في عام 1964 بهدف جعل البرمجة سهلة التعلم والفهم للمبتدئين وكانت تستخدم لتطوير التطبيقات الإدارية البسيطة والبرامج التعليمية والألعاب.
- فورتران FORTRAN: من لغات البرمجة الإجرائية الشهيرة وهي أقدم لغة برمجة عالية المستوى طورت في خمسينيات القرن الماضي لتسهيل كتابة البرامج الرياضية والعلمية ولا تزال لليوم في المجالات العلمية والهندسية مثل التنبؤ بالطقس والفيزياء الحاسوبية والتحليل العددي.
- كوبول COBOL: لغة برمجة إجرائية قديمة عالية المستوى طورت بهدف تقديم لغة برمجة سهلة ومفهومة من قبل المبرمجين وهي لا تزال لليوم تستخدم في عالم الأعمال والمصارف (البنوك).
- الغول ALGOL: هي لغة برمجة إجرائية تستخدم لتطوير التطبيقات العلمية والهندسية وهي أول لغة برمجة أدخلت مفهوم الكتل البرمجية وسمحت بتداخل الإجراءات والدوال داخل بعضها البعض وتعد لغة مرجعية لتطوير معايير لغات البرمجة الأخرى.
- آدا Ada: لغة برمجة إجرائية صممت لتكون لغة آمنة وموثوقة للاستخدام في الأنظمة البرمجية المعقدة المستخدمة من قبل المنظمات الحكومية والمؤسسات الأكاديمية فهي تتضمن ميزات مثل الكتابة الصارمة ومعالجة الاستثناءات.
- باسكال Pascal: لغة برمجة عالية المستوى صممها عالم الحاسوب نيكلاوس ويرث بداية السبعينيات لتوفير لغة برمجة صارمة ومنظمة للمبتدئين في تعلم البرمجة، واستخدمت في البدايات لتطوير برامج معالجة البيانات وتطوير الألعاب وأثرت في تطوير العديد من لغات البرمجة الأخرى مثل دلفي وآدا.
مثال عملي لبرنامج مكتوب بأسلوب البرمجة الإجرائية
لتفهم البرمجة الإجرائية بشكل أفضل دعني أوضح لك الأمر بمثال عملي، إذا فكرنا بكتابة برنامج بلغة C لحساب المتوسط الحسابي لعلامات طالب ما، يمكن أن نفكر بكتابته مباشرة دون استخدام الإجراءات من خلال تخزين العلامات في مصفوفة ثم نستخدم حلقة for للتكرار خلال عناصر المصفوفة لحساب المتوسط وعرض قيمته ضمن البرنامج الرئيسي كما يلي:
#include <stdio.h> int main() { int marks[] = {60, 70, 88, 95, 59}; int size = sizeof(marks) / sizeof(marks[0]); int sum = 0; for (int i = 0; i < size; i++) { sum += marks[i]; } float avg = (float)sum / size; printf("Average: %f", avg); return 0; }
الآن لو احتجنا لحساب المتوسط الحسابي لدرجات طالب آخر سنحتاج لتعريف مصفوفة أخرى تتضمن علامات هذا الطالب ونكرر نفس الكود على المصفوفة الثانية ويصبح الكود كالتالي:
#include <stdio.h> int main() { int marks1[] = {60, 70, 88, 95, 59}; int size1 = sizeof(marks1) / sizeof(marks1[0]); int sum1 = 0; for (int i = 0; i < size1; i++) { sum1 += marks1[i]; } float avg = (float)sum1 / size1; printf("Average1: %f", avg); int marks2[] = {76, 93, 78, 93, 86}; int size2 = sizeof(marks2) / sizeof(marks2[0]); int sum2 = 0; for (int i = 0; i < size2; i++) { sum2 += marks2[i]; } float avg2 = (float)sum2 / size2; printf("Average2: %f", avg2); return 0; }
والآن ماذا لو أردنا حساب متوسط درجات 100 طالب تخيل حجم تكرار الكود الذي سيحصل في البرنامج! لذا سيكون من الأفضل التفكير في تعريف إجراء أو دالة تغلف تعليمات حساب المتوسط ونعيد استخدامها في البرنامج الرئيسي عند الحاجة كما يلي.
لكتابة هذا البرنامج سنعرف إجراءً يسمى average()
يأخذ مصفوفة الدرجات كوسيط ويحسب هذا الإجراء حجم المصفوفة ومجموع كل العناصر في المصفوفة ويعيد المتوسط بقسمة المجموع على حجم المصفوفة.
وفي الدالة main()
التي تمثل البرنامج الرئيسي نكتفي بتعريف مصفوفات الدرجات ونمررها كوسطاء للدالة average()
لنحصل مباشرة على النتيجة المطلوبة.
#include <stdio.h> float average(int arr[]); int main() { int marks1[] = {60, 70, 88, 95, 59}; int marks2[] = {76, 93, 78, 93, 86}; printf("Average1: %f", average(marks1)); printf("Average2: %f", average(marks2)); return 0; } float average(int arr[]) { int size = sizeof(arr) / sizeof(arr[0]); int sum = 0; for (int i = 0; i < size; i++) { sum += arr[i]; } return (float)sum / size; }
كما تلاحظ عندما استخدمنا الدوال أو الإجراءات لتحقيق المطلوب تمكنا من تنظيم البرنامج بشكل أفضل واختصرنا حجم الشيفرات البرمجية المكررة وأصبح بإمكاننا إعادة استخدام الإجراءات عدة مرات.
خصائص البرمجة الإجرائية
يتضمن نموذج البرمجة الإجرائية مجموعة من الخصائص أو الميزات الرئيسية وأبرزها:
- النمطية
- الدوال المعرفة مسبقًا
- تصميم البرنامج من أعلى لأسفل
- تمرير المعاملات parameters
- المتغيرات العامة
- المتغيرات المحلية
لنتعرف على المزيد من التفاصيل حول كل خاصية من هذه الخاصيات!
1. النمطية
تعني ميزة النمطية تقسيم البرامج المعقدة إلى وحدات أو أجزاء أصغر مستقلة بحيث يسهل حلها. كل قسم يؤدي مهمة محددة ثم يتم تجميعهما لأداء مهمة أكبر، تسمى هذه الوحدات في لغات البرمجة الإجرائية باسم الإجراءات أو الدوال وهي تساعد على تقليل تعقيد الأنظمة بشكل كبير وتجعل الكود أكثر كفاءة.
2. الدوال المعرفة مسبقًا
تتضمن كافة لغات البرمجة الإجرائية دوال مضمنة أو معرفة مسبقًا predefined functions لا تضطر المبرمج إلى ترميز كل شيء من البداية حيث تؤدي هذه الدوال المدمجة في اللغة وظائف محددة مثل العمليات الحسابية أو عمليات إدخال أو إخراج البيانات وتُضمَّن في مكتبات قياسية جاهزة يمكن للمبرمج استدعاؤها مباشرة والاستفادة منها.
3. هيكلة البرنامج من أعلى لأسفل
عندما تفكر في تطوير برنامج باستخدام إحدى لغات البرمجة الإجرائية تفكر من الأعلى للأسفل أي أنك تقسم البرنامج إلى أجزاء أصغر يتم تنفيذها بطريقة متسلسلة. حيث تفكر بداية في الهدف الأساسي العام للبرنامج ثم تقوم بتقسيمه إلى أجزاء أصغر لتنفيذ هذا الهدف وتكتب كافة الإجراءات أو الدوال المطلوب لتشغيله وتتحكم في تدفق الكود من خلال استدعاء هذه الدوال بالترتيب المناسب.
4. تمرير المعاملات
تعتمد البرمجة الإجرائية على ميزة تمرير المعاملات parameter passing إلى الإجراءات أو الدوال والتي تمثل دخل الإجرائية وهي البيانات اللازمة لتنفيذ عمليات الإجرائية ثم إرجاع خرج، أي لكل إجرائية عادةً دخل تعطي بمقابله خرج ما.
5. المتغير المحلي Local Variable
المتغير المحلي هو متغير يعرف ضمن كتلة تعليمات الدالة البرمجية ويمكن استخدامه فقط داخل الدالة المعرف فيها. فعند انتهاء تنفيذ الدالة وعودة التحكم إلى البرنامج مرة أخرى لا يمكن استخدام المتغيرات المحلية.
6. المتغير العام Global Variable
المتغير العام هو متغير يعرف خارج كتلة تعليمات الدالة البرمجية وبالتالي يمكن استخدامه في أي مكان في البرنامج وفي أي دالة أخرى ضمن البرنامج ويمكن لأي وظيفة في البرنامج قراءته وتغيير قيمته، وتجدر الإشارة لضرورة استخدام المتغيرات العامة بحذر شديد ضمن كودك البرمجي.
استخدامات اللغات الإجرائية
تعد لغات البرمجة الإجرائية مناسبة للاستخدام في مجال تعليم البرمجة للمبتدئين لكونها تتميز بالوضوح وسهولة الفهم، كما أنها تستخدم لتطوير الأنظمة البرمجية البسيطة غير المعقدة التي لا تحتاج للكثير من المعالجات الفرعية وكتابة إجراءات متداخلة مع بعضها البعض.
تناسب لغات البرمجة الإجرائية كذلك تطوير برامج الحسابات وحل كافة أنواع المشكلات العلمية والتقنية الواضحة.
مميزات وسلبيات البرمجة الإجرائية
يوفر نموذج البرمجة الإجرائية الكثير من المميزات للمبرمجين والمطورين لكنه لا يخلو من بعض العيوب التي قد تجعلهم يفضلون استخدام نماذج برمجة أخرى، وفيما يلي نناقش أهم إيجابيات وسلبيات البرمجة الإجرائية.
مميزات البرمجة الإجرائية
- تتسم لغة البرمجة الإجرائية بالبساطة وسهولة الفهم ولهذا السبب يبدأ معظم من المبرمجين بتعلم إحدى لغات البرمجة الإجرائية وفهم أساسياتها قبل الانتقال لأساليب برمجة أخرى.
- تعتمد لغة البرمجة الإجرائية على تقسيم الكود إلى أجزاء أصغر مما يسهل على المبرمجين تنظيم العمل ومتابعة سير عمل البرنامج واختبار وتصحيح الأخطاء البرمجية بشكل أسرع.
- توفر البرمجة الإجرائية ميزة تعريف الإجراء مرة واحدة واستدعائه كلما دعت الحاجة مما يقلل الكثير من تكرار الشيفرات البرمجية ضمن البرنامج.
- تسهل البرمجة الإجرائية إعادة استخدام الكود في برامج خارجية من خلال حفظ هذه الإجراءات ضمن مكتبات واستيرادها إلى البرامج عند الحاجة.
- تسهل البرمجة الإجرائية ميزة توزيع المهام على فريق من المبرمجين عند العمل على البرامج الكبيرة حيث يمكن لكل مبرمج تطوير قسم من الإجراءات المطلوبة لإكمال البرامج بشكل أسرع.
سلبيات لغة البرمجة الإجرائية
- في لغة البرمجة الإجرائية لا توجد حماية فعلية أو عزل للبيانات حيث يمكنك تمرير البيانات إلى الإجراءات واستخدامها وتعديلها لذا قد لا تكون أفضل لغة برمجة للتطبيقات التي تتضمن بيانات حساسة.
- استخدام مفهوم المتغيرات العامة في لغات البرمجة الإجرائية التي يمكن الوصول إليها وتعديلها بواسطة أي جزء من كود البرنامج قد يصعب عملية الصيانة ومعرفة مصدر الخطأ.
- يمكن للمطورين إعادة استخدام الإجراءات التي يكتبونها في نفس المشروع لكن لا يمكنهم إعادة استخدامها أو الاستفادة منها في مشاريع أخرى.
- في البرمجة الإجرائية لا يمكن تغيير البيانات بعد إنشائها داخل كود البرنامج ما يعطي بعض القيود في توسيع وتطوير البرامج.
- تعد لغات البرمجة الإجرائية أبطأ في التنفيذ مقارنة بأنواع لغات البرمجة الأخرى.
- قد لا تكون البرمجة الإجرائية هي النموذج الأنسب لتطوير برامج معقدة أو متقدمة كتطبيقات التعلم الآلي والذكاء الاصطناعي التي تتضمن الكثير من المعالجات.
ما الفرق بين لغة البرمجة الإجرائية ولغة البرمجة كائنية التوجه؟
يقسم البرنامج في البرمجة الإجرائية إلى مجموعة من المتغيرات وهياكل البيانات والإجراءات وتكون هذه الإجراءات هي العناصر الأساسية للبرنامج فهي التي تتعامل مع المتغيرات وهياكل البيانات، بينما في البرمجة بالكائنات أو البرمجة كائنية التوجه OOP فيقسم البرنامج إلى مجموعة من الكائنات تمثل عناصره الرئيسية ويكون لكل كائن منها بياناته الخاصة والإجراءات التي تعالج هذه البيانات.
ففي البرمجة الإجرائية تكون الإجراءات أو الدوال مكونات مستقلة قائمة بذاتها في البرنامج، بينما في البرمجة كائنية التوجه تكون الإجراءات جزءًا من بينة الكائنات نفسها وكما ذكرنا سابقًا لا تكون البرمجة الإجرائية هي أفضل لغة للمشاريع الحساسة للبيانات لذا توفر البرمجة بالكائنات نموذجًا أفضل لحماية البيانات ومنع التعديل عليها خارج الكائن.
كما أن التحكم في سير تنفيذ كود البرنامج يتم في البرنامج الإجرائية يحدد من خلال ترتيب استدعاء الدوال أو الإجراءات في حين يتم التحكم به في البرمجة كائنية التوجه بالاعتماد على الحلقات والتعليمات الشرطية وعبارات التحكم الأخرى.
وفيما يلي جدول مختصر للمقارنة بين البرمجة الإجرائية ولغة البرمجة كائنية التوجه:
البرمجة الإجرائية | البرمجة كائنية التوجه |
---|---|
تركز لغة البرمجة الإجرائية على تنفيذ مجموعة من الخطوات المتسلسلة لحل المشكلة المطلوبة | تركز البرمجة كائنية التوجه على البيانات التي يجب استخدامها لحل المشكلة المطلوبة |
الدوال هي العناصر الأساسية للبرنامج | الأصناف والكائنات هي العناصر الأساسية للبرنامج |
لا تضمن حماية البيانات وأمانها | تضمن حماية البيانات بشكل كبير عن طريق إخفاء البيانات الحساسة عن المستخدمين |
مناسبة للتطبيقات البسيطة عامة الأغراض وأنظمة التشغيل والبرامج المضنمة | مناسبة للتطبيقات الكبيرة والمعقدة |
لا تمكنك من نمذجة مشكلات العالم الحقيقي بفعالية. | تمكنك من نمذجة مشكلات العالم الحقيقي بفعالية ومرونة. |
وللمزيد من المعلومات حول البرمجة كائنية التوجه وأهم مفاهيمها واستخداماتها أنصحك بمطالعة مقال البرمجة كائنية التوجه.
الخلاصة
تعرفنا في مقال اليوم على كل ما يخص لغة البرمجة الإجرائية التي تعتمد بشكل أساسي على إخبار الحاسوب بما يجب القيام به خطوة بخطوة باستخدام قائمة واضحة ودقيقة من التعليمات المضمنة داخل إجراءات والتي تعامل البيانات والإجراءات ككيانين مختلفين ضمن البرامج الحاسوبية.
فإذا كنت تخطط لتعلم البرمجة يمكنك أن تبدأ رحلة تعلمك بإحدى لغات البرمجة الإجرائية وتتعلم كيفية حل المشكلات باستخدامها وتقسيم برامجك إلى إجراءات فرعية واستدعاءها بالشكل المناسب.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.