للاساله والناقش :
اضغط هنا صباح الخير او مساء الخير مطرح متكون ولو كنت مخنوق مساء الزفت او صباح الزفت عليك وعلي الي

just kiddin
الموضوع ده متطلب منك انك تكون شغال عي Linux system
ويكون عندك بروسيسور Intel IA32 باي حال x86
وانك تكون علي خلفيه ولو بسيطه بال Assembly
وقليل من التعامل مع GDB
دلوقتي في حاجه مريبه وغريبه النت كله بيتكلم عنها ! كل متكلم حد يقلك بعمل كومبايل للكيرنيل ! بعمل كومبايل للبرنامج الفلاني ! بستبت برنامج كذا تفرح انت وتقول اخيرا واحد بيستب مش بيعمل كومبايل تقله اذاي يقلك بعمله كومبايل تحس انك حترمي نفسك من فوق السرير وتخلص نفسك من التعاسه الابديه ! انسي بقي الكلام ده من النهرده مع منتجات ستورم بروجرامينج فريكس دوت نيت مقابل 55 قرش للدقيقه هتاخد

لا ثواني العمليه وسعت نرجع تاني !!
حقيقي نتكلم بجد , يعني ايه كومبايل ؟
واذاي بيتم واذاي بيحصل ؟
وشكل البرنامج في الميموري بيبقي عامل اذاي ؟؟
واذاي الفنكشنس بتستعدي وبعدين بترجع للفنكشن الي قبليها وهكذا دواليك ؟
اذاي المتغيرات بيتحجزلها مساحه ؟
يعني ايه static memory ويعني ايه global
? ! ايه ال هnitialized data وايه ال unitialized data ? كل ده هتعرفه في سلسلة المواضيع ديت , لاحظ ان الموضوع احتمال يبقي طويل علي ماأظن لانه هيتكلف وقت رهيب وهياخد امثله وحاجات كتير , فهتبع سياسة احد اصدقائي hackobacko في الحالات الي ذي ديت وهفتح موضوع تاني للاستفسارات عشان مفيش حاجه تخش في بعضها في الاسالة التانيه , ركز بقي معايا وسيبك منها دلوقتي

