الحديث عن كيف ينفذ الحاسب الألى الأوامر التى نطلبها منه طويل ، وعميق ويأخذ مناحي كثيرة .
لكننا سنركز هنا على سؤال قد يتساءل البعض عنه .
كيف يفهم مطورى البرمجيات الحاسوب ؟ وكيف يفهمهم ؟
وهو سؤال يمكن أن نفرد له هذه المقالة ، ولكن من الصعب أن يكون جزءا من الكبسولات حيث تركز الكبسولات على مفاهيم عامة حول الكمبيوتر والتقنية .
ولنبدأ ،،،،
أغلبنا يعرف أن الحاسوب لا يفهم سوى 0 , 1 )) وهنا يتضح لنا أنه لا يفهم غير لغة واحدة فقط تسمى لغة الألة machine language ( 0 , 1 )
ويتم تمثيل أى من الأوامر على هذه الهيئة 0 , 1 ، وهذا موضوع طويل ، لكن لك أن تعلم أن كل ما يقدمه لك الحاسب من صور وصوت وفيديو وملفات .... إلخ
ما هو إلا مصفوفة ثنائية تتكون من رقمين فقط هما 0 , 1 وذلك من منظور الحاسوب ، ويقسم الحاسب الالى أو على وجه الدقة المعالج الدقيق Microprocessor العمليات التى تطلب منه إلى عمليات رياضية ومنطقية وعمليات تحكم ، والعمليات الرياضية يتم تحويلها لأبسط صورة لعملية رياضية ، وكذلك العمليات المنطقية كمنطق "و" ومنطق "أو " ومنطق النفي ، بنفس طريقة تفكيرنا المنطقية ، أما عمليات التحكم فهي أوامر التحكم فى مختلف القطع الصلبة بالحاسب الالى Hardware .
ويتم تمثيل أى من الأوامر على هذه الهيئة 0 , 1 ، وهذا موضوع طويل ، لكن لك أن تعلم أن كل ما يقدمه لك الحاسب من صور وصوت وفيديو وملفات .... إلخ
ما هو إلا مصفوفة ثنائية تتكون من رقمين فقط هما 0 , 1 وذلك من منظور الحاسوب ، ويقسم الحاسب الالى أو على وجه الدقة المعالج الدقيق Microprocessor العمليات التى تطلب منه إلى عمليات رياضية ومنطقية وعمليات تحكم ، والعمليات الرياضية يتم تحويلها لأبسط صورة لعملية رياضية ، وكذلك العمليات المنطقية كمنطق "و" ومنطق "أو " ومنطق النفي ، بنفس طريقة تفكيرنا المنطقية ، أما عمليات التحكم فهي أوامر التحكم فى مختلف القطع الصلبة بالحاسب الالى Hardware .
وأعتقد أن ماسبق قد أوحى لك بتلك العملية التى يتطلب حدوثها لطباعة إسمك على الشاشة ، وهي عملية من المخاطبة الألية بين وحدات الحاسب وبرمجياتة .
لكن هل من المعقول أن تكون كل تلك البرامج التى نعمل عليها مكتوبة بلغة الألة ؟ وهل جميع المبرمجين يتقنون هذة اللغة ؟ - بالتأكيد لا .
فمع تطور علوم التقنية ظهرت الحاجة لوجود تخاطب قوي بين المبرمجين والألة بطريقة أقرب لفهم الأنسان وليس فهم الالة ، ومن هنا ظهرت لغة التجميع أو Assembly Language وهي لغة تجمع مجموعة من الأوامر فى صورة إختصارات اقرب للفهم الأنسانى مثل Add , Sub .
لاحظ هنا أنها أقرب للفهم الأنسانى عن فهم الألة بمعنى أن الأنسان ( المبرمج ) يفهمها بسهولة ومن هنا ظهرت الحاجة لما يعرف بالمترجمات compilers لتقوم بتوضيح المعنى للألة بحيث يكتب المبرمج شفراتة بمنظور إنسانى ويقوم المترجم بدورة قى ترجمة المعنى لمنظور الالة 1,0 ، وكانت لغة التجميع تستخدم ما يعرف بالمجمع Assembler ليقوم بهذا الدور ، لكن ما زالت لغة التجميع من المستوى القرب للغة الألة ، ومع تطور التقنية ظهرت الحاجة لتطبيقات أكثر إنتاجية وهو ما لا يتوفر فى لغة الألة نظرا لتعقديها وصعوبتها الشديدة على الفهم البشرى .
فظهرت ما يعرف بلغات المستوى العالى High Level Languages وهى قريبة جدا من مستوى الفهم البشرى ، ومن أمثلتها C ) - Visual basic – Java )
وإقتصرت لغة التجميع على مستوى التطبيقات التى تتطلب تعاملا مباشرا مع الألة
وإقتصرت لغة التجميع على مستوى التطبيقات التى تتطلب تعاملا مباشرا مع الألة
مثل برامج توصيف قطع Hardware ، وأنظمة التشغيل مثل Windows وبرامج التحكم .
لكن كيف ينفذ الكمبيوتر الشفرة المكتوبة أو البرنامج ؟
فى البداية كان البرنامج المكتوب ينفذ بشكل تتابعى من أعلى إلى أسفل .
لاحظ الشفرة التالية :
- برنامج لطباعة رقم أو حرف على الشاشة -
1. إبدأ البرنامج
2. إحجز العنوان 0001 فى الذاكرة
3. خاطب لوحة المفاتيح لإستقبال الحروف المدخلة
4. خزن قيمة المدخلات فى العنوان 0001
5. خاطب الشاشة لعرض القيمة المخزنة فى العنوان 0001
6. أنهى البرنامج
لكن هذا الأسلوب غير عملي حيث من الممكن أن تصل شفرة البرنامج لألاف السطور ، وهو ما يصعب من عملية تنقيحة ومراجعتة ، كذلك ما رأيك بهذه المعضلة لديك س ، ص كمعاملين مطلوب أن يتم إجراء العمليات الحسابية الأساسية عليهما ، بهذا الأسلوب ستجد سطورا كثيرة من الممكن أن يتم إختصارها بأسلوب أفضل من ذلك . فظهرت الحاجة لتعديل هذا الأسلوب .
1. إبدأ البرنامج
2. إحجز العناوين 0001 , 0002 , 0003 , 0004, 0005
3. خاطب لو حة المفاتيح لتسجيل المدخلات س , ص
4. خزن س , ص على التوالى فى العناوين 0001 , 0002
5. أجرى عملية جمع قيم العنوان 0001 + 0002 ( س + ص )
6. خزن ناتج العملية السابقة فى العنوان 0003
7. أجرى عملية طرح قيم العناوين 0001- 0002 ( س – ص )
8. خزن ناتج العملية السابقة فى العنوان 0004
9. أجرى عملية ضرب العناوين 0001*0002 ( س * ص )
10. خزن ناتج العملية فى العنوان 0005
11. إطبع على الشاشة كلا من قيم العناوين 0003,0004,0005
12. هل تريد إختبار مدخلات أخرى ؟
13. نعم أريد إنتقل للخطوة (3 )
14.لا أنهى البرنامج
لاحظ الجملة السحرية إنتقل إلى GO TO ، ومع ذلك ظهرت الحاجة لطرق عملية أكثر خصوصا فيما يتعلق بحفظ الخبرة ، ولنقل أنك قمت بعمل مجموعة من الشفرات المتعلقة بالرياضيات ، فهل ستقوم بكتابتها فى كل برنامج جديد مرة أخرى أم الأفضل لك أن تحتفظ بخبرتك وخبرات الأخرين فى ملفات يمكن إستدعاؤها وطلب شفرات معينة منها .
وهنا ظهر أسلوب جديد يعرف بالبرمجة الأجرائية أو الهيكلية Structured Programming ، وهى تعنى بفصل الشفرات فى ملفات منفصلة وإستدعائها كإجراءات يتم تنفيذها .
1. إبدأ البرنامج
2. إحجز العناوين 0001,0002,0003,0004,0005
3. خاطب لوحة المفاتيح لإستقبال المدخلات س , ص
4. خزن المدخلات على التوالى فى العناوين 0001,0002
5. إستدعى ملف شفرة العمليات الحسابية math
6. إستدعى إجراء حساب الجذر التربيعى
7. أوجد جذر س
8. خزن الناتج فى العنوان 0003
9. إستدعى إجراء لوغاريتم العدد
10. أوجد لوغاريتم ص
11. خزن الناتج فى العنوان 0004
12. أوجد ناتج جمع العناوين 0004+0003
13.خزن الناتج فى 0005
14.إطبع ناتج العملية من العنوان 0005
15.انهى البرنامج
وكان هذا الأسلوب ناجحا بشكل كبير ، ويسهل تنقيح ومراجعة البرامج ، وخصوصا الكبيرة منها .
كذلك يحفظ خبرة المبرمجين ، ولكن ظهرت فيما بعد موجة من الأراء حول هل نحن نحاكى الواقع ؟
كذلك يحفظ خبرة المبرمجين ، ولكن ظهرت فيما بعد موجة من الأراء حول هل نحن نحاكى الواقع ؟
هل نحن نمثل الواقع من حولنا ؟ وهل يمكن أن نحاكى هذا الواقع ؟
وظهر ما يعرف بالبرمجة كائنية التوجة أو Object Oriented Programming
نستطيع أن نقول أن الكون من حولنا يمثل تصنيفا Class شاسعا ، تقع تحتة تصنيفات فرعية كالكائنات الحية والجماد .
نستطيع أن نقول أن الكون من حولنا يمثل تصنيفا Class شاسعا ، تقع تحتة تصنيفات فرعية كالكائنات الحية والجماد .
والإنسان ككائن حي يشترك فى نفس خصائص وأفعال مختلف الكائنات الحية ويتميز عنها بخصائص وأفعال تخصه وحده ، كذلك فى حالة الجبال والأنهار كجماد وببساطة نستطيع أن نقول أن الإنسان هو جزء أو كائن Object يتبع تصنيف Class الرئيسيات والذى بدوره يتبع ( يشتق من ) ( يرث ) تصنيف الثدييات من تصنيف الفقاريات وفى نهاية الأمر ككائن حى فى هذا الكون الشاسع .
والإنسان يملك نفس الصفات ( الخصائص ) Properties التى تشاركه فيها مختلف الكائنات الحية مثل التكاثر كصفة والأحساس ويفعل نفس أفعال الكائنات الحية ( يمتلك وسيلة معينة Method لتنفيذها ) مثلا يحس – يموت – ينمو ، ولكنه لا يشترك مع الصخور فى خصائصها وأفعالها .
ومن هنا فإن البرمجة كائنية التوجة تحاول أن تحاكى هذا المنظور الحياتى ، ويوجه المبرمجين شفراتهم نحوه حيث يتعاملوا معها على أنها كائنات وتصنيفات ترث بعضها من تصنيفات أكبر ، مثلا نافذة البرنامج Window هى كائن Object له خصائص Properties كإسم النافذة ، وعنوانها ، طولها ، عرضها / ومكانها على الشاشة ، وكذلك يمتلك مجموعة من الوسائل Methods التى يطبق بها أفعالة
وهى بمثابة أوامر نطلبها من هذا الكائن مثل تحرك Move ، إخفاء النافذة Hide - إظهارها Show ، كذلك فهو يقوم بعمل فعل معين عندما نطلبه منه ، ك الأمر Move يتطلب فعل الحركة من مكان لأخر ، ويقوم المبرمج بمعالجة هذا الفعل عن طريق شفراتة المكتوبة فيما يعرف بمعالجة الأحداث Events ، بحيث نستطيع أن نرشدة للفعل المطلوب أو ماذا سيحدث ؟ ، عند تحريك الفأرة أو ضغط أحد أزرارها ، أو الكتابة من لوحة المفاتيح ، أو إستقبال الباركود ....... إلخ
وبمنظور أكبر نجد أن النافذة ترث كل صفات وأفعال النوافذ والتى بدورها ترثها من نظام التشغيل وليكن Windows .
كذلك فإن تغليف Encapsulation مختلف وظائف وأفعال كائن النافذة بحيث يكون كلا واحدا .
وإلى هنا تنتهي رحلتنا مع هذا العالم الشيق ، وقد حاولت إلقاء الضوء حول أساليب البرمجة وتطورها بشكل بسيط وبدون الدخول فى تفاصيل كبيرة .
تحياتى ،،،
محمد ممتاز ( عاشق النيل )
- هذة المقالة كتبت لصالح جريدة روايات 2 ولكنها لم تنشر كاملة لذلك قمت بنشرها هنا -
شكرا على هذه المعلومات الكافية والوافية
ردحذفوالبسيطة في الفهم