1.5 التجميع - Compilation - فهم التعامل مع Compiler - نسخة قابلة للطباعة +- الفريق العربي للهندسة العكسية (https://www.at4re.net/f) +-- قسم : منتديات البرمجة - Programming Forums (https://www.at4re.net/f/forum-5.html) +--- قسم : البرمجة بلغة السى و السى بلس بلس ++C & C (https://www.at4re.net/f/forum-17.html) +--- الموضوع : 1.5 التجميع - Compilation - فهم التعامل مع Compiler (/thread-3868.html) |
1.5 التجميع - Compilation - فهم التعامل مع Compiler - R333T - 28-04-2024 رحلة في عالم البرمجة: إتقان أساسيات البرمجة وتطبيقاتها باستخدام لغة C++
# الفصل 0 : تمهيد
اليوم سنتعامل مع صديقا جديد واسمه الcompiler لنبدا. ال C++ هي لغة مُجمعة compiled language. وهذا يعني أنه لتشغيل البرنامج، يجب أن تترجمه أولاً من الشكل القابل للقراءة من قبل الإنسان إلى شيء يمكن للآلة "فهمه". يتم هذه الترجمة عن طريق برنامج يسمى compiler. النص الذي تقرأه وتكتبه يُسمى بالشيفرة المصدرية source code أو نص البرنامج program text، وما ينفذه الكمبيوتر يُسمى بالشيفرة الكائنية object code أو الشيفرة الآلية machine code. عادةً ما تكون ملفات source code ل C++ تحمل امتداد .cpp (مثل AT4RE.cpp) وملفات ال object code تحمل امتداد .obj (في نظام Windows) أو .o (Linux). لذا فإن كلمة "code" بمفردها غامضة ambiguous وقد تسبب الالتباس confusion. استخدمها بحذر فقط عندما يكون واضحًا ما المقصود بها. ما لم يُحدد خلاف ذلك، نستخدم "code" للإشارة إلى "ال source code" أو حتى "ال source code باستثناء التعليقات"، لأن التعليقات موجودة فقط لنا البشر ولا تُرى من قبل ال compiler الذي ينتج أي generating ال object code. ![[Pasted image 20240428054807.png]] اذا عندنا "C++ source code" يدخل لcompiler يولد "Object code" ال compiler يقرأ source codek ويحاول فهم ما كتبته. إنه يتفحص ما إذا كان برنامجك صحيحاً بناء على القواعد النحوية للبرمجة أي الsyntax، وما إذا كانت لكل كلمة معنى معين، وما إذا كان هناك أي شيء خاطئ بوضوح يمكن اكتشافه دون الحاجة إلى تنفيذ البرنامج فعلياً. ستجد أن الcompilers يكونون منتقدين للغاية بخصوص البنية النحوية الsyntax. إذا تركنا أي تفصيل من تفاصيل برنامجنا، مثل استيراد ملف وحدة، أو فاصلة منقوطة، أو جملة مفتوحة، سيتسبب ذلك في حدوث أخطاء. وبالمِثْل، لا يتحمل الcompiler أي zero tolerance أي أخطاء إملائية. دعونا نوضح هذا بسلسلة من الأمثلة، كل منها يحتوي على خطأ صغير واحد. كل خطأ هو مثال على نوع من الأخطاء التي نرتكبها غالباً:
لم نقدم للcompiler أي شيء ليفسر ما هو std::cout، لذا يشكو لتصحيح هذا، دعنا نضيف الاستيراد:
الcompiler يشكو مرة أخرى: قدمنا المكتبة standard لكننا نسينا أن نخبره بالبحث في std عن cout. كما يعترض على هذا:
لم ننهي الstring بعلامة " الcompiler يعترض أيضاً على هذا:
يُستخدم اختصار int في C++ بدلاً من الكلمة integer. لا يحب الcompiler هذا:
لقد استخدمنا < (مُشغّل أصغر من . less-than operator) ) بدلاً من << (مُشغّل الإخراج - output operator). خطأ آخر:
لقد استخدمنا علامات اقتباس فردية single quotes بدلاً من اقتباسات مزدوجة double quotes لتحديد السلسلة. وأخيراً، يعطي الcompiler خطأً لهذا:
نسينا أن ننهي جملة الإخراج output statement بفاصلة منقوطة semicolon.. لاحظ أن العديد من البيانات في C++ تنتهي بفاصلة منقوطة ( ; ). يحتاج الcompiler إلى تلك الفاصلات المنقوطة لمعرفة متى ينتهي بيان statement واحد ويبدأ البيان التالي statement التالي. ليس هناك طريقة قصيرة حقاً وصحيحة تماماً وغير تقنية لتلخيص أماكن الفواصل المنقوطة المطلوبة. لذلك، انسخ نمط استخدامنا مؤقتاً، والذي يمكن تلخيصه بـ: "ضع فاصلة منقوطة بعد كل تعبير لا ينتهي بقوس معوج أيمن (})". وأخيراً، دعنا نجرب شيئاً يعمل بشكل مدهش:
لأسباب تاريخية، يمكننا ترك الreturn statement في main (وفقط في main) وكأننا كتبنا return 0; في نهاية main body للإشارة إلى اكتمال العملية بنجاح. لماذا نقضي دقائق من وقتك الثمين في عرض أمثلة على الأخطاء التافهة في برنامج تافه؟ لتوضيح النقطة التي ستقضي – مثل جميع المبرمجين – الكثير من الوقت في البحث عن أخطاء في نص برنامج. في معظم الأحيان، ننظر إلى نصوص بها أخطاء. على الأخير، إذا كنا مقتنعين بأن بعض الcode صحيح، لكننا سننظر إلى code أخر أو سنأخذ وقتاً للراحة. كانت مفاجأة كبيرة للرائدين الأوائل في مجال الحوسبة أنهم كانوا يرتكبون أخطاء وكانوا يضطرون إلى تكريس جزء كبير من وقتهم للبحث عنها. لا يزال من المفاجئ لمعظم المبتدئين في مجال البرمجة. عندما تبرمج، سيزعجك الcompiler في بعض الأحيان. وفي بعض الأحيان يبدو أنه يشكو من تفاصيل غير مهمة (مثل فاقد لفاصلة منقوطة) أو من أشياء تعتبر "صحيحة بوضوح". ومع ذلك، الcompiler عادةً ما يكون على حق: عندما يُعطي رسالة خطأ ويرفض إنتاج object code من source code، فهناك شيء غير صحيح في برنامجك؛ أي أن معنى ما كتبته ليس محددًا بدقة وفقًا لمعيار C++. الcompiler ليس لديه مفهوم عام (إنه ليس بشري) وهو منتقد للغاية بخصوص التفاصيل. نظرًا لعدم وجوده للمفهوم العام، لن تحب أن يحاول تخمين ما كنت تقصده بشيء "بدا على ما يرام" ولكنه لم يتوافق مع تعريف C++. إذا فعل ذلك وكان تخمينه مختلفًا عن رأيك، فقد تنتهي بقضاء الكثير من الوقت في محاولة معرفة لماذا لم يقم البرنامج بما كنت تعتقد أنك أخبرته بفعله. عندما يتم الانتهاء من كل شيء، الcompiler ينقذنا من الكثير من المشاكل التي نسببها لأنفسنا. إنه يُنقذنا من المشاكل أكثر بكثير مما يسببه. لذا، يرجى تذكر: الcompiler هو صديقك؛ ربما، الcompiler هو أفضل صديق لديك عندما تبرمج. |