عمرك فكرت ال source code بيتنفذ اذاي ؟
واذاي جهازك بيقدر يفهمه بالرغم انك عارف ومتأكد ان الجهاز مش بيفهم اي حاجه اكتر من لغة ال 0 وال 1 , وان الجهاز مش بيقدر يعمل اي حاجه اكتر من انه يعمل مجموعه من العمليات الحسابيه وانه ياخد مكان من الذاكره ويطبع عنوانه في register ما
وبعد كده يقوم بتنفيذ تعليمه معينه علي العنوان الي محفوظ في الذاكره ديت الي بيتضمن تلاعب في الذاكره او نقل الذاكره من مكان لاخر او تنفيذ تعليمه موجوده في الذاكره ديت , وديت كل وظيفة البروسيسور , طيب جميل , لو كلامي ده صحيح اذاي انا بكتب السورس كود بتاعي بال plain ascii English ?
واذا الجهاز بتاعي بيفهمه ؟
هنا بيجي دور ال Compiler والي هنتكلم علي دوره بالتفصيل
الكومبايلر بيقوم بعمليه حيويه جدا للبرنامج عن طريق انه يحوله من
Source code ل Loadable
executable module في خلال المرحله ديت بيتم عمليتين او بالتحديد تلات عمليات هنتكلم عنهم بالتفصيل اول عمليه ال Compilation وتاني عمليه Linking التالته هنتكلم عنها بعدين لما افهم الموضوع ماشي اذاي
اولا , تخيل البرنامج الاتي برنامج بيقوم استدعاء دالة ما لطباعة نص معين علي ال console الخاص بيك
ايه الي بيحصل في عملية ال compiling ? الي بيحصل في العمليه ديت هو تحويل ال source code ل object file عن طريق مجموعه من العمليات علي سبيل الذكر وليس الحصر
Syntax checking
parsing
وبعد كده بيتم الحصول علي عنواين الدوال المستخدمه والتأكد من ان جميع الدوال المطلوبه هتكون موجوده في ال object module ولكن لاحظ اننا عمرنا ماكتبنا كود لل printf ? وده لان شخص ما كتبها لينا وكل الي بيعمله الكومبايلر انه بيحصل عن ال خ object module للداله ديت الي موجود في مكتبة ال standard c الي في اللينكس بتسمي glibc ولكن قبل مابيحصل كده ايه الي بيتم ؟
الي بيحصل ان السورس كود الخاص بيك كما قلنا مكتوب بال plain text English وده الجهاز مش بيفهمه , فبيتم ترجمة العمليات ل machine code بس بما انك ال machine code عباره عن 1 , 0 هيتفهم منين ال string بتاعتي المكتوب فيها hello world ? وعشان نخلي العمليه متعقده اكتر , لو فيه متغير x ده بيتفهم اذاي ؟ وطالما انا قلت ان شخص تاني والكومبايلر او اللينكر بيعمل load لل object module دوت يبقي اذاي الكلام ده بيندمج في ملف واحد ؟؟
تابع معايا
كل الي البرنامج بيعمله انه بيعرف مجموعه من المتغيرات وبيحجزلها مساحه وبيقوم بعمل initialization ليها , ولكن ايه الفرق ؟
اول ال
storage class للمتغير x هو static ده معناه ايه ؟ ان المتغير دوت بيحافظ علي قيمته مالم يتم تغيرها في طول فترة حياة البرنامج مش مجرد وقت استدعاء دالة ما وينتهي امره زي المتغير z الي storage class بتاعه هو auto يعني بيتم عمل cre-ate للمتغير دوت وقت استدعاء الداله وتدميره وقت انتهائها , ولكن في حاجه تانيه
ايه الفرق بين المتغير x والمتغير y ?
الفرق في ال scope الاتنين ليها global scope بس الفرق بين الاول x والتاني z هو ان x ليه global source code scope لكل الملفات الي موجوده في البرنامج "ياريت تسال نفسك سؤال اذاي ؟" والتاني z ملوش اي علاقه باي ملف source code تاني اكتر من ال source code الي تم تعريفه فيه وده لان تم وضع كلمة static قبليه واصبح محصور في الملف الي تم تعريفه فيه فقط ولايجوز استدعائه في اي ملف
تاني
تحب نعقد الامور شوية كمان ؟
ايه رايك لو عرفنا متغير تاني في ال main function وسميناه
static int whatever = 1000000; ?في الحالة ديت ال variable دوت حيحافظ علي قيمته طوال فترة حياة البرنامج ولكن هيكون ليه block scope خاص بال function الي تم تعريفه فيها وهو main
بالمنظر ده احنا حلينا مشكلة ال static وال global data
static data : اي كائن بيحافظ علي وجوده طول فتره حياة البرنامج مهما كان ال scope بتاعه
ولكن هل ده معناه ان يمكن تعريف auto global data ?
الحقيقه لا
global data : اي متغير يحافظ علي وجوده طول فترة حياة البرنامج ويمكن الحصول عليه وعلي قيمته من اي source code في البرنامج
جميل جدا , ولكن كل ده ايه علاقته بنقاشنا ؟ وايه علاقة دوت بال
object module قبل مانتكلم عن ال memory module هنتكلم عن ال
c source code model ال c source code model او ال structure بتاعته سهله جدا , متكونه من داله واحده رئيسيه ومجموعه من ال object
لاحظ اننا لما بنتكلم عن object هنا منقصدش بيها ال c++ objects او نقصد بيها اي علاقه بالبرمجه الكائنيه OOP ولكن نقصد بيها شيئ ما
ال object دوت بيكون عباره عن variable او function بالنسبه لل c
وزي موضحنا قبل كده كل object ليه storage class و scope خاص بيه
نرجع تاني لل object module , مبدئيا عشان نوضح طبيعة ال object module , نرجع ونقول ان دور الكومبايلر هو انه يترجم النصوص للغة الالة machine code يعني ال object module عبارة عن file that contains machine code = BINARY FILE

