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 من غير ما تتدخل في تفاصيل العنوان ده و تتبعه لأن لغة البرمجة هي اللي بتعمل كل حاجة
Very good explanation :) waiting for the rest of articles :)
ردحذف