در قسمت اول این آموزش با هم اجرای برنامه Hello World را یاد میگیریم. این برنامه معمولا در اکثر دوره های آموزش زبان C وجود دارد، اما ما سعی کردیم تا خیلی عمیق تر به بررسی این برنامه بپردازیم. با سیسوگ همراه باشید.
ابزارهایی که در این دوره استفاده خواهید کرد، طراحی شدهاند تا کارها را سریع و آسان انجام دهند که برای برنامهنویسی معمولی خوب است؛ اما ممکن است برای برنامهنویسی امبدد زیاد کارآمد نباشد. کامپایلر GCC، قابلیت اجرای ابزارهای زیادی را دارد. با ماه همراه باشید تا هر ابزار را بررسی کنیم که چگونه این ابزار ها کد را کامپایل و اجرا می کند.
در این روند، کشف خواهید کرد که کامپایلر GCC یک سورپرایز برای ما دارد. باوجوداینکه برنامه ما بسیار ساده است، کامپایلر تصمیم خواهد گرفت تا قسمتی از آن را بازنویسی کند بدون اینکه ما را در جریان بگذارد، تا کارایی برنامه افزایش پیدا کند. در واقع، اگر به پشتپرده این عملیات نگاه نکنیم تا ببینیم چه اتفاقی میافتد، هرگز درمورد جزئیاتی که در برنامه ما رخ میدهد آگاهی پیدا نمیکنیم. در ادامه فصل با ما همراه باشید تا بیشتر در این مورد اطلاعات کسب کنیم.
نصب GCC
برای اجرای برنامه در این فصل، شما بایدGNU C compiler (GCC) و ابزارهای مرتبط را بر روی سیستم خود نصب کنید. فرایند نصب بستگی به سیستمعامل شما دارد:
ویندوز
Minimalist GNU for Windows (MinGW) را از آدرس http://www.mingw.org نصب کنید.
macOS
- homebrew را در سیستم خود نصب کنید.
- بعد از نصب homebrew، در ترمینال خود کامند brew install gcc را وارد کنید.
لینوکس
برای سیستمهای مبتنی بر دبیان مانند اوبونتو و لینوکس مینت، از کامند های زیر استفاده کنید:
1 2 3 | $ sudo apt-get install build-essential $ sudo apt-get install manpages-dev |
برای سیستمهای مبتنی بر Red Hat مانند Fedora یا CentOS، از کامند زیر استفاده کنید:
1 | $ dnf groupinstall "Development Tools" |
برای سایر سیستمهای مبتنی بر لینوکس، با استفاده از گوگل کامند های موردنیاز را پیدا کنید.
پس از نصب نرمافزار، یک پنجره ترمینال باز کنید و کامند gcc را وارد کنید. اگر خطای “no input files” را دریافت کردید، نصب با موفقیت انجام شده است.
1 2 3 4 5 | $ gcc gcc: fatal error: no input files compilation terminated. |
شروع برنامه نویسی
برنامه اول ما با نام hello.c است. برای شروع باید یک دایرکتوری برای نگهداری این برنامه و ورود به آن ایجاد کنید. به دایرکتوری اصلی فضای کاری خود مراجعه کنید، یک پنجره command باز کنید و کامند های زیر را وارد کنید:
1 2 3 | $ mkdir hello $ cd hello |
از یک ویرایشگر متن مانند Notepad، Vim یا Gedit استفاده کنید، یک فایل با نام hello.c ایجاد کنید و کد زیر را وارد کنید:
1 2 3 4 5 6 | #include <stdio.h> int main() { printf("Hello World!\n"); return (0); } |
ما این برنامه را در بخشهای بعدی به طور دقیق بررسی خواهیم کرد. اما اول باید آن را اجرا کنیم.
کامپایل برنامه
فایلی که به تازگی ایجاد کردید، به عنوان یک فایل منبع شناخته میشود و حاوی کد به فرمت قابل خواندن برای انسان است. (بله، واقعاً؛ این قرار است قابل خواندن برای انسان باشد.) این فایل منبع برای تولید سایر فایلها مورد استفاده قرار میگیرد. محتوای این فایل، که به آن کد منبع یا source code میگوییم، منطق و عملکرد برنامهی ما را بیان میکند. با این حال، کامپیوتر مستقیماً کد منبع را نمیفهمد؛ فقط کد ماشین، یعنی مجموعهای از دستورات به فرمت عددی را میپذیرد. بنابراین، ما نیاز داریم کد منبع خود را به کد ماشین تبدیل کنیم، که این فرآیند را کامپایل کردن مینامیم. مرحله کامپایل، اطمینان میدهد که برنامهی ما توسط کامپیوتر قابل اجرا باشد.
برای انجام این کار، دستورات کامپایلر زیر را در macOS یا Linux اجرا میکنیم:
1 | $ gcc -o hello hello.c |
در ویندوز، کامند زیر را اجرا میکنیم:
1 | $ gcc -o hello.exe hello.c |
اگر هیچ خروجی نگرفتید و فقط یک خط فرمان بدست آمد، عمل کامپایل موفقیتآمیز بوده است. در غیر این صورت، پیامهای خطا دریافت خواهید کرد. این کامند به برنامه GCC میگوید که برنامه را compile و link کند، خروجی را در یک فایل به نام hello در macOS و Linux یا hello.exe در ویندوز قرار دهد. اکنون میتوانیم برنامهی خود را اجرا کنیم. در macOS یا Linux از دستورات زیر استفاده میـکنیم:
1 2 3 | $ ./hello Hello World! |
در ویندوز از کامند زیر استفاده کنید:
1 2 3 | $ hello Hello World! |
ایجاد خطا
در کد، یک خطا ایجاد میکنیم تا ببینیم چه اتفاقی میافتد. خط دوم را به این شکل تغییر دهید:
1 | intxxx main() |
حالا بیایید سعی کنیم برنامه را کامپایل کنیم:
1 2 3 4 | $ gcc -o hello hello.c hello.c:2:1: error: unknown type name 'intxxx' intxxx main() |
^خروجی به ما میگوید که در خط 2 و کاراکتر 1، مشکلی وجود دارد. کامپایلر در این موقعیت انتظار یک نوع داده را داشت اما با خطایی که از عمد ایجاد کردیم برنامه دچار مشکل شده است. برنامه را با بازگرداندن خط به حالت قبلی تصحیح کنید.
حال بیایید با حذفکردن چیزی کامپایلر را آزمایش کنیم. سمیکالن خط چهارم را پاک کنید:
1 | printf("Hello World!\n") |
بعد از کامپایل با خطای جدیدی مواجه میشویم:
1 2 3 4 5 6 7 | $ gcc -o hello hello.c hello.c: In function 'main': hello.c:5:5: error: expected ';' before 'return' return (0); ^ |
شما متوجه میشوید که کامپایلر در زمان صدور پیغام خطا به خط ۵ اشاره کرده است. این به این دلیل است که باوجوداینکه ما در خط ۴ خطا ایجاد کردهایم، کامپایلر آن را تا زمانی که به خط ۵ برسد، تشخیص نداده است. گاهی اوقات خطاهای مربوط به خطوط قبلی برای یک یا چند خط تشخیص داده نمیشوند، بنابراین فقط به خط مشخص شده توسط خطا نگاه نکنید؛ به خطوط قبلی نیز نگاه کنید.
در اولین قسمت آموزش امبدد C با هم یادگرفتیم که چجوری یک برنامه ساده با کامپایلر GCC کامپایل کنیم و در آخر خطایی ایجاد کردیم که ببینیم کامپایلر در هنگام بروز خطا چه واکنشی نشان می دهد. در قسمت بعد به صورت عمیقتر برنامهای که کامپایل کردیم را بررسی میکنیم همچنین فرایند کامپایل آن را بهبود میدهیم. امیدوارم این قسمت برای شما مفید بوده باشد.
خوشحال میشیم که نظرات و سوالتتون رو در بخش کامنت ها بپرسید.
با سلام و تشکر از مطلب مفیدتون،
یادمه روزای اول که زبان C تمرین میکردم ، همین خطا هایی که کامپایلر به خط فلان گیر میداد ، برام موضل شده بود.
از طرفی خیلی منابع اصلا در مورد اینکه دریافت ارور ممکنه از خط های قبلی باشه توضیح نمیدادن!
کار خوبی میکنید که ساده و خلاصه احتمالات ممکن رو توضیح میدید.
سلام و درود
همیشه دلم میخواست با جزئیات زبان سی و اینطور مسائل اشنا بشم ولی زبانم ضعیفه و نمیتونم منابع انگلیسی رو دنبال کنم.
خیلی ممنونم از این تیم زحمت کش.