الاثنين، 28 يناير 2013

Intro. to Programming - Lesson 1


Intro. to Programming - Lesson 1

يعني ايه برنامج ؟
البرنامج هو مجموعة من الخطوات المكتوبة بلغة برمجة معينة بتقول للـ computer  ازاي يأدي task  معينة
التعريف اللي فات لو شلت منه "لغة برمجة" بقى تعريف حاجة تانية اللي هو algorithm  و هو مجموعة من الخطوات لا تعتمد على لغة برمجة معينة.
الـ computer هو machine  لو هتبسطها لأقصى درجة ممكن تعتبرها مجموعة من الswitches  اللي بتكون حالتها يا اما on  او offـ
في حالة on  أو high voltage  بنديها قيمة 1  و في حالة off  أو low voltage  بنديها قيمة 0
عشان كده الcomputer  مبيفهمش حاجة غير الصفر و الواحد.
طيب معنى كده انك لو عايز تكلم الكمبيوتر تطلب منه يعمل عملية معينة لازم تقوله الكلام ده باللغة اللي هو بيفهمها اللي هي صفر وواحد ، طب ازاي ؟ هل ده ممكن ؟
لأ طبعاً عشان كده ظهرت لغات البرمجة
لغة البرمجة هي عبارة عن لغة تخليك تقدر تعبر عن الـ instructions  اللي في البرنامج
كل computer  ليه حاجة اسمها machine language  اللي هي طريقة فهمه للأصفار و الوحايد، و ممكن تختلف من جهاز لجهاز تاني. عشان كده لغة البرمجة بتوفر Interface  اسهل و احسن للتعامل مع الـ computer
بس برضه ، لسه الجهاز مبيفهمش غير الصفر و الواحد ؟ ازاي نخليه يفهم الاوامر اللي مكتوبة بلغة البرمجة دي؟
عشان كده لازم تكون فيه حاجة بترجم من لغة البرمجة للغة الـ machine  اللي بيفهمها الcomputer ، فيه نوعين أساسيين من الترجمة compilation , interpretation  
اولاً compilation : بيحوّل الكود كله اللي مكتوب بلغة البرمجة دي لـ machine code  قبل ما يبدأ ينفذه
ثانياً interpretation  : بيترجم الكود سطر بسطر لـ machine code  في كل مرة بيجي ينفذه فيها (أثناء التنفيذ)
مستويات لغات البرمجة :
فيه مستويين أساسيين من لغات البرمجة ، المستوى الأول لغات قريبة من لغة الـ machine  و تسمى low-level programming languages  و المستوى التاني قريب اكتر من اللغات البشرية (الانجليزي) و تسمى high-level programming languages
مثال: لو عايز تكتب برنامج بسيط بيجمع 2 + 3
لو هتكتبه بلغة low-level  زي الـ assembly  هيكون شكله كده
LDA R1,#2
LDA R2,#3
ADD R3,R1,R2
انت هنا بتتعامل مع Registers و addresses  مباشرة ، و ده موضوع صعب
لو هتكتب بلغة high-level  زي الـ c  هيكون كده
int x = 2+3;
طرق الترجمة :
قلنا قبل كده ان عشان الcomputer  يفهم البرنامج لازم يترجم من اللغة المكتوب بيها للغة الـ machine  و قلنا ان فيه طريقين اساسيين هما compilation  و Interpretation  فيه طريق تالت mixed  بين الاتنين
ده بيترجم البرنامج من لغة البرمجة المكتوب بيها إلى لغة وسيطة intermediate language  بتشتغل على حاجة اسمها virtual machine  بغض النظر عن الـ architecture  أو الـ platform  بتاع الـcomputer
من اشهر اللغات اللي بتشتغل بالطريقة دي java  بتحول الـ source code  لحاجة اسمها byte-code  بيشتغل على virtual machine  اسمها java virtual machine  بغض النظر عن الـcomputer  يعني مبتتحولش لـ machine code  او أحياناً بيتحول أجزاء قليلة لـ machine code  عشان يـعمل optimization  للكود على الـ machine
طيب ازاي ابقى مبرمج ؟
فيه ناس فاهمة غلط انك عشان تبقى مبرمج كل اللي مفروض تعمله انك تتعلم لغة برمجة و قواعدها و تبدأ تكتب برامج ، لأ الموضوع اكبر من كده
المبرمج هو واحد يقدر يحلل مشكلة معينة و يفهمها كويس و بعدين يوصل لحل ليها و بعدين في الآخر يعبّر عن الحل ده في صورة برمجية
بمعنى ان لغة البرمجة هتكون معاك tool  مش هي هدفك
طيب ازاي اعرف احل مشكلة معينة ؟
حل معظم المشاكل بيعتمد على الرياضيات  و الهندسة و بعدين بعد كده تكون ملم بالـ algorithms  المشهورة و الـ design patterns  عشان تعرف تعمل انت algorithm  باستخدام اللي اتعلمته
بعد كده لازم تعرف لغة برمجة كويسة ، و تكون ملم بقواعدها و معانيها ، عشان تقدر تعبّر عن الحل بتاعك في صورة برنامج ، و مش شرط تكون عارف لغة برمجة واحدة بس ، لأ يستحسن تكون عارف اكتر من لغة و بمجرد ما تعرف لغة واحدة و تعرف تقرا algorithm  هتلاقي سهل انك تتعلم اي لغة تانية
لازم تتدرب على حل المشاكل و كتابة برامج ، مش بس تقرا و تتعلم ، لازم تدور على مشاكل فعلية و تحاول تحلها و تكتب برامج تعبر عن الحل ده و تغلط كتير وتتعلم من الغلط
آخر حاجة و من اكتر الحاجات المهمة ، انك تقرا source codes  كتير ، فيه برامج كتير open-source  بمعنى انك ممكن تنزل الكود اللي مكتوبة بيه و تقراه و تعدل فيه و تجرب ، ده من اكتر الحاجات اللي ممكن تزوّد خبرتك كمبرمج
لغة السي C  :
C  من أوائل لغات البرمجة High level  أسسها واحد اسمهDennis Ritche  في الفترة من 1969  لـ 1973  عشان يسهل عملية كتابة البرامج في الوقت اللي كانت مستخدمة فيه اللغة الـ Low-level  زي الـ assembly
بعد كده معظم لغات البرمجة جت مباشرة من الـ c  زي c++ و c#  و java و python و php  فممكن نعتبر c  هي أساس جميع لغات البرمجة الحالية
في البداية مكانش في standards  معينة للسي ، و كان كل الـ developers  بيعتمدوا على القواعد اللي موجودة في كتاب مؤسس اللغة اللي بيشرح فيه الـ C  و قواعدها
بعد كده في سنة 1989 بدأ American National Standards Institute  يحط standards  للـ C  و اتسمت ANSI C  أو C89
بعد كده بدأت كل فترة يتضاف مجموعة من الStandards و التحسينات للـ C  زي C99 و C11
الC  لغة imperative  بمعنى انها بتعتمد في كتابة البرنامج على مجموعة من الاوامر اللي بتتنفذ ورا بعض ، وممكن تحط مجموعة من الاوامر مع بعض في حاجة اسمها routine  أو function  هنتكلم عنها بعد كده
من أكتر مميزات الـ C  انك ممكن من خلالها تعمل Access  للـ memory  مباشرة باستخدام حاجة اسمها pointers  هنتكلم عنها بالتفصيل ان شاء الله
أنظمة الأعداد :
النظام الشائع اللي بنستخدمه دايماً هو النظام العشري أو decimal  أو base-10   بيتكون من 10 ارقام هم من 0 لـ 9 بعد كده لما يخلصوا بتبدأ تضيف خانة جديدة و تعيد من الأول زي ما احنا عارفين
رقم مثلاً زي 735  لو عايزين نفهم قيمة كل رقم هنلاحظ التالي
 
