خب بعد اینکه در قسمت اول با فرآیند کامپایل به صورت کلی آشنا شدیم و قبل اینکه بریم سراغ توضیح جزییات مراحل کامپایل، لازمه قبلش یه خورده راجع به ابزارها و انواع کامپایلر هم باهم صحبت کنیم.
کامپایلرهای نیتیو
به طور کلی، انواع کامپایلر تو طراحی امبدد به دو دسته تقسیم میشه. اولین نوع کامپایلر که بچههای کامپیوتری خیلی ازش استفاده میکنن، Native compiler ها هستند. این نوع کامپایلرها برای کدهایی استفاده میشن که قراره روی همون ماشین (host machine) اجرا بشه. یعنی این کامپایلر روی هر ماشینی که بتونه اجرا بشه، فقط برای همون ماشین کامپایل می کنه. خب طبیعتاً این کامپایلرها نمیتونن کدهایی رو برای پردازنده ARM یا AVR روی ماشینی با پردازنده X86 کامپایل کنن.
برای کامپایل کدهای این معماریها با Native compiler ها لازمه ابتدا این کامپایلر روی پردازنده موردنظر (فرضاً ARM) نصب بشه و اون موقع کدها رو برای اون معماری خاص کامپایل کنیم. خب بنا به دلایل مختلف (مثلاً کم بودن منابع در دسترس برای سیستمهای امبدد) اصولاً این کار انجام شدنی نیست و یا اگه هم انجام بشه تو پردازندههای با قابلیتهای بالاتر به کار میره. پس این نوع کامپایلرها به درد ما سخت افزاریا نمیخورن زیاد! کامپایلر معروف این خانواده GCC هستش که با نام GCC 4.8 (که 4.8 ورژنشه) شناخته میشن.
کراس کامپایلر ها
نوع دوم کامپایلر که تقریباً تمامی محیطهای توسعه از این نوع استفاده میکنن Cross compiler ها هستند که بهمون این امکان رو میدن که بتونیم کدهای مربوط به یک پردازنده با یک معماری خاص رو روی یک پردازنده دیگه با معماری متفاوت کامپایل کنیم. این دقیقاً کاریه که محیطهای توسعه مثه Keil یا Ateml studio انجام میدن. دو کامپایلر معروف این خانواده از کامپایلرها که برای پردازندههای ARM به کار میرن رو در اینجا معرفی میکنیم. ما در ادامه این سری از نوشتارها هم تمرکز رو روی همین نوع کامپایلرها میذارم و به خانواده قبلی کامپایلرها زیاد کاری نداریم. اگرچه خیلی از چیزایی که گفته میشه بین این دو خانواده از انواع کامپایلر مشترکه.
نامگذاری این نوع کامپایلر هم معمولاً از فرمت زیر تبعیت میکنه:
<ARCH> – <VENDOR> – <OS> – <ABI>
کامپایلر اول به صورت زیر هستش :
Arm – none – eabi – gcc
Arch : ARM
Vendor : N/A
OS : None (Bare – metal)
ABI : EABI
راجع به موارد بالا فقط این نکته رو بگم که Bare-metal یعنی کد نوشته شده قراره مستقیماً روی سخت افزار پیاده شه و سیستم عاملی این وسط وجود نداره. در واقع همون کاری که ما خیلی از اوقات میخوایم انجام بدیم.
دومین کامپایلر هم:
Arm – linux – gnueabi – gcc
Arch : ARM
Vendor : N/A
OS : Linux OS
ABI : GNUEABI
برای کامپایل کردن یه برنامه با ابزار GCC کافیه از دستور زیر استفاده کنیم :
فلگ یا پرچم
استفاده کردن از یه سری flagها باعث میشه بتونیم تو روند کامپایل تغییراتی رو ایجاد کنیم. مثلاً استفاده ازفلگ S- باعث میشه صرفاً فایل اسمبلی تولید شه و بقیه مراحل کامپایل انجام نشه. تو تصویر پایین میتونید یه سری از فلگ های کلی کامپایلر رو ببینید:
تو تصویر زیر هم برخی از Flag های کامپایلر که برای نوع معماری خاص استفاده میشن رو میتونید ببینید:
خب فکر میکنم تا همین جا کافی باشه برای این قسمت. در قسمت سوم با هدر فایل و تاثیر آن در روند کامپایل آشنا خواهیم شد.
ممنون از وقتی که گذاشتی 🙂
سلام
عالیه این بحث. با انرژی ادامه بدهید. باتشکر
سلام بسیار عالی ممنونم .. انشالا مابقی کار رو همراه با اجرا و تست ها منتظریم
اما قسمت” فلگ یا پرچم “عکسی جا نیفتاده؟ چون نوشتید ” یه سری از فلگ های کلی کامپایلر رو ببینید:” بعدش عکسی نیومده و توضیحات نوشتید
درود بر شما.
خیلی ممنون که دقت کردید.
تصویر اصلاح شد.