ايوه هو دوت معني كلمة binary file الي بتشوفها وانت بتعمل download لملف تنفيذي في ال firefox ال binary file دوت بيحتوي علي ال instructions الي هتتجمع بعد كده عشان تديك ال load module
ال object module متكون من sections جميل الكلام دوت ؟
ولكن ال object module دوت عبارة عن object binary data يعني اذاي بيعرف ال sections ? عن طريق ال sizes او ال offsets بيبقي فيه section في الاول خالص كده اسمه ال header بيقول ان ال section كذا بيبتدي من ال offset كذا وينتهي عند offset كذا
ايه بقي ال sections ديت الي موجوده في ال object module ?Header section زي موضحنا
Text section -> بيحتوي علي ال machine code instruction للبرنامج
Initialized section -> static/global initialized data مثال لاحق ومهم ليها
uninitialized section -> البيانات التي لم يتم عمل initialization ليها قبل ال compiling ولكنها global/static {BSS SECTION}
Symbol table -> مهم جدا ووظيفته حيويه بالنسبه للكومبايلر , بيتم حفظ ال off-sets لل objects فيه مثلا int x بيكون وجوده في 0-4 في ال initialized data section ال function mainبيكونوجودها بين 1-20 في ال text section او ال machine code section .. سالت نفسك لحد دلوقتي ليه ؟ لزمته ايه كل الكلام دوت ؟ هتعرف بعدين في مقال تاني هنتكلم فيه عن الموضوع دوت وفايدته
دلوقتي كل المرحله الي اتكلمنا عنها هي المرحله الاولي الي بتقوم بعمل translation لل source module لل object module بكل الحاجات الي اتكلمنا عنها وان ال object module بيكون binary file بيحتوي علي sections اماكنها محفوظه في ال header section في ال object module وكل section ليه وظيفته المحدده .. لاحظ ان ال sections ديت abstract جدا لغرض الشرح فقط , لان فيه sections تانيه متكلمناش عنها وهنتكلم عنها بعدين بردوا
المرحله التانيه والثالثه : Linking الثانيه والثالثه ؟
اها لان في عمليتين بيتموا في العمليه ديت reallocating the object module و link the object module عشان توصل لل load module !
يعني ال load module عباره عن reallocated object file بيحتوي علي كل ال information الي موجوده في كل ال objects modules المستخدمه

يعني ال load module تقدر تتخيله كأنه big object module جاهز ان يتعمله load في الميموري بس واحده واحده عشان تفهم
الي بيتم ان ال linker بيعمل load لل object modules وبيعمل reallocate لل object module بانه بيعمل up-date لل offsets واضافه ل addresses تانيه في object modules تانيه عشان تقدر تعمل reference لايه ؟
بالظبت لل external objects زي مثلا printf , لاحظاننا بنتكلم ببساطه جدا لاانا مدخلناش في موضوع ال static linking وال shared libraries linking وديت حاجه تانيه هنشرحها بعدين ولكن بشكل او بأخر هو دوت الي بيحصل تماما حتي في حالة ال shared linking متتلخبطتش , هتفهمها بعدين
دلوقتي وصلنا لشبه النهايه بعد ماعمل ال linker reallocating لل object module بيبدأ يعمل linking او merging لل objects module عشان نوصل لل load module في الاخر ...
ال load module بيتم عمل load ليه في ال memory عن طريق ال system loader وديت بتختلف من سيستيم للتاني , ولكن وظيفتها انها تحلل ال offsets الي جه الوقت اننا نسميها logical addresses ل physical addresses موجوده بداخل الميموري وبالتالي بيكون البرنامج متحول من الصوره المنطقيه وال offsets لكائن موجود في الذاكره بيحتوي علي physical addresses
وبكده نكون انتهينا من الجزء الاول الي بيناقش عملية ال Compiling وال linking وال loading وفي الجزء التاني هنتكلم عن الاساله الي ناقشناها ونتكلم عن ال C memory module واذاي الدوال بيتم استدعائها وفين مكان وجود ال local variables
واذي بيتم عمل dynamic allocation لل memory ? وديت حاجه تجنبناها تماما , من المقال الجاي ان شاء الله هنبدأ نتكلم عن حاجات
system specific بالتحديد related to linux فتابع كويس معايا
ملاحظه هامه جدا جدا : كل الي اتكلمنا عنه وقلنا ان البروسيسور مش بيفهم غير ال 0 وال 1 موضحش البروسيسور ليه بقي كده وايه السبب ان اصلا هي 0 و 1 , الفكره كلها بتتسم في عالم كان اسمه Von Neumann هو السبب ورا الموضوع دوت , الفكره كلها اسمها Stored programs وهو الي اخترعها وقدم ورقة بتثبت انه ممكن تسجل برنامج كامل وتتعامل معاه ب Binary instructions الخ الخ ياريت ياريت ياريت تدور في الموضوع دوت لانه هيفيدك كتيرانتهي الجزء الاول