توصیه شده, مقاله

از نرم‌افزار تا سخت‌افزار – قسمت دوم – انواع کامپایلر

خب بعد اینکه در قسمت اول با فرآیند کامپایل به صورت کلی آشنا شدیم و قبل اینکه بریم سراغ توضیح جزییات مراحل کامپایل، لازمه قبلش یه خورده راجع به ابزارها و انواع کامپایلر هم باهم صحبت کنیم.

کامپایلرهای نیتیو

شماتیک نحوه کارکرد کامپایلر نیتیو

به طور کلی، انواع کامپایلر تو طراحی امبدد به دو دسته تقسیم میشه. اولین نوع کامپایلر که بچه‌های کامپیوتری خیلی ازش استفاده میکنن، 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 کافیه از دستور زیر استفاده کنیم :

$ gcc [options] [file]

 

فلگ یا پرچم

استفاده کردن از یه سری flag‌ها باعث میشه بتونیم تو روند کامپایل تغییراتی رو ایجاد کنیم. مثلاً استفاده ازفلگ S- باعث میشه صرفاً فایل اسمبلی تولید شه و بقیه مراحل کامپایل انجام نشه. تو تصویر پایین میتونید یه سری از فلگ های کلی کامپایلر رو ببینید:

دستورات کامپایلر GCC

 

تو تصویر زیر هم برخی از Flag های کامپایلر که برای نوع معماری خاص استفاده میشن رو میتونید ببینید:

فلگ تشخیص معماری GCC

 

خب فکر می‌کنم تا همین جا کافی باشه برای این قسمت. در قسمت سوم با هدر فایل و تاثیر آن در روند کامپایل آشنا خواهیم شد.

سعید حقیقی پور

درباره سعید حقیقی پور

تا حالا به این فکر کردین که تو یه سیستم کامپیوتری GPU چقدر کارآمد و مهمه ولی به اندازه CPU شناخته شده نیست.یه جورایی همون "مجهولون فی الارض معروفون فی السماء" که میگن! یه حسی بهم میگه کاش بتونم مثه GPU باشم :)

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

4 دیدگاه در “از نرم‌افزار تا سخت‌افزار – قسمت دوم – انواع کامپایلر

  1. سجاد Sdrad سجاد گفت:

    ممنون از وقتی که گذاشتی 🙂

  2. علی گفت:

    سلام
    عالیه این بحث. با انرژی ادامه بدهید. باتشکر

  3. سلام بسیار عالی ممنونم .. انشالا مابقی کار رو همراه با اجرا و تست ها منتظریم
    اما قسمت” فلگ یا پرچم “عکسی جا نیفتاده؟ چون نوشتید ” یه سری از فلگ های کلی کامپایلر رو ببینید:” بعدش عکسی نیومده و توضیحات نوشتید

    1. Digi Boy Digi Boy گفت:

      درود بر شما.
      خیلی ممنون که دقت کردید.
      تصویر اصلاح شد.