1
10
100
5
3
7


اول خانة على اليمين بتكون قيمتها المكانية واحد (آحاد) بعد كده الخانة اللي بعدها تضرب في 10 بعدها تضرب في 10 كمان
بمعنى ترجمة الرقم تكون 5 x 1 + 3 x 10 + 7 x 100
كقاعدة عامة ، في أي نظام أعداد أول خانة على اليمين قيمتها المكانية بتكون 1 ، الخانة اللي بعدها قيمتها المكانية بتساوي الـ base  بتاع النظام (النظام العشري base 10  ) بعد كده تضرب تاني في الbase  ( 10x10  ) و هكذا
النظام الثنائي عارفين انه بيتكون من رقمين بس 0  و1 بمعنى انه base-2
لو خدنا عدد زي 101
1
2
4
1
0
1



لما نطبق القاعدة العامة اللي قلنا عليها قبل كده ، يبقى زي ما قلنا اول خانة قيمتها المكانية 1 يعني هتضرب في 1
بعد كده الخانة اللي بعدها هتضرب في base  بتاع النظام اللي هو 2
اللي بعدها هتضرب تاني في base  بتاع النظام (2x2 )  و هكذا
يعني لو عايزين نحول الرقم ده من Binary  إلى decimal  هيبقى
1x 1  + 2 x 0  + 4 x1  = 5
الخانة الواحدة في binary  بتكون اما 0  أو 1  و تسمى bit  و مينفعش تحتوي أي قيمة تانية
نظام العد برضه نفس العد في أي نظام
هيكون كالتالي
0
1
هتلاقي الارقام خلصت ، فلازم تزود خانة جديدة و تبدأ من الاول
10
11
خلصت تاني تزود خانة جديدة و تبدأ من الاول
110
111
و هكذا

