همه معمولا کامپایل شدن یه کد (C) رو در یک مرحله واحد میبینن. در صورتی که کامپایل از چندین لایه تشکیل شده 🗒
1⃣ اولین مرحله برای کامپایل Preprocessor نام داره.
تو این مرحله کد نوشته قبل از کامپایل به Preprocessor سپرده میشه تا تغییرات قبل از کامپایل روش اجرا بشه. این تغییرات شامل جایگذاری و اعمال تغییرات روی کد توسط preprocessor directive هاست (دستور هایی که با # شروع میشن). مثل جایگذاری define# ها یا بررسی if# و...
یه جورایی کد رو قبل از پردازش و کامپایل برای کامپایلر آماده میکنه.
2⃣ مرحله دوم Compilation هستش!
کامپایلر کد به اصطلاح preprocessing شده رو میگیره و به اسمبلی (Assembly) تبدیل میکنه. تو این مرحله بررسی syntax،type cheking، optimization،semantic analysis انجام میشه و در نهایت کد به اسمبلی کامپایل میشه.
3⃣ این مرحله Assembling نام داره.
اینجا کد اسمبلی که توی مرحله قبل ساخته شده به Assembler داده میشه تا به Machine code تبدیل بشه.
خروجی این پردازش میشه چیزی به نام Object file که داخلش ماشین کد، symbol ها و ... وجود داره.
اما هنوز قابل اجرا یا executable نیست.
4⃣ این مرحله Linking نام داره.
که با Linker انجام میشه.
فرض کن توی کدمون از تابع printf استفاده کرده باشیم. اینجا ما کد خودمون رو داریم و implementation مربوط به printf رو نداریم که!
اینجا لینکر میاد وسط و reference های unresolved رو به implementation مربوط متصل میکنه.
حالا لینکر میاد و همه این قطعات رو میذاره کنار هم و یه فایل executable میسازه که قابل اجرا هستش.
ابزار هایی مثل gcc فقط کامپایل نمیکنن بلکه همه این مراحل رو برای کامپایل کردن طی میکنن! 🍉
(توی پست های بعدی در رابطه با همه این موارد بیشتر توضیح خواهم داد (مخصوصا preprocessor)) 💯
Post #281
485
- 🔥 6
- ❤ 3