البحث في الموقع
المحتوى عن 'أساسيات البرمجة'.
-
يحتاج أي مطور محترف للتعرف على أنواع لغات البرمجة المختلفة ومعرفة ميزاتها ومحدوديتها كي يتمكن من استخدام النوع الأنسب عند في كتابة برامجه وتطبيقاته، وفي مقال اليوم سنتعرف على مفهوم لغة البرمجة الإجرائية التي هي أحد أقدم وأبسط نماذج البرمجة ونكتشف استخداماتها وآلية عملها وطريقة كتابة البرامج باستخدامها ونستعرض أهم خصائصها وعيوبها ومميزاتها. أنواع لغات البرمجة تختلف لغات البرمجة وتتفاوت في عدة أوجه ما يجعل علماء البرمجة والمطورين يصنفونها وفق تصنيفات مختلفة وفق السمات أو الخصائص المشتركة فيما بينها. ومن بين المعايير التي يتم اعتمادها لتصنيف أنواع لغات البرمجة هو أسلوب هيكلة الشيفرة وطريقة تنظيم عناصر البرنامج حيث تقسم لغات البرمجة بناء على هذا المعيار إلى ثلاثة أصناف أو نماذج رئيسية هي: لغات البرمجة الإجرائية 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 فيقسم البرنامج إلى مجموعة من الكائنات تمثل عناصره الرئيسية ويكون لكل كائن منها بياناته الخاصة والإجراءات التي تعالج هذه البيانات. ففي البرمجة الإجرائية تكون الإجراءات أو الدوال مكونات مستقلة قائمة بذاتها في البرنامج، بينما في البرمجة كائنية التوجه تكون الإجراءات جزءًا من بينة الكائنات نفسها وكما ذكرنا سابقًا لا تكون البرمجة الإجرائية هي أفضل لغة للمشاريع الحساسة للبيانات لذا توفر البرمجة بالكائنات نموذجًا أفضل لحماية البيانات ومنع التعديل عليها خارج الكائن. كما أن التحكم في سير تنفيذ كود البرنامج يتم في البرنامج الإجرائية يحدد من خلال ترتيب استدعاء الدوال أو الإجراءات في حين يتم التحكم به في البرمجة كائنية التوجه بالاعتماد على الحلقات والتعليمات الشرطية وعبارات التحكم الأخرى. وفيما يلي جدول مختصر للمقارنة بين البرمجة الإجرائية ولغة البرمجة كائنية التوجه: البرمجة الإجرائية البرمجة كائنية التوجه تركز لغة البرمجة الإجرائية على تنفيذ مجموعة من الخطوات المتسلسلة لحل المشكلة المطلوبة تركز البرمجة كائنية التوجه على البيانات التي يجب استخدامها لحل المشكلة المطلوبة الدوال هي العناصر الأساسية للبرنامج الأصناف والكائنات هي العناصر الأساسية للبرنامج لا تضمن حماية البيانات وأمانها تضمن حماية البيانات بشكل كبير عن طريق إخفاء البيانات الحساسة عن المستخدمين مناسبة للتطبيقات البسيطة عامة الأغراض وأنظمة التشغيل والبرامج المضنمة مناسبة للتطبيقات الكبيرة والمعقدة لا تمكنك من نمذجة مشكلات العالم الحقيقي بفعالية. تمكنك من نمذجة مشكلات العالم الحقيقي بفعالية ومرونة. وللمزيد من المعلومات حول البرمجة كائنية التوجه وأهم مفاهيمها واستخداماتها أنصحك بمطالعة مقال البرمجة كائنية التوجه. الخلاصة تعرفنا في مقال اليوم على كل ما يخص لغة البرمجة الإجرائية التي تعتمد بشكل أساسي على إخبار الحاسوب بما يجب القيام به خطوة بخطوة باستخدام قائمة واضحة ودقيقة من التعليمات المضمنة داخل إجراءات والتي تعامل البيانات والإجراءات ككيانين مختلفين ضمن البرامج الحاسوبية. فإذا كنت تخطط لتعلم البرمجة يمكنك أن تبدأ رحلة تعلمك بإحدى لغات البرمجة الإجرائية وتتعلم كيفية حل المشكلات باستخدامها وتقسيم برامجك إلى إجراءات فرعية واستدعاءها بالشكل المناسب. اقرأ أيضًا دليلك الشامل إلى لغات البرمجة تعلم أساسيات البرمجة قواعد البرمجة ببساطة للمبتدئين
-
- 1
-
- أساسيات البرمجة
- تعلم البرمجة
-
(و 1 أكثر)
موسوم في:
-
إذا قرأت المقالات السابقة من هذه السلسلة فأنت على دراية بأننا تعلمنا فيها كيف نكتب أوامر بسيطةً وحيدة المدخلات في بايثون، وعرفنا أهمية البيانات وما نفعله بها، ثم كتبنا تسلسلات أطول قليلًا (5-10 أسطر). وها نحن نقترب من كتابة برامج مفيدة، لكن لا زالت لدينا عقبة هنا، وهي خسارة البيانات والبرامج كلما خرجنا من بايثون على الحاسوب، وإذا كنت تستخدم جافاسكربت أو VBScript فسترى أنك قد خزنت تلك الأمثلة في ملفات تستطيع تشغيلها وقتما أردت، ونريد أن نفعل ذلك مع بايثون أيضًا، وقد ذكرنا من قبل أن هذا ممكن باستخدام أي محرر نصي مثل notepad أو pico ، وذلك بحفظ ملف بامتداد .py ثم تشغيل الملف من محث أوامر نظام التشغيل مع كتابة اسم السكربت مسبوقًا بكلمة python، يستخدم المثال التالي تسلسلًا من أوامر بايثون، فيه كل النقاط التي شرحناها من قبل: # File: firstprogram.py print( "hello world" ) print( "Here are the ten numbers from 0 to 9\n0 1 2 3 4 5 6 7 8 9" ) print( "I'm done!" ) # نهاية الملف لاحظ أن السطرين الأول والأخير ليسا ضروريين، وهما تعليقان سنشرحها في هذا المقال، وقد أضفناهما لنوضح ما يحدث في الملف. يمكن استخدام notepad أو أي محرر نصي لإنشاء الملف طالما سنحفظه بصيغة نصية مجردة، ولا نستخدم معالج نصوص متقدمًا مثل MS Word، لأنه يحفظ الملفات بصيغة ثنائية خاصة لا تستطيع بايثون فهمها، ولا نستخدم صيغة html التي تحوي كثيرًا من النصوص المنسقة التي لا تعني شيئًا لبايثون كذلك. لتشغيل هذا البرنامج افتح سطر أوامر نظام التشغيل الآن، يمكنك مراجعة مقال البداية في تعلم البرمجة لمعرفة سطر أوامر النظام، وانتقل إلى المجلد الذي حفظت فيه ملف بايثون لديك، ثم نفّذه بكتابة python قبله كما ذكرنا: D:\PROJECTS\Python> python firstprogram.py hello world Here are the ten numbers from 0 to 9 0 1 2 3 4 5 6 7 8 9 I'm done! D:\PROJECTS\Python> في السطر الأول محث أوامر ويندوز إضافةً إلى الأمر الذي كتبناه، ثم خرج البرنامج معروضًا قبل أن يظهر محث ويندوز مرةً أخرى، لكن توجد طريقة أسهل، فقد يكون لدينا أكثر من إصدار لبايثون على نفس الحاسوب إذا كان النظام نفسه يستخدم الإصدار الثاني منها لبعض المهام مثلًا، وإذا كتبنا python في تلك الحالة فقد نحصل على أخطاء لم نتوقعها، ولتجنب مثل تلك الحالة نلحق رقم إصدار بايثون الذي نريد استخدامه إلى الاسم، فإذا كنا نريد الإصدار الثالث نكتب: D:\PROJECTS\Python> python3 firstprogram.py لاحظ أنها صارت الآن python3 بدلًا من python فقط، وبذلك سنتجنب كثيرًا من الأخطاء على أغلب نظم التشغيل. مزايا استخدام البيئة المتكاملة يثبَّت مع بايثون تلقائيًا عند تثبيتها على الحاسوب تطبيق مفيد، وهو برنامج مكتوب بلغة بايثون أيضًا، ويسمى IDLE اختصارًا لبيئة التطوير المتكاملة Integrated Development Environment، وهو يعني أن فيه أدوات عديدةً مدمجةً فيه لمساعدة المبرمجين، ولن نتعمق فيه هنا، لكن نريد تسليط الضوء على مزيتين فيه، أولاهما أنه يوفر نسخةً محسنةً من محث بايثون >>> فيها تظليل للكلمات، حيث تُعرَض خصائص اللغة بألوان مختلفة لإبرازها، إضافةً إلى محرر نصي خاص ببايثون، يسمح لك بتشغيل ملفات برنامجك مباشرةً من داخل IDLE، وننصحك بتجربة IDLE إذا لم تكن قد فعلت، وإذا أردت شرحًا للبرنامج فانظر دليل داني يو Danny Yoo عنه. أما في حالة استخدام ويندوز فثمة خيار آخر هو PythonWin الذي يمكن تحميله ضمن حزمة PyWin32، والذي يسمح لنا بالوصول إلى جميع دوال البرمجة الدنيا لـمكتبة MFC الخاصة بويندوز، وهو بديل جيدًا جدًا لبيئة IDLE، لكنه لا يعمل إلا على ويندوز، وستحصل عليه تلقائيًا إذا حمّلت بايثون من ActiveState، فنسختهم فيها جميع مزايا PyWin32 بما فيها Pythonwin افتراضيًا. لكن من الناحية الأخرى فإن IDLE يأتي افتراضيًا في حزمة بايثون القياسية، وهو يعمل على أغلب أنظمة التشغيل، لذا يُستخدم أكثر، ولا تهم الأداة التي تستخدمها بأي حال طالما ليست notepad من ويندوز إذ الخيارات المتقدمة أفضل من مجرد محرر نصي بسيط. أخيرًا، إذا كنت تفضل الأسلوب البسيط في كتابة البرامج فستجد محررات عدةً تدعم البرمجة ببايثون، حيث يوفر محرر ViM مثلًا تظليلًا للكلمات المفتاحية، ويوفر emacs وضع تعديل كامل خاص ببايثون، كما يوفر محرر Scite الخفيف تظليل الكلمات المفتاحية لبايثون إضافةً إلى مزايا أخرى. وإذا اخترت طريق المحررات النصية فستجد نفسك مع الوقت تعمل أمام ثلاث نوافذ في نفس الوقت، هي نافذة المحرر التي تكتب فيها شيفرتك المصدرية وتحفظها، وجلسة بايثون التي تجرب فيها ما تكتب من خلال محث بايثون قبل إضافتها إلى برنامجك في المحرر، وسطر أوامر نظام التشغيل الذي تستخدمه لتشغيل البرنامج من أجل اختباره. أما أغلب المبتدئين فيفضلون أسلوب بيئات التطوير المتكاملة التي تأتي كلها في نافذة واحدة مثل IDLE، والأمر كله اختياري فيه سعة ولهذا اختر ما يناسبك، وإذا كنت تستخدم جافاسكربت أو VBScript؛ فنقترح استخدام أحد المحررات النصية المذكورة أعلاه، ومتصفح ويب حديث لجافاسكربت مثل كروم أو فاير فوكس؛ أما بالنسبة للغة VBScript فهذا يعني إنترنت إكسبلورر حصرًا، وليس متصفح Edge حتى، ويكون المتصفح مفتوحًا على الملف الذي تعمل عليه، فإذا أردت تجربة تغيير أو تعديل ما، فاضغط زر إعادة تحميل الصفحة. التعليقات السريعة إحدى أهم الأدوات البرمجية التي لا يشعر المبتدئون بأهميتها هي التعليقات، وهي أسطر داخل البرنامج تصف ما يحدث فيه، وليس لها أي تأثير على أداء البرنامج أو سير عملياته، فهي أسطر وصفية لما يحدث فقط، إلا أن دورها في غاية الأهمية، إذ تخبر المبرمج ما يفعله البرنامج في كل كتلة برمجية أو كل سطر، ولماذا يتصرف على هذا النحو، وتظهر أهمية التعليقات هنا إذا كان البرنامج الذي يقرؤه المبرمج قد كتبه شخص غيره، أو قد كتبه هو بنفسه لكن منذ مدة طويلة فنسي سبب اختياره لخاصية أو دالة بعينها. وسيشعر المبرمج بأهمية التعليقات حسنة الوصف مع الوقت، وقد أضفنا تعليقات إلى بعض الشيفرات التي استخدمناها في شرح هذه السلسلة إلى الآن، فهي تلك الأسطر المسبوقة بعلامة # في بايثون، أو بعلامة ' في VBScript، وسنبدأ تدريجيًا من الآن بكتابة شرح الشيفرة في التعليقات، إلى أن يقل ما نكتبه من الشرح خارج الشيفرة ثم يختفي. لكل لغة طريقة في ترميز التعليقات، ففي VBScript مثلًا تكون REM مثل اختصار إلى كلمة Remark أو ملاحظة، لكن يشيع استخدام العلامة ' لتؤدي نفس الوظيفة بحيث يتجاهل البرنامج أي شيء مكتوب بعدها. REM لن يُعرض هذا السطر ' ولا هذا msgBox "أما هذا السطر فسيُعرض" لاحظ أن استخدام علامة اقتباس مفردةً ' مثل محدد للتعليقات في VBScript هو سبب منع بدء السلسلة النصية بها، لئلا تظن اللغة أنها تعليق، أما بايثون فتستخدم رمز # مثل حدد للتعليقات فيها، وتتجاهل أي شيء يتبعه: v = 12 # القيمة 12 v أعط x = v*v # v تساوي مربع x غير أن هذا الأسلوب في التعليقات سيء للغاية، إذ لا يجب أن تصف التعليقات ما تفعله الشيفرة فحسب، فنحن نستطيع رؤية ذلك بأنفسنا، لكنها يجب أن تصف سبب اختيار المبرمج لهذه الدالة أو تلك القيمة: v = 3600 # 3600 عدد الثواني في الساعة الواحدة s = t*3600 # تحتوي الوقت المار بالساعة t # لذا نحولها إلى ثوانٍ. هذه النسخة من التعليقات أكثر فائدةً إذ تشرح سبب ضرب t في 3600. تستخدم جافاسكربت شرطتين مائلتين // مثل محدد للتعليقات، ثم تتجاهل أي شيء بعدهما، كما تسمح بعض اللغات بتعليقات متعددة الأسطر بين زوجين من الرموز، لكن هذا قد يؤدي إلى بعض الأخطاء الخفية إذا لم يوضع رمز الإغلاق، وتسمح جافاسكربت بهذا النوع من التعليقات باستخدام الرمز /* متبوعًا برمز الإغلاق */ بعد نهاية التعليقات: <script type="text/javascript"> document.write("هذا السطر يُطبع\n"); // تعليق من سطر واحد /* هنا تعليق نقسمه على عدة أسطر فيحتوي على هذا السطر وهذا السطر وذا أيضًا ولن يظهر أي من هذا في خرج السكربت فإذا أردنا إنهاء التعليق نعكس رمز البدء ليكون كما يلي: */ document.write("وهذا أيضًا"); </script> تبرز أهمية التعليقات كما ذكرنا في أنها تشرح الشيفرة لأي شخص يحاول قراءتها، حيث يجب الحرص على توضيح الأقسام الغامضة مثل القيم العشوائية المستخدمة، أو المعادلات الحسابية المعقدة. تذكر أن ذلك القارئ المحتار في فهم شيفرتك قد يكون أنت نفسك بعد بضعة أسابيع أو أشهر. التسلسلات باستخدام المتغيرات لقد شرحنا مفهوم المتغيرات في مقال مدخل إلى البيانات وأنواعها: أنواع البيانات الأساسية، وقلنا إنها عناوين نعلّم بها بياناتنا من أجل الإشارة إليها في المستقبل، ورأينا بعض الأمثلة عن استخدام المتغيرات في عدة أمثلة لقوائم ودفاتر عناوين، غير أن المتغيرات بالغة الأهمية في البرمجة إلى الحد الذي يجعلنا نعيد مراجعة كيفية استخدامها مرةً أخرى قبل أن ننتقل إلى جزء جديد. اكتب ما يلي في محث بايثون، سواءً في صدفة IDLE أو في نافذة أوامر دوس أو يونكس: >>> v = 7 >>> w = 18 >>> x = v + w # استخدم متغيرنا في عملية حسابية >>> print( x ) ما حدث في الشيفرة أعلاه هو أننا أنشأنا المتغيرات v وw وx وعدّلناها، وهذا أشبه بزرّ M على حاسبة الجيب القديمة التي تخزن نتيجةً لاستخدامها لاحقًا، يمكن تحسين تلك الشيفرة باستخدام سلسلة تنسيق لطباعة النتيجة: >>> print( "The sum of %d and %d is: %d" % (v,w,x) ) إحدى مزايا سلاسل التنسيق هنا أننا نستطيع تخزينها في متغيرات أيضًا: >>> s = "The sum of %d and %d is: %d" >>> print( s % (v,w,x) ) # هذا مفيد عند طباعة نفس الخرج بقيم مختلفة هذا يقصّر كثيرًا من طول تعليمة الطباعة، خاصةً حين تحتوي على قيم كثيرة، لكنه يجعلها أكثر غموضًا، وعندها تقرر بنفسك أيهما الأفضل من حيث القراءة: الأسطر الطويلة أم القصير؟ فإذا أبقينا سلسلة التنسيق هنا إلى جانب تعليمة الطباعة كما فعلنا فهذا حسن. يفضل تسمية المتغير بطريقة تشرح الغرض من وجوده، فبدلًا من تسمية سلسلة التنسيق باسم s، يفضل تسميتها sumFormat فتبدو الشيفرة كما يلي: >>> sumFormat = "The sum of %d and %d is: %d" >>> print( sumFormat % (v,w,x) ) # هذا مفيد عند طباعة نفس الخرج بقيم مختلفة يمكن معرفة أي تنسيق تمت طباعته بمجرد النظر إليه في هذا البرنامج لأنه لا يحتوي على سلاسل تنسيق كثيرة، لكن لا تزال فكرة التسمية المنطقية للمتغيرات ساريةً هنا، وسنحاول قدر الإمكان استخدام أسماء ذات معنى في ما يلي من الشرح؛ أما المتغيرات التي ذكرناها إلى الآن فلم يكن لها معنىً يستحق التسمية. أهمية الترتيب قد يظن المرء أن بنية التسلسل تلك مبالغ فيها لبداهتها، ولعل هذا صحيح بما أنها بديهية فعلًا، لكن الأمر ليس بتلك البساطة التي يبدو عليها، فقد تكون هناك مشاكل خفية كما في حالة الرغبة في ترقية جميع الترويسات في ملف HTML مثلًا، بمقدار رتبة واحدة، انظر المثال التالي، حيث تُميَّز الترويسات في HTML بإحاطة النص بوسم يشير إلى أنها ترويسة مع رتبتها: <h1> نص </h1> لترويسة المستوى الأول <h2> نص </h2> لترويسة المستوى الثاني <h3> نص </h3> لترويسة المستوى الثالث والمشكلة هنا أننا حين نصل إلى المستوى الخامس يصير نص الترويسة أصغر من نص المتن العادي نفسه، مما يبدو غريبًا على القارئ إذ يرى نص العنوان أصغر من متنه، وعلى ذلك نريد ترقية جميع الترويسات دفعةً واحدةً، يسهُل هذا بعملية بحث واستبدال في محرر نصي بسيط بأن نستبدل h2 بـ h1 مثلًا، لكن ماذا لو بدأنا بالأرقام الأكبر، مثل h4 إلى h3، ثم h3 إلى h2 وهكذا؛ سنجد في النهاية أن جميع الترويسات صارت من المستوى الأول h1، وهنا تبرز أهمية ترتيب الأحداث والإجراءات، وذلك ينطبق في حالة كتابتنا لبرنامج ينفذ عملية الاستبدال، وهو ما سنفعله على الأغلب بما أن ترقية الترويسات عملية واردة الحدوث، وقد رأينا أمثلةً أخرى نستخدم فيها المتغيرات والتسلسلات في مقالي مدخل إلى البيانات وأنواعها: أنواع البيانات الأساسية ومدخل إلى البيانات وأنواعها: التجميعات Collections، خاصةً أمثلة دفتر العناوين. جرب التفكير في أمثلة مشابهة لحلها، وإذا أتممت هذا فسننتقل إلى دراسة حالة جديدة نطورها بالتدريج كلما تقدمنا في هذه السلسلة، لنحسنها مع كل تقنية نتعلمها. جدول الضرب سنشرح الآن تدريبًا برمجيًا نطوره معنا أثناء دراسة المقالات التالية، وستتطور حلوله تدريجيًا مع تعلم تقنيات جديدة، ذكرنا أننا نستطيع كتابة سلاسل نصية طويلة بتغليفها بعلامات اقتباس ثلاثية، لنستخدم هذا الأسلوب لبناء جدول ضرب: >>> s = """ 1 x 12 = %d 2 x 12 = %d 3 x 12 = %d 4 x 12 = %d """ # احذر وضع تعليقات في السلاسل النصية >>> # إذ ستكون جزءًا من السلسلة نفسها >>> print( s % (12, 2*12, 3*12, 4*12) ) إذا وسعنا الشيفرة السابقة فسنتمكن من طباعة جدول ضرب العدد 12 كاملًا من 1 إلى 12، لكن هل من طريقة أفضل؟ بالتأكيد، وهي ما سنراها في الجزئية الموالية من هذه السلسلة. خاتمة عرفنا في هذا المقال أن IDLE هي بيئة تطوير خاصة بكتابة برامج بايثون وتطويرها، وأن التعليقات تسهل قراءة البرامج وفهمها، ولا تأثير لها على سير العمليات في البرنامج، وأن المتغيرات تستطيع تخزين نتائج بينية من أجل استخدامها لاحقًا. ترجمة -بتصرف- للفصل السادس: More Sequences and Other Things من كتاب Learning To Program لصاحبه Alan Gauld. اقرأ أيضًا المقال التالي: الحلقات التكرارية في البرمجة المقال السابق: مدخل إلى البيانات وأنواعها: التجميعات Collections تعلم البرمجة كيف تتعلم البرمجة كيف تتعلّم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة