Python

نهاية الفصل الأول من : كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون

http://farm3.static.flickr.com/2104/2053402123_171fa3ff41.jpg

تحدثنا سابقا في كتابنا “كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون” عن مقدمة اللغة و كيف تعمل و الجزء الثاني من المقدمة

و ما هي عملية إصلاح الأخطاء البرمجية Debugging ؟ واليوم سأتحدث معك قليلا عن نهاية الفصل الأول وهو :

اللغات الطبيعية واللغات الرمزية

اللغات الطبيعية Natural languages (الإنسانية) هي اللغات التي يتحدث بها البشر مثل العربية والإنجليزية والفرنسية وهي في المجمل لم تطور أو تخلق بواسطة الإنسان (رغم التدخل الإنساني الدائم في التحديث في اللغة وإختلاق مصطلحات جديدة في كل اللغات)

اللغات الشكلية Formal Languages (أفضل أكثر لفظ الرمزية للتوضيح) : وهي اللغات المصنعة بواسطة البشر ولها نظرية خاصة تسمى نظرية اللغات الرمزية ولها إستخدامات في مجالات متعددة مثل رموز علم الرياضيات .. والكيميائيون أيضا يستخدمون اللغات الرمزية للتدليل على العناصر الكيميائية في المعادلات ..
والذي يهمنا في علوم الكمبيوتر هو أن لغات البرمجة عموما هي نوع اخر من اللغات الرمزية صممت خصيصا للتعبير عن العمليات الحسابية التي يقوم بها الكمبيوتر
أما عن وظيفة اللغات الرمزية فيمكننا تلخيصها أنها تضع القواعد الكتابية للغات العلمية بمعنى أننا لو نتحدث عن معادلة رياضية وقلت لك أن 3+3 = 6 هي معادلة صحيحة في التركيب اللغوي الرياضي (إن إعتبرنا المعادلة هي جملة في لغة الرياضيات) لكن إن قلت لك أن 3=+6$ فهي جملة غير مفهومة رياضيا .. وأيضا لو تحدثنا عن رمز كيميائي وقلت لك H2O فأنت تعرف عن ماذا أتحدث لكن لو قلت لك 2Zz فهي بالنسبالك رمز غير مفهوم على الأقل كيميائيا .. ربما عند سكان الكواكب الأخرى يكون عنوان البريد الإلكتروني لشخص ما ! :)

والقواعد النحوية للغات الرمزية تنقسم إلى قسمين هما صحة كتابة الرموز و بناء الجملة المنطقي في حد ذاته .. والنوع الأول يهتم بالرموز الأولية للغة مثل الكلمات والأرقام .. ففي الأمثلة السابقة كما إتفقنا أن كيميائيا لا يوجد عنصر كيميائي بإسم 2ZZ لإن ZZ ليست ذات معنى في الكيمياء .

النوع الثاني هو الترتيب المنطقي للكلمات والرموز في الجملة البرمجية أو المعادلة الكيميائية أو الرياضية .. فغير مفهوم (بالنسبة لنا على الأقل) أن نقول 3+-=5 ! فلعلامة + أو – أو = مكان محدد في المعادلات الرياضية وما غير ذلك غير منطقي رياضيا .

ولكن رغم أن اللغات البشرية واللغات الرمزية يشتركون في النقاط السابقة لكنها أيضا تختلف في أشياء أخرى :

الغموض
في لغاتنا البشرية يمكننا أن نتلاعب بالألفاظ أو نبدل بعض الكلمات مكان الأخرى أثناء حديثنا ولن يسبب ذلك للمستمع لك مشكلة على الإطلاق .. لكن الحواسيب الرقيقة الطيبة لا تعرف التلاعب بالكلمات ! :) يمكنها أن تفهم الكلام بالصيغة المتفق عليها (على الأقل في الوقت الحالي) أعتقد أن مستقبلا يمكن وجود كمبيوتر يفهم الكلام كالإنسان ويتعامل على أساسه من يعلم ؟! :)

غزارة الكلام
في اللغات الإنسانية يمكننا أن نتحدث كثييييرا لإيصال معنى واحد .. لكن مع الماكينات والحواسيب الطيبة الجميلة تحب المختصر المفيد بدون زيادات ليس لها معنى :)

الكلام الحرفي
في اللغات الإنسانية أيضا يمكننا إستخدام إستعارات للأشياء في كلامنا خاصة بين الأصدقاء المقربين تكفي بعض الإشارات الكلامية (حتى بدون قصد) لفهم المعنى .. لكن مع الحواسيب الأمر مختلف .. يجب أن تتمسك بالكلام الحرفي ..

