الثلاثاء، 31 مارس 2009

مفاهيم حول البرمجة

بسم الله الرحمن الرحيم السلام عليكم و رحمة الله و بركاته الهدف من هذا المقال سنحاول في هذا المقال تسليط الضوء على بعض المبادئ و المفاهيم الاساسية في عالم البرمجة . 1- دردشة حول لغات البرمجة : كلنا يعرف ان البرمجة عبارة عن لغة تواصل بين المبرمج و النظام , بحيث ان النظام يملك عدة لغاة تواصل مع المستخدمين و مع الآلة في نفس الوقت . فنظام التشغيل هنا يلعب دور الوسيط بين المستخدم/المبرمج و الآلة الفزيائية فمثلا يتخاطب النظام مع المستخدم العادي بواسطة ازرا تقوم بعمل محدد , بواسطة رسائل توجيهية و كذلك المستخدم العادي يتواصل مع النظام عبر واجهة رسومية مبسطة لا تتطلب معرفة واسعة بالنظام . انت مثلا عندما تنسخ ملف من قارء الاقراص الى القرص الصلب تقوم بعمل كوبي ثم كولي فقط , لا تحتاج لمعرفة كم وحدة حجز يتطلبها الملف او كم هي المساحة التي ستخصص في الذاكرة العشوائية لاتمام هذا العمل , او العنوان الرقمي الذي سيخصص للملف داخل القرص الصلب ... الخ اذا النظام هنا يتعامل مع المستخدم العادي بواسطة واجهة رسومية مبسطة . المبرمج يملك ميزة تفرقه عن المستخدم العادي , لان المبرمج يتقن التحاور مع النظام بلغته مباشرتا , المبرمج لا يستعمل الازرار بل هو الذي ينشئ الازرار و يحدد علمها بمساعدة نظام التشغيل . و هنا نستطيع ان نقول ان نظام التشغيل يمثل مزرعة خصبة للمبرمج او مختبر شخصي , و بهذا يصبح المبرمج مستخدم فعال ينشئ و ينتج اما المستخدم العادي يبقى عبارة عن مستهلك و كل هذا يمر عبر نظام التشغيل . و حتى بيت المبرمجين مقسم الى عدة طوابق , فكما قلنا سابقا النظام يحتوي على عدة لغاة مرتبة من الاسفل الى الاعلى . ابتداء من الآلة الفزيائية وصولا الى الواجهة الرسومية و هذا ما سنراه في الفقرة التالية 2- مستويات لغات البرمجة : 1-2 مقدمة لو وضعنا جهاز الكومبيوتر تحت المجهر مالذي سنرى ؟؟ سنرى الآلاف من النواقل النحاسية Bus التي تربط بين مختلف مكونات الجهازلو تعمقنا اكثر سنرى اشاراة كهربائية تمر بسرعة فائقة عبر هذه النواقل ببساطة هذا هو جهاز الكومبيوتر لدينا اشاراة كهربائية مختلفة مثلا 5 فولت يعبر منطقيا عن 1 و لدينا -5 فولت يعبر منطقيا عن 0 . لا حظوا جيدا في الجملة السابقة تكون لدينا تقسيم اولي , اشارة فيزيائة (آلة فيزيائية ملموسة) و نظام منطقي اذا نقطة الصفر هي x فولت , نرتفع للطابق الاول سنجد اسقاط منطقي و تتحول الـ x فولت الى عدد منطقي (0 او 1) اذا كل تلك البيانات المتناقلة بين مكونات الجهاز اصلها اشاراة كهربائية اما سالبة او موجبة السالب يعبر عن قيمة منطقية 0 و الموجب يعبر عن القيمة 1 و من هنا يتكون لنا النظام الثنائي système binaire و كما يسمى النظام الرقمي système numérique فمن ابسط شيئ كملف يحتوي على كلمة hello وصولا الى البرامج الضخمة كلها تحول الى نظام ثنائي ( 01011101010101) لكي تعالج من طرف الآلة . اذا بعد الاشارة اكهربائية الموجبة و السالبة , اللغة الوحيدة التي يتقنها الكومبيوتر هي النظام الثنائي . نحن الآن نستعمل النظام العشري , فمثلا العدد 2 في النظام العشري يقابله 10 في النظام الثانئي 3 ---11 4----100 5----101 9----1001 2009----11111011001 و هكذا ... حتى الحروف تحول الى نظام الثنائي ليتمكن الجهاز من معالجتها , و قبل هذا تحول الى ترميز Ascii او EBCEDIC .. مثلا حرف A يحول الى النظام التشفير ASCII فيصبح 65 و الـ a الصغيرة يعبر عنها بـ 97 . ثم تحول 65 الى نظام الثنائي فتصبح 1000001 و هكذا يعني ان الحرف A الكتابي في لغة البشر يتحول الى 1000001 في لغة الآلة . حرف امام حرف و عدد امام عدد تتكون لنا سلسلة طويلة من النظام الثنائي 0101010101111100011101101 لدينا اصغر وحدة هي البت bit اما يكون 1 او 0 عند تكون 8 اعداد تصبح كلمة mots اي 1 اوكتي 1 octets و هي اصغر تجميعة متعتمدة بالآلة . و يجمع الجهاز تلك السلاسل الى وحدات اما 8 او 16 او 32 او 64 بت نحن كبشر يصعب علينا التحاور مع الجهاز بهذه اللغة , تخيل حرف A فقط يقابله 1000001 بت ناهيك عن الترميز codage و بت الانطلاق و بت النهاية .. الخ كل هذا لحرف واحد ,فما بملاين الجمل !! لهذا توجد مترجمات بالجهاز تقوم بترجمة الاحرف و الاعداد تلقائيا الى لغة الالة . تسمى هذه المترجمات بـ المترجم compilateur او المفسر interpréteur تترجم الاكواد البرمجية الى لغة الآلة فتقوم هذه الاخيرة بمعالجتها ثم تترجم النتائج مرة اخرى من لغة الآلة الى لغة برمجية مفهومة . شيفرات برمجية ---------> المترجم/المفسر ---->لغة آلة---> معالجة –> نتائج - كما ان لغة الآلة مقيدة (بـ 1 و 0 ) و محددة بطرق ترميز صارمة فان لغاة البرمجة ايضا تسير وفق نفس النهج , فهي عبارة عن كلماة محددة او بتعبير آخر صيغة محددة يتوجب على المبرمج اتباعها لكي يحصل على النتائج المرجوة مثلا لطباعة رسالة بلغة السي يتوجب علينا استعمال الكلمة printf و بصيغة محددة لا نستطيع تعديها , و هي وضع الرسالة بين قوسين و علامات تنصيص ثم نختم السطر بـ نقطة فاصلة مثالكود PHP: [left]printf (« hello world »); [/left][right][/right] فعلى المبرمج اتباع هذه الصيغ و القوانين الصارمة لحل المشكلة , فلقد وضعت هذه الصيغ لتنظم طريقة العمل , فهي تساعد المبرمج و لا تقيد عمله بل تنظمه . و هذا لامر لا يخص لغاة البرمجة فقط بل ان كل مجال يتعامل مع صيغ خاصة به فالكيميائ يتبع صيغ خاصة للحل معادلاته و المعماري يتبع قوانين صارمة للتشيد بناؤه , كذلك الرياضي يتبع منهج مقيد لحل المعادلات . و من هنا تنتج لنا طريقة التفكير , نسمع الناس تقول ذاك يملك تفكير رياضي , الآخر يملك تفكير فيزيائي .. الخ و الكل يشترك في امر واحد لدينا مشكلة تتطلب حلول لايجاد الحلول نتبع الصيغ و نطبق قوانين .. فمهمة المبرمج الاساسية هي حل مشاكله باتباع تفكير برمجي . انت جوعان , و تريد الذهاب للثلاجة لتبحث عن اي شيئ يؤكل اي شخص عادي سيقوم بفتح الثلاجة و ياخذ وجبة و ينتهي الامر المبرمج لديه طريقة خاصة في تنفيد هذه الحركة اولا سيعتبرها مشكل , و يجب ان يضع لها الحل المناسب الذي لا يقبل الخطئ اولا يتفقد ان كانت هناك ثلاجة بالبيت اذا لم تكن هناك ثلاجة سيرسل لنفسه رسالة خطئ تعلمها انه لا توجد ثلاجة بالبيت اذا كانت هناك ثلاجة , يحدد مكانها , ثم يتقدم لها افتح الثلاجة , ينشئ قائمة لكل محتويات الثلاجة , ثم يرسل هذه القائمة للمعدة المعدة بدورها ستعيد ترتيب هذه القائمة ترتيبا تصاعديا حسب ما تشتهيه ثم تعيد القائمة مرة اخرى يقوم المبرمج بقراءة القائمة و يذهب لاول اكلة اختارتها المعدة يتفقد الاكلة , هل هي صالحة , اذا كانت كذلك يستخرجها و يغلق الثلاجة ثم يبعث رسالة تحمل اسم الاكلة المختارة . - اذا حدث ام آخر يمر للاكلة الثانية بالقائمة و هكذا........ هذا ما يسمّى بالتحليل البرمجي او التفكير البرمجي (المنطقي) , و كل الخطواة السالف ذكرها تعتبر خوارزميات لحل مشكل . لدينا فكرة , نعم فقط فكرة . كمبرمج ستعتبر كيفية انجاز هذه الفكرة مشكلة , و كمبرمج ايضا يتوجب عليك وضع حل او مجموعة حلول لهذه المشكل . عن طريق صيغة محددة تسمى لغة برمجة . لماذا برمجة ؟؟ لانك ستاخذ مجموعة من المعطيات او البيانات , تقوم بتحليلها خطوة بخطورة , كل نتيجة تؤدي الى بيان ثم يعالج هذا البيان ليتحول الى نتيجة اخرى و هكذا حتى تتتحول كل هذه المعطيات الى نتائج . اذا انت هنا تقوم ببرمجة معلومة مبدئية عبر عدة مراحل لتعطي نتيجة محددة . تعمل هذا الامر مرة واحدة فقط (اثناء كتابة الكود) , ثم تصبح تلك الشيفرات المعقدة الى جسم متكامل يسمى برنامج يقوم هذا البرنامج باخذ معطيات و تحويلها الى نتائج تلقائيا (مبرمج) . مهما اختلفت مستويات لغات البرمجة فكلها يؤدي نفس العمل .2-2مستويات لغات البرمجة - تنقسم لغات البرمجة الى قسمين رئيسيين لغات عالية المستوى و لغات منخفضة المستوى -*- اللغات المنخفضة المستوى : تكون هذه اللغات قربية جدا من لغة الآلة اي ان صيغتها الكتابية شبيه و الاصح قريبة من صيغة الآلة و نذكر منها لغة الاسمبلي التي يسميها البعض لغة الآلة و هذا خطئ لانها الاقرب للآلة و ليست لغة الآلة بل تدخل في صنف اللغات التجميعية (لغات منخفضة المستوى) . تسمّى بالغات التجميع او لغات الترميز , لانها تعتمد على تجميع (ترميز) للتعبير عن لغة الآلة . من مميزات هذه اللغات انها تترجم بسرعة و هذا منطقي جدا , فمادامت قريبة للآلة لن ينشئ ترميز كبير لشيفرا هذه اللغات بعد ترجمتها من طرف المترجم او المفسر . ايضا تكون صيغتها صعبة و معقدة , و لاكواد طويلة جدا لكن عند التحويل او ترجمة هذه الاكواد للنظام الثنائي يكون هذا الاخير صغير و ذو ترميز بسيط مقارنتا بالغات العالية المستوى . كما انها تمنح للمبرمج قوة و صلاحيات عالية على حساب الوقت و الجهد طبعا . -*- لغات عالية المستوى : تكون هذه اللغات اقرب للمستخدم و ابعد عن الآلة , و نذكر منها لغة السي الباسكال البايثون الجافا البير روبي .. الخ صيغتها سهلة و مفهومة للبشر لانها تعتمد على لغتهم مثال print التي تعني اطبع بالانجليزية ,و لكن عند ترجمة اكواد هذه اللغات الى لغة الآلة ستأخذ ترميز كبير و معقد كثيرا و هذا يعني انها تأخذ وقت اطول للترجمة بالمقارنة مع اللغات المنخفضة . و مع ذلك تبقى هذه اللغات احسن توجه لحل المشاكل او انجاز المشاريع لانها سهلة و لا تأخذ وقت طويل في كتابة الاكواد , ضف لها سهولة تتبع الاخطاء على عكس اللغات المنخفضة , مثلا في لغة الاسمبلي يعتبر البحث عن خطئ وسط شيفراته المعقد و الطويلة كابوس حقيقي للمبرمج . و تبقى اهم ميزة هي قابلية النقل (محمولة) تستطيع ترجمة و تنفيد كود بلغة الجافا على اي جهاز (بنية جهاز) دون التغيير على محتوى الكود على خلاف الاكواد المكتوبة بلغة منخفضة تتطلب تعديلات كثيرة لتنفيدها على آلة اخرى و في بعض الاحيان يلزمك اعادة كتابة مشروعك ليتناسب مع آلة اخرى . 3- مراحل تنفيد الكود : 1-3 : المفسر و المترجم يستعمل المبرمج المحرر (editeur) للكتابة اكواده , و توجد انواع عديدة من المحررات ابسطها البلوك نوت blocnot تفتح هذا الاخير ثم تنشئ ملف جديد , تكتب الكود ثم تحفظ الملف بامتداد الخاص بالغة التي تستعملها (بايثون .py السي .c السي++ .cpp ..الخ) عند انهاء هذه الخطوة يتكون لديك ملف لكود مصدري code source ثم تنفد هذا الملف عبر المترجم او المفسرتوجد محررات متطورة تمنحك خاصية التلوين , و التنفيد , تتبع الاخطاء .. الخ و توجد بيئات تطوير تحتوي على العديد من الخاصيات المفيدة . فمهما اختلفت المحررات تبقى تعتمد على المفسر و المترجم طيب ما هو المفسر و المترجم ؟؟ يقوم المترجم/المفسر بتحويل (ترجمة/تفسير)ملف السورس (المكتوب بلغة عالية او منخفضة المستوى) الى لغة الآلة اي النظام الثنائي و يصبح الملف قابل للتنفيد . -*- في حالة المفسر , يقوم هذا الاخير بتفسير الكود سورس الى لغة الآلة كلما اردنا تنفيد الكود , بحيث انه يحول كل سطر على حدى للغة الآلة مباشرتا و ينفده في حينه . مثلا الكود يحتوي على عشرة اسطر , يقوم المفسر بتحويل السطر الاول للغة الآلة ثم ينفده اذا لم يحدث خطئ و يمر للسطر الثاني ... الخ -*- المترجم يقوم بترجمة كل الكود مرة مرة واحدة ,على عكس المفسر , المترجم يقوم بقراءة كل السطور ثم ينشئ ملف جديدي يسمى بكود اوبجيكت code object , و هذا الاخير عبارة عن ملف تنفيدي نستطيع تنفيده اي وقت دون اعادة ترجمة الكود مرة اخرى . اذا المترجم يقوم بـ : قراءة كل محتوى الكود المصدري . اذا لم يحتوي الكود على اخطاء , يحول المترجم الكود المصدري الى ملف تنفيدي (كود اوبجيكت) -بلغة الآلة- ينفد هذا الملف , و تظهر لنا النتائج على الشاشة لكل طريقة محاسن و مساوء . المفسر يفيدك كثيرا في تتبع الاخطاء في الاكواد الطويلة , لانه يمر عليها سطر بسطر (امر بامر) , و يتوقف عند الخطئ مباشرتا , يعني ان كان الكود يحتوي على 500 سطر , و السطر 23 يحتوي على الخطئ . سينفد المفسر 22 سطر الاولى ثم يتوقف عند السطر الثالث و العشرين , في حالة المترجم سيقوم بترجمة كل 500 سطر ليظهر لك رسالة خطئ في السطر 23 و هذا ما ياخذ وقت اطول . لدينا المترجم اسرع من المفسر في تنفيد الكود خاصتا ان كان هذا الكود يحتوي على اعمال معقدة , احسن خيار للتنفيد المشاريع الكبيرة هو المترجم نظرا للسرعته و هذا منطقي , لانه ينشئ ملف تنفيدي للكود مرة واحدة فقط , حتى لو نفدنا المشروع عشرين مرة على خلاف المترجم الذي ينشئ ملف تنفيدي لكل سطر من المشروع في كل مرة . قام المطورين باستخلاص محاسن كل طريقة و طبقوها على اللغات الجديدة كالجافا و البايثون التي تستعمل مترجم و مفسر معا . مثلا لدينا كود مصدري مكتوب بلغة البايثون . اولا يقوم المترجم بترجمة هذا الكود الى ملف يسمى بالـ بايت كود byte code بصيغة وسيطة بين لغة البايثون و لغة الآلة ثم يقوم المفسر بتحويل ملف البايت كود الى لغة الآلة (سطر بسطر) . و في هذه الحالة سنستفيد من النقاط التالية : -*- باستعمال المفسر يستطيع المبرمج معاينة اجزاء مشروعه خطوة بخطوة اثناء كتابة المشروع , مثلا المشروع يحتوي على خمس اجزاء . عند الانتهاء من كتابة الجزء الاول و الثاني يستطيع معاينتهما لان المفسر كما قلنا يمر على الكود سطر بسطر .. ثم يضيف الجزء الثالث و الرابع , اذا حدث خطئ في الجزء الرابع سينفد الجزء لاول و الثاني و الثالث بصورة عادية و يتوقف التنفيد عند الجزء الرابع . وهذا مفيد جدا لمعاينة المشاريع الكبيرة . -*- تفسير البايت كود الى لغة الآلة يكون اسرع بكثير لاننا كما قلنا ملف البايت كود وسيط بين الغة الكود المصدري و لغة الآلة -*- ملف البايت كود يكون قابل للنقل (محمول) تستطيع تنفيده في اي جهاز آخر دون تغيير اي حرف . طبعا كل ما تكلمنا عليه من مراحل تجرى تلقائيا عند ضغط المبرمج على زر تنفيد run .بعض المصادر المعتمد عليها ويكي بيديا python note

ليست هناك تعليقات: