الفريق العربي للهندسة العكسية
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

[صورة مرفقة: 128383135-210777607283724-8238622407463275907-n.jpg]


رحلة في عالم البرمجة: إتقان أساسيات البرمجة وتطبيقاتها باستخدام لغة C++
 
https://www.youtube.com/playlist?list=PLmOrGO9IfJEcDyuBLOX5AzAqaKxmAKHrq


# الفصل 0 : تمهيد # الفصل 1 :
[صورة مرفقة: mqdefault.jpg]
 
https://www.youtube.com/watch?v=hAq4kmOIUj0


اليوم سنتعامل مع صديقا جديد واسمه ال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 أي أخطاء إملائية.
دعونا نوضح هذا بسلسلة من الأمثلة، كل منها يحتوي على خطأ صغير واحد. كل خطأ هو مثال على نوع من الأخطاء التي نرتكبها غالباً:

int main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout << "AT4RE" << std::endl; // إخراج على الشاشة "AT4RE"
    return 0;
}


لم نقدم للcompiler أي شيء ليفسر ما هو std::cout، لذا يشكو لتصحيح هذا، دعنا نضيف الاستيراد:
#include <iostream> // standard C++ استيراد مكتبة

int main() {  // يبدأ برامج C++ بتنفيذ main function
    cout << "AT4RE" << std::endl; // إخراج على الشاشة "AT4RE"
    return 0;
}


الcompiler يشكو مرة أخرى: قدمنا المكتبة standard لكننا نسينا أن نخبره بالبحث في std عن cout. كما يعترض على هذا:
#include <iostream> // standard C++ استيراد مكتبة

int main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout << "AT4RE << std::endl; // إخراج على الشاشة "AT4RE"
    return 0;
}

لم ننهي الstring بعلامة "
الcompiler يعترض أيضاً على هذا:
#include <iostream> // standard C++ استيراد مكتبة

integer main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout << "AT4RE" << std::endl; // إخراج على الشاشة "AT4RE"
    return 0;
}


يُستخدم اختصار int في C++ بدلاً من الكلمة integer. لا يحب الcompiler هذا:
#include <iostream> // standard C++ استيراد مكتبة

int main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout < "AT4RE" << std::endl; // إخراج على الشاشة "AT4RE"
    return 0;
}


لقد استخدمنا < (مُشغّل أصغر من . less-than operator) ) بدلاً من << (مُشغّل الإخراج - output operator). خطأ آخر:
#include <iostream> // standard C++ استيراد مكتبة

int main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout << 'AT4RE' << std::endl; // إخراج على الشاشة "AT4RE"
    return 0;
}


لقد استخدمنا علامات اقتباس فردية single quotes بدلاً من اقتباسات مزدوجة double quotes لتحديد السلسلة. وأخيراً، يعطي الcompiler خطأً لهذا:
#include <iostream> // standard C++ استيراد مكتبة

int main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout << "AT4RE" << std::endl // إخراج على الشاشة "AT4RE"
    return 0;
}

نسينا أن ننهي جملة الإخراج output statement بفاصلة منقوطة semicolon..
لاحظ أن العديد من البيانات في C++ تنتهي بفاصلة منقوطة ( ; ).
يحتاج الcompiler إلى تلك الفاصلات المنقوطة لمعرفة متى ينتهي بيان statement واحد ويبدأ البيان التالي statement التالي.
ليس هناك طريقة قصيرة حقاً وصحيحة تماماً وغير تقنية لتلخيص أماكن الفواصل المنقوطة المطلوبة.
لذلك، انسخ نمط استخدامنا مؤقتاً، والذي يمكن تلخيصه بـ: "ضع فاصلة منقوطة بعد كل تعبير لا ينتهي بقوس معوج أيمن (})".

وأخيراً، دعنا نجرب شيئاً يعمل بشكل مدهش:
#include <iostream> // standard C++ استيراد مكتبة

int main() {  // يبدأ برامج C++ بتنفيذ main function
    std::cout << "AT4RE" << std::endl // إخراج على الشاشة "AT4RE"
}


لأسباب تاريخية، يمكننا ترك الreturn statement  في main (وفقط في main) وكأننا كتبنا return 0; في نهاية main body للإشارة إلى اكتمال العملية بنجاح.

لماذا نقضي دقائق من وقتك الثمين في عرض أمثلة على الأخطاء التافهة في برنامج تافه؟
لتوضيح النقطة التي ستقضي – مثل جميع المبرمجين – الكثير من الوقت في البحث عن أخطاء في نص برنامج.
في معظم الأحيان، ننظر إلى نصوص بها أخطاء. 
على الأخير، إذا كنا مقتنعين بأن بعض الcode صحيح، لكننا سننظر إلى code أخر أو سنأخذ وقتاً للراحة. 
كانت مفاجأة كبيرة للرائدين الأوائل في مجال الحوسبة أنهم كانوا يرتكبون أخطاء وكانوا يضطرون إلى تكريس جزء كبير من وقتهم للبحث عنها.
لا يزال من المفاجئ لمعظم المبتدئين في مجال البرمجة.

عندما تبرمج، سيزعجك الcompiler في بعض الأحيان.
وفي بعض الأحيان يبدو أنه يشكو من تفاصيل غير مهمة (مثل فاقد لفاصلة منقوطة) أو من أشياء تعتبر "صحيحة بوضوح".
ومع ذلك، الcompiler عادةً ما يكون على حق: عندما يُعطي رسالة خطأ ويرفض إنتاج object code  من source code، فهناك شيء غير صحيح في برنامجك؛ أي أن معنى ما كتبته ليس محددًا بدقة وفقًا لمعيار C++.
الcompiler ليس لديه مفهوم عام (إنه ليس بشري) وهو منتقد للغاية بخصوص التفاصيل.
نظرًا لعدم وجوده للمفهوم العام، لن تحب أن يحاول تخمين ما كنت تقصده بشيء "بدا على ما يرام" ولكنه لم يتوافق مع تعريف C++. 
إذا فعل ذلك وكان تخمينه مختلفًا عن رأيك، فقد تنتهي بقضاء الكثير من الوقت في محاولة معرفة لماذا لم يقم البرنامج بما كنت تعتقد أنك أخبرته بفعله. 
عندما يتم الانتهاء من كل شيء، الcompiler ينقذنا من الكثير من المشاكل التي نسببها لأنفسنا.
إنه يُنقذنا من المشاكل أكثر بكثير مما يسببه. 
لذا، يرجى تذكر: الcompiler هو صديقك؛ ربما، الcompiler هو أفضل صديق لديك عندما تبرمج.

 dance