الشعر والكلام الموسيقي

البرامج
المعاني التي يمكن أن نفهمها عندما نقرأ الأكواد البرمجية كما قلنا أنها معاني حرفية لا لبس فيها بأي معاني غير مباشرة ويمكنك أن تفهم البرنامج بشكل مثالي حين تجمع مع قراءة الأكواد الفهم العام لوظيفة البرنامج وتحليله .

يمكنك إستعراض تمارين هذا الفصل من هنا .. شاركني بحلهم ! :) ..

الأن نكون قد إنتهينا من الفصل الأول في كتاب “كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون”

مصدر الصورة

برمجة سعيدة ! :)

التعليقات: 1 | الزيارات: 759 views | التاريخ: 2010/02/21

؟Debugging ما هي عملية إصلاح الأخطاء البرمجية

http://karimali.net/images/error.jpg

عملية البرمجة هي عملية معقدة .. ولأنها تنفذ دائما بأيدي بشرية فينتج عنها دائما أخطاء .. والخطأ البرمجي له إسم شائع باللغة الإنجليزية يسمى Bug أو حشرة ! وقد سميت بهذا الإسم بسبب موقف حدث في عام 1947 في جامعة هارفارد في أحد المشاريع الواعدة لتصنيع كمبيوتر كانت المهندسة Grace Murray Hopper تخطط للمشروع وما إلى ذلك ثم إلتصقت حشرة في مكان مهم من الورقة التي تعمل عليها جريس ! ومن وقتها سميت الأخطاء البرمجية بهذا الإسم نسبة لها .. (يمكنك مشاهدة الورقة الحقيقة التي نتحدث عنها من هنا حشرة تاريخية ! :)

إذا كما إتفقنا الخطأ البرمجي يسمى بـ Bug وعملية اللحاق بهم وتصحيحهم تسمى Debugging .. أو ملاحقة الحشرات !! :)

وهناك 3 أنواع من الأخطاء البرمجية :-

Syntax errors الأخطاء الكتابية :

لغة بايثون يمكنها فقط أن تشغل البرامج التي لا تحتوي على أخطاء كتابية ,, وإلا سيظهر لك مترجم لغة بايثون رسالة يخبرك فيها بوجود خطأ إملائي .. بالتالي لن يتمكن مترجم اللغة من تشغيل البرنامج كليا .. (مترجمات لغات البرمجة Compilers غير رحيمة إطلاقا في تلك النقطة .. لو تعرف أحدها مما يتغاضى عن الأخطاء الإملائية في لغات البرمجة أتمنى أن تشاركني به) على أي حال الأخطاء الكتابية Syntax errors يمكنها أن تعوقك قليلا في بداية تعلمك لأي لغة برمجة .. مع الوقت عندما تزيد مهارتك وخبرتك بها لن تمثل لك أي مشكلة فهي تحتاج إلى تدريب ليس إلا ..

Runtime errors أخطاء تحدث أثناء عمل البرنامج :
وهي من إسمها يمكننا إستنتاج أنها لا تحدث أو تظهر خلال إنطلاق البرنامج وترجمته .. ولهذا النوع إسم أخر أيضا يسمى Exceptions .. ومعناه أنه قد حدث شيء ما بالتالي أدى إلى خطأ برمجي أثناء عمل البرنامج .. وعلى أي حال هي أخطاء برمجية نادرة نوعا ما في البرامج الصغيرة ذات العدة أسطر .. وربما لن تحدث لك إلا بعد فترة وبكتابتك لبرامج كبيرة .

Semantic errors الأخطاء المنطقية :
وهي من وجهة نظري أهمهم وأخطرهم في حياة برنامجك لإن مترجمات لغات البرمجة لا تفهم تلك النوعية من الأخطاء بالتالي سيتم ترجمة برنامجك بنجاح ولكنه لن يعمل بالشكل الصحيح الذي تقصده في جزئية معينة .. مثلا أنك كتبت برنامج يريد أن يقوم بوظيفة معينة سيعتمد على تلك الوظيفة أيضا في مكان أخر من البرنامج (وهو شىء وارد جدا في البرامج الكبيرة) تخيل أنك أخطأت في بعض الحسابات في العملية الأولى ؟ بالتالي سيكون كل عملية بعدها نتيجتها خاطئة ! البرنامج لم يخطأ في هذا ولكنها أخطأ في النتائج مما فهمه البرنامج منك .. كل هذا ببعض اليقظة أثناء عملية التطوير يمكن تفاديه .

عملية إصلاح الأخطاء البرمجية :

هي من أهم العمليات على الإطلاق التي يجب أن تتوافر عندك إن كنت تريد أن تصبح عالم في تطوير البرمجيات أو حتى مطور برامج .. وفي بعض الأحيان يمكنها أن تصيبك بالإحباط (حين تكون الحشرة كبيرة نوعا ما! ) ولكنها في المقام الأول عملية فكرية فيها الكثير من التحدي والمتعة في عملية تطوير البرنامج ..

تصور نفسك كمحقق شرطة .. وتجمع القرائن لحل جريمة معينة ثم تقوم بإستنتاج العمليات والأحداث التي تمت حتى حدثت النتيجة النهائية التي تراها الأن !! مثير أليس كذلك ؟! :)

وهي أيضا كالتجارب العلمية .. عندما تقوم بتجربة وتحصل على نتيجة خاطئة فأنت تقوم بالتعديلات اللازمة ثم تعود من جديد وتستكمل للخطوة القادمة من رحلتك .. مثل شارلوك هولمز قال : عندما تتخلص من تعريف كلمة مستحيل في ذهنك .. فمهما يتبقى في عملك كان يبدو كثيرا ستصل للحقيقة ! (نهاية البرنامج ونجاحه في حالتنا)

بعض الناس يعتبرون عملية البرمجة هي عملية إصلاح الأخطاء البرمجية .. فهم يعتبرون أن البرمجة هي إصلاح خطأ برمجي وراء إصلاح خطأ حتى يعمل البرنامج ككل بشكل صحيح .. طبعا هذا غير صحيح لإن عملية إصلاح الأخطاء هي جزء واحد من عملية تطوير البرنامج ككل ولا يمكنني أن أساويهما أبدا .. فهي حتى لا تأتي في عملية التطوير البرنامج في المرحلة الأولى !

على سبيل المثال نظام التشغيل لينوكس Linux يحتوي على الملايين من سطور الأكواد البرمجية ولكن الفكرة بدأت ببرنامج بسيط جدا (بالمقارنة) كتبه Linus Torvalds وكانت وظيفته العمل على الدائرة الإلكترونية في معالج إنتل Intel 80386 chip .. ويمكن تصويره ببرنامج يقوم بطباعة أأأ و بـ بـ بـ .. هذا البرنامج تتطور حتى أصبح نظام التشغيل لينوكس في يومنا .. فهل يمكن أن نطلق على نظام التشغيل هذا أنه عملية إصلاح أخطاء برمجية ؟!  (مقتبس من دليل مستخدم لينوكس) ..

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

أذكر أن أول قائد فريق عمل Team leader عملت معه قالها لي مرة (على سبيل المزاح) حين وجدني متعصبا بسبب أن البرنامج الذي أشارك في تصميمه لا يعمل وأحاول محاولات عديدة وتظل الأخطاء تظهر .. إن عمل معك البرنامج بشكل صحيح من أول مرة فإعلم أنك أخطأت في شىء ما !! :)   لذلك كلما ظهر لي خطأ برمجي تذكرت كلامه وإبتسمت وإستكملت عملي ! فلا تكره حياتك وقتها ! :D

والسلام عليكم لحين التدوينة القادمة :) ..
التعليقات: 2 | الزيارات: 865 views | التاريخ: 2010/02/13

البداية بكتاب .. كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون

http://karimali.net/images/pyforfuture.jpg

في مدونتي القديمة كنت قد كتبت تدوينتين كمقدمة للغة البرمجة Python الأولى Python – مقدمة والثانية كيف تعمل لغة Python والأن نكمل التحدث أكثر عنها ..

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

بعدها وجدت كتاب How to Think Like a Computer Scientist Using Python وهو كتاب حر لشرح أساسيات اللغة .. ووجدته أكثر من جيد في تلك النقطة الحقيقة بدون تشعبات كثير في البداية .. وبعد مراسلة مؤلف الكتابJeffrey Elkner وأخذت موافقته في السماح بإستخدام هيكل المواضيع في الكتاب والتحدث في نقاطه والزيادة عليها كما أريد .. وكان شرطه أن يظل المحتوى حرا بالنسبة للقارىء باللغة العربية .. وهذا ما أردته من الأساس !! :)

الفصل الأول : الطريق لتطوير البرامج

مقدمة :

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

مع كل ذلك تظل أهم ميزة في عالم الكمبيوتر هي حل المشكلات .. ولحل المشكلة يجب أولا عرض المشكلة , التفكير بطريقة إبداعية في الحلول , و تحديد الحل المناسب بدقة ..

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

في البداية يجب أن تعود مرة أخرى للرابطين في أول التدوينة لمعرفة مقدمة عن اللغة وما يميزها عن لغات البرمجة الاخرى .. في تلك النقطة الأن أريد فقط أن أعود لمفهوم الفرق بين طريقة عمل مترجم لغة البايثون Python Interpreter و المترجمات العادية للغات الأخرى compiler هو أن الـ Interpreter يقرأ البرنامج في مستوى High Level ثم يقوم بتنفيذه مباشرة .. بمعنى أنه يقوم بالقليل من العمليات في وقت قصير للتنفيذ .. لكن الـ compiler يعمل بطريقة مختلفة فهو يقوم بقراءة سطور البرنامج كلها من البداية لتنفيذها كاملة قبل عمل البرنامج في حد ذاته .. في هذه الحالة تسمى الأكواد البرمجية Source Code .. والبرنامج المترجم يسمى object code أو executable فبمجرد أن يتم تشغيل وترجمة البرنامج ككل يمكنك إستخدامه كما تشاء بدون أي عمليات ترجمة إضافية من الكمبيوتر ..

يمكنك فهم الأسلوبين بطريقة أخرى في الشكليين التاليين :-

Interpreter

Compiler


ولكن أيضا بعض لغات البرمجة الحديثة تستخدم الأسلوبين معا في تنفيذ وترجمة البرامج .. في البداية تقوم بالترجمة للغة في مستوى Low Level تسمى byte code ثم بعد ذلك تقوم بعملية مشابهة لما يقوم به الـ Interpreter أو بما يسمى virtual machine (وهو يشبه المستخدم في لغة Java والبرامج المطورة بإستخدام بيئة Net. .. وفي الحقيقة أن بايثون أيضا تستخدم الأسلوبين معا في ترجمة البرنامج ولكن أشتهر مع الكثير من المبرمجين وطريقة عملهم معها كـ لغة تعمل بالـ Interpreter ..

وهناك طريقتان مشهورتان للتطوير ببايثون هما Shell Mode و Script Mode .. في النوع الأول يمكنك كتابة الأكواد في الـ Shell “وهو سطر الأوامر في أنظمة التشغيل مثل اليونكس واللينوكس” و الـ Interpreter يقوم بعرض النتائج مباشرة كالمثال التالي ..

$ python
Python 2.5.1 (r251:54863, May 2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> print 1 + 1
2

والسطر الأول في الأكواد السابقة وظيفته تشغيل الـ Interpreter في نظام التشغيل .. الثلاث سطور التالية هي سطور يكتبها النظام .. السطر الخامس الذي يبدأ بـ <<< هو أمر من أوامر اللغة ويسمى بـ Python prompt يكتب النظام هذه الرموز ليخبرنا أنه على إستعداد لإستلام وتنفيذ الأوامر البرمجية .. ثم  في نفس السطر كتبنا الأمر print 1 + 1 بمعنى إطبع نتيجة العملية 1 + 1 وفي السطر الأخير هو طباعة نتيجة العملية مباشرة ..

أما عن طريقة كتابة بايثون عن طريق Script .. فيمكننا كتابة السطر print 1 + 1 في ملف فارغ بإستخدام أي محرر نصوص Text Editor ونسميه مثلا firstprogram.py ونلاحظ هنا أن أي برنامج يكتب بلغة بايثون يكون في ملف منتهي بـ py. .. ثم نقوم بتنفيذه بإستخدام الـ Interpreter كالتالي

$ python firstprogram.py
2

وجدير بالذكر هنا أن إسلوب الـ Shell مناسب عند كتابة عدد صغير من سطور الأكواد بسبب ظهور النتيجة بشكل مباشر .. فكر فيه بإستخدامه كورقة بيضاء للتجربة خارج البرنامج الأساسي لتجربة شىء ما بشكل سريع .. أما إن زاد البرنامج عن عدد أسطر صغير يجب كتابته في ملف منفصل بإمتداد py. كما أشرنا في المثال السابق ..

في النهاية أريد أن ألفت نظرك أن بحثك عن معنى مصطلح ما بشكل موسع مما جاء في هذه التدوينة سيزيد من فهمك لموضوعنا والتعمق فيه .. يمكنك البحث بصفة عامة على الإنترنت أو البحث بصفة خاصة على موقع Wikipedia ..  أو ببساطة تقوم تكتب سؤالك في رد على التدوينة ! :)

مصدر الصورة

والسلام عليكم لحين التدوينة القادمة و برمجة سعيدة :) ..

التعليقات: 5 | الزيارات: 1,006 views | التاريخ: 2010/01/26

Switch to our mobile site