النظام السداسي عشر Hexadecimal  :
من اسمه واضح انه بيتكون من 16  رقم يعني من 0 لغاية 15
بس مثلاً لو كتبنا 10  هنفهم ازاي انه 10 مش 0 و جنبه 1  ؟ زي binary  
عند 10 الارقام لسه مخلصتش و بنزود خانة ، لأ 10 ده رقم واحد ولسه بعده ارقام
عشان كده الارقام من بعد 9  بتاخد حروف من A  لغاية F
يعني العد يكون كالتالي
0 , 1 , 2 ,3 ,4 ,5 ,6 ,7 8, 9 , A ,B ,C ,D,E, F
كل رقم Hexadecimal  يتخزن في 4 –bit binary  
طب ليه ؟
نشوف اكبر رقم هو كام في hexadecimal  هو F  طب قيمته Decimal  هي 15
طب ازاي نمثل 15 decimal  ك binary  ؟
هنخزنها كده
1
2
4
8
1
1
1
1


يعني هتستخدم 4 bit  عشان كده كل رقم hexadecimal  بيتخزن في 4-bits binary
RAM (Random Access Memory)
هي نوع من انواع ال Memory  المتطايرة volatile  بمعنى ان أول ما تفصل power  عنها بتفقد كل محتواها
الـ RAM  بتحتوي كل الـ Data  اللي بتستخدمها البرامج ، اي حاجة يتم التعامل معاها او تشغيلها يتم وضعها في RAM  عند عنوان محدد متعرفوش ، نظام التشغيل هو اللي بيختار العنوان ده
الData  بتتخزن على هيئة word  أو bytes  و كل byte  ليها address  معين في memory  
طيب انت خزنت Data  معينة و عايز تجيبها تاني بعد كده او تعرضها ، هل لازم تعرف العنوان ده عشان تعرف تجيبها ؟ لأ طبعاً ، انت مش ممكن تعرف الـ data  هتتخزن فين و تفضل تتبعها في memory
لغة البرمجة هي اللي بتقوم بالوظيفة دي ، لما تيجي تخزن data  بتديها اسم معين (انجليزي) و لغة البرمجة بتعرف ان الاسم ده مرتبط بعنوان معين في RAM  من غير ما تتدخل في تفاصيل العنوان ده و تتبعه لأن لغة البرمجة هي اللي بتعمل كل حاجة

هناك تعليق واحد: