GCC مخفف Gnu Compiler Collection (مجموعه کامپایلر گنو)، مجموعهای از کامپایلرها برای زبانهای برنامهنویسی مختلف است که بوسیله پروژه گنو بوجود آمده است. GCC در ابتدا Gnu C Compiler نامیده می شد زیرا تنها قادر به کامپایل (ترجمه) کدهای زبان C است ولی نسخه های بعدی و فعلی آن (در زمان این پست نسخه ۶.۲) از زبان های مختلفی پشتیبانی می کند.
زبان های قابل پشتیبانی
GCC کامپایلری (مترجمی) است که می توان از آن در سیستم عامل های مختلف مانند گنو لینوکس (لینوکس)، بی اس دی ها (FreeBSD)، مکینتاش و حتی ویندوز استفاده کرد. همانطور که از نام GCC مشخص است آن از چندین زبان متفاوت زیر پشتیبانی می کند.
- زبان C و ++C
- زبان Objective-C
- زبان ++Objective-C
- زبان Objective-Java
- زبان Java
- زبان Fortran
- زبان Ada
- زبان Go
GCC معماری های مختلف پردازنده ها مانند x86, x86-64,AVR, PowerPC و SPARC را پشتیبانی می کند. بنابراین قبلا می توانستیم بر روی سیستم عامل سولاریس که روی اسپارک و سیستم عامل مکینتاش های پیش از نسخه ۱۰.۵ که روی پاور پی سی اجرا می شدند نیز از کامپایلر GCC استفاده کرد.
نصب GCC بر روی توزیع های مختلف لینوکسی
GCC را می توان از مخازن توزیع های مختلف بر روی آنها نصب کرد. در ادامه دستورهای لازم برای نصب کامپایلر GCC و دیگر ابزارهای مانند make که برای توسعه برنامه های C لازم هستند گفته شده اند.
# Ubuntu and Debian users sudo apt-get install build-essential # Fedora 21 CentOS and Redhat users sudo yum group install 'Development Tools' # Fedora 22+ users sudo dnf group install 'Development Tools' # openSUSE users sudo zypper install -t pattern devel_C_C++ # Archlinux and Manjaro sudo pacman -S base-devel devtools
دستورهای بالا در توزیع های خود به صورت عمومی سه بسته g++, gcc و make را نصب می کنند که برای توسعه برنامه های C لازم هستند. gcc و ++g کامپایلرهای زبان های C و ++C هستند. دستور make نه تنها توسط برنامه نویس ها استفاده می شود، بلکه توسط مدیران برای کامپایل کردن بسته های کد منبع مورد استفاده قرار می گیرد. برنامه نویس ها از دستور make برای مدیریت برنامه های پیچیده استفاده می کنند.
ترجمه کد نوشته شده به زبان C
در زیر قطعه کد بسیار ساده ای به زبان C نوشته شده است که تنها عبارت Hello World را بر روی ترمینال چاپ می کند. دستورهای زیر را در یک فایل با پسوند c. ذخیره کنید.
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World\n"); return 0; }
ساده ترین حالت استفاده از gcc به صورت زیر است که مسیر و نام فایل به عنوان ورودی به gcc داده می شود.
gcc /path/to/filename.c OR gcc filename.c
حدف از کامپایل کردن کدها تبدیل کدهای نوشته شده به یک زبان (در اینجا C) به زبان ماشین (زبان دودویی) و ایجاد فایل قابل اجرا (Executable) است. در واقع ورودی کامپایلر یک فایل متنی ساده است و پس از طی کردن فرایند کامپایل، یک فایل دودویی (Binary) و قابل اجرا ایجاد می شود.
خروجی دستور بالا ایجاد فایل a.out است که نام پیشفرض فایل قابل اجرا است. اما اگر بخواهید نام فایل خروجی قابل اجرا را خودتان تعیین کنید باید از سویئچ a- استفاده کنید.
gcc -a output_filename /path/to/filename.c OR gcc -a output_filename filename.c
برای آنکه تمامی Warning ها نشان داده شوند می توانید از سویئچ Wall- استفاده کنید. به طور مثال در قطعه کد خود و درون تابع main یک متغیر تعریف می کنید ولی آنرا مقدار دهی نمی کنید، بنابراین یک اخطار (Warning) نمایش داده می شود که در تابع main یک متغیر غیر مقدار دهی شده استفاده شده است. برای اطلاعات بیشتر می توانید اینجا یا راهنمای آنرا توسط دستور man gcc مطالعه کنید.
فایل های سرآیند – Header Files
در زبان C و ++C فایل های سرآیند شامل توابع از پیش تعریف شده ای هستند که برنامه نویسی را ساده می کنند. به طور مثال توابع printf و scanf برای چاپ خروجی و دریافت ورودی به کار می روند و لازم است پیش از استفاده از آنها، فایل سرآیند حاوی آنها یعنی stdio.h را در ابتدای برنامه فراخوانی کنیم.
شروع به برنامه نویسی C در لینوکس
فایل های سرآیند در لینوکس به صورت پیشفرض درون دایرکتوری usr/include/ قرار دارند و می توانید با هر ویرایشگری آنها را مطالعه کنید. به استثنای فایل های سرآیند زبان های C یا ++C که حاوی توابع کتابخانه ای و استاندارد این زبان ها هستند، شما می توانید از دیگر فایل های سرآیند که درون دایرکتوری های usr/include/sys/ و usr/include/linux/ هستند استفاده کنید.
به طور مثال فایل usr/include/sys/types.h/حاوی تعاریف نوعی (Typedef) مانند uid_t است که می توانید از آنها در برنامه های خود استفاده کنید. بنابراین برای آنکه بتوانید متغیری از نوع uid_t را تعریف کنید باید با دستور زیر فایل سرآیند را فراخوانی کنید.
#include <sys/types.h>
مسیر usr/inclue/ محل پبشفرضی است که gcc در آن به دنبال فایل های سرآیند استفاده شده درون کد شما می گردد. اما ممکن است فایل های سرآیندی را درون کد خود استفاده کرده باشید که در مسیر غیر پیشفرض وجود داشته باشند. در زمان کامپایل توسط gcc می توانید توسط سویئچ I- محل این فایل های سرآیند را به gcc معرفی کنید.
gcc -I /path/to/header_file filename.c OR gcc -o output_file -I /path/to/header_file filename.c OR gcc -o output_file -Wall -I /path/to/header_file filename.c
بنابراین در کنار مسیر پیشفرض، gcc با استفاده از سویئچ I- در مسیر تعیین شده به دنبال فایل های سرآیند می گردد که درون فایل filename.c آورده شده اند.