Programming in C © 2003 Kishori Mundargi - 2006 Translation Farnaz Helforoush & Babak Salamat

فصل ۲:

کامپایل یک برنامه ساده

این بخش شامل برنامه های ساده C می شود که به دانش آموزان برای درک بهتر ساختارهای برنامه C کمک می کند. دانش آموزان تشویق می شوند که هر تعداد ممکن برنامه را امتحان کرده و با دستورات این زبان و انواع خطاهای محتمل آشنا شوند.

یکی از مهم ترین مشخصه های C حساس بودن آن به حروف بزرگ و کوچک است. حروف بزرگ و کوچک با هم متمایزند. به همین دلیل کامپایلر C متغیر VAR را به طور دیگری از Var یا var تفسیر می کند. همچنین بر خلاف سایر زبانها مانند فرترن اهمیتی ندارد که دستور را از کجای سطر آغاز کنیم . با این حال پیشنهاد می شود که از قرار دادهای معمول برنامه نویسی برای هر چه بهتر خواندن و عیب یابی برنامه استفاده شود .

برنامه زیر را در نظر بگیرید:

/* Program to display a string on the screen */

#include <stdio.h> void main() { printf("Hello World \n"); }

قدم اول بهتر است بخشهای مختلف این برنامه C را متوجه شویم. این برنامه با سطر توضیحی که بین دو علامت /* و */ قرار گرفته آغاز می شود . سطر توضیحی A یک نوشته یا توضیح است که در کد اصلی برنامه نوشته می شود. این توضیحات عمدتا به منظور بیان هدف از قرار دادن کد برنامه استفاده می شود, بنابراین شما بعدا نیز می توانید به خاطر آورید که چگونه از این دستور استفاده می شود. علاوه بر این شما می توانید از این دستور برای حذف موقت یک سطر از برنامه با قرار دادن آن سطر در بین دو علامت مذکور استفاده کنید. سطور توضیحی نمی توانند تو در تو باشند ولی می توانند خطوط بسیاری را شامل شوند. به طور کلی در ابتدای برنامه یا توابع یا سطر هایی که شامل کدهای دیگر می شوند, قرار می گیرند . سطور توضیحی برنامه را خوانا تر و قابل ویرایش تر می کنند.

خط دوم برنامه مسیر پیش پردازه ها را مشخص می کند . پیش پردازه ها در فصل زیردنباله ها شرح داده شده اند ( فصل 14 را ببینید). این پیش پردازه به کامپایلر می گوید که فایل سربرگ stdio.h را به برنامه اضافه کند. این یک فایل سربرگ استاندارد است که شامل توابع و متغیرهای عمومی برای برنامه و فایلهای ورودی و خروجی می باشد. اگر فایل سربرگ توسط کامپایلر پشتیبانی شود , بوسیله علامت کوچکتر و بزرگتر مشخص می شود (<>)، در غیر اینصورت اگر فایل اضافه شده را خودتان ایجاد کرده باشید بوسیله گیومه مشخص می شود (" "). برای توضیحات بیشتر به فایل مرجع کتابخانه ای برنامه C مراجعه کنید.

main() یک لغت پیش فرض است که به عنوان آغاز برنامه C در نظر گرفته شده است. این دقیقا نقطه ایست که برنامه شروع به کار می کند. اصطلاح پیش فرض Void قبل از main() نشان می دهد که تابع main() هیچ مقداری را بر نمی گرداند. پرانتزهای بعد از کلمه main به این معناست که هیچ مقدار یا نشانوندی به این تابع ارسال نشده است. هماهنگی قسمتهای مختلف تابع و چگونگی عملکرد آن به جزئیات در فصل فصل 17 در قسمت توابع شرح داده شده است.

پس از main, بدنه اصلی برنامه قرار دارد که شامل تعداد زیادی دستور عمل می باشد که داخل براکت قرار گرفته اند.در برنامه بالا, فقط یک دستور وجود دارد که دستور printf() می باشد. این یکی از دستورهای برنامه C می باشد که محتویات و پارامترهای برنامه را به خروجی انتقال داده یا در صفحه نمایشگر نشان می دهد. در اینجا, این برنامه عبارت "Hello World" را در صفحه نمایشگر نشان می دهد. کاراکتر مقابل (\) و حرف n نشان دهنده سطر جدیدی از کاراکترها می باشد. این دو کاراکتر به برنامه C میگوید که پس از چاپ خروجی موقعیت را به خط بعد انتقال دهد. این عمل دقیقا همانند سر سطر رفتن در ماشین تحریر است.

نکته : تمام خط دستورات برنامه C باید به ویرگول-نقطه ختم شوند.

به برنامه زیر که طرز کار n را نشان می‌دهد، دقت کنید:

/* Program for displaying two strings */

#include <stdio.h> void main() { printf("Hello World \n Programming in C is interesting ! \n"); }

کامپایل کردن یک برنامه C

ابتدا با استفاده از یک ویرایشگر متن فایلی با پسوند c. ایجاد کنید و آن را ذخیره نمایید. همان طور که در فصل قبل گفته شد، دستور ساده زیر کامپایل کردن را بر روی هر سیستمی که دارای کامپایلر C باشد، آغاز می‌کند:

cc prg1.c

در اینجا فرض بر این است که متن برنامه در فایل prg1.c ذخیره شده است. کامپایلرهای زیادی برای C وجود دارد. cc کامپایلر پیش فرض در سیستم‌های Sun می‌باشد. کامپایلر C GNU به نام gcc برای سیستم‌های عامل متعددی وجود دارد. کاربران PC ممکن است با کامپایلر bcc شرکت Borland نیز آشنا باشند. تمام کامپایلرهای C مشابه یکدیگر کار می‌کنند و دارای تعدادی گزینه‌های مشترک هستند. برای مشاهده گزینه‌های کامپایلر به قسمت ضمائم مراجعه کنید یا برای دریافت توضیحات از کامپیوتر این دستور را تایپ کنید: man cc

در طول این درس ما از cc استفاده خواهیم کرد. سایر کامپایلرها به راحتی می‌توانند جایگزین cc شوند مگر این که صراحتا خلاف آن گفته شده باشد.

به طور خلاصه پروسه کامپایل کردن شامل مراحل زیر است:

پیش پردازه - پیش پردازه متن برنامه را به عنوان ورودی دریافت می‌کند و وظیفه‌اش تفسیر کردن رهنمودهای (directive) پیش پردازه است که با # مشخص شده است. مانند include# و define#.

کامپایلر C - کامپایلر متن برنامه را بررسی می‌کند و به دنبال خطاهای نحوی (syntax) می‌گردد. هر خطایی که پیدا شود بر روی صفحه نمایش داده می‌شود و کامپایل متوقف می‌گردد. کامپایلر نمی‌تواند خطاهای منطقی را تشخیص بدهد. هنگامی که کاربر خطاها را اصلاح نماید و برنامه را مجددا کامپایل کند، کامپایلر متن برنامه را به زبان اسمبلی ترجمه می‌کند.

اسمبلر - تحت UNIX، یک اسمبلر مستقل این کد اسمبلی را به یک فایل باینری تبدیل می‌کند. این فایل در سیستم‌های UNIX با پسوند o. و در MS-DOS با پسوند OBJ. ذخیره می‌شود.

پیوندزدن (Linking) - اگر برنامه از توابع کتابخانه استاندارد یا توابعی که در فایل‌های دیگر تعریف شده‌اند استفاده کند، پیوندگر (Linker) این توابع را با ()main ترکیب می‌کند تا یک فایل اجرایی ایجاد نماید. متغیرهای خارجی (که خارج از فایل اصلی تعریف شده‌اند) نیز در همین مرحله شناسایی می‌شوند. این مرحله نیز هنگامی که دستور cc تحت UNIX صادر شود، به طور خودکار انجام می‌شود. فایل اجرایی تولید شده در MS-DOS یا Windows هم اسم فایل کد برنامه است ولی پسوند آن exe. می‌باشد.

توجه: برای عوض کردن نام فایل اجرایی تولید شده از a.out به نام دلخواه خود در UNIX از گزینه o- همراه با دستور cc استفاده نمایید:

cc -o prg1 prg1.c

این دستور فایل اجرایی با نام prg1 تولید می‌کند.

اجرا کردن یک برنامه C

برای اجرا کردن برنامه C کافی است که a.out را تایپ نمایید یا اگر a.out را با استفاده از گزینه فوق تغییر داده‌اید prg1 را تایپ نمایید. این کار باعث بارگذاری برنامه در حافظه کامپیوتر و آغاز اجرای برنامه می‌گردد. هر خطای زمان اجرا، مانند تقسیم بر صفر، در این مرحله ممکن است به وقوع بپیوندد. در این صورت لازم است تا برنامه مجددا بررسی شود و خطا برطرف گردد و تمام عملیات کامپایل، پیوند و اجرا تکرار شود.

Lint

توصیه می‌شود که قبل از کامپایل کردن یک برنامه بزرگ C آن را با استفاده از "Lint" که یکی از ابزارهای UNIX می‌باشد، بررسی کنید. نحوه استفاده از lint به صورت زیر است:

lint prg1.c

این ابزار فایل اجرایی تولید نمی‌کند، اما لیستی از اشکالات محتمل در برنامه تولید می‌نماید. Lint نوع متغیرها و توابع را چک می‌کند و کارایی برنامه، متغیرهای استفاده نشده و تعاریف توابع، کدهای غیرقابل دسترسی و نشتی احتمالی حافظه را بررسی می‌کند. این ابزار همچنین برنامه را با کتابخانه استاندارد C مطابقت می‌دهد تا اطمینان حاصل کند که تعداد و نوع آرگومان‌های توابع استفاده شده از این کتابخانه صحیح هستند.

Make

Make یکی از ابزارهای UNIX است که کامپایل کردن برنامه‌های پیچیده و برنامه‌هایی که از چند برنامه کوچک‌تر تشکیل شده‌اند را ساده می‌نماید. Make ابتدا به دنبال فایلی به نام "Makefile" می‌گردد, اگر یافت نشد به دنبال "makefile" می‌گردد. Makefile دارای چندین جز می‌باشد، که جزئیات آن در این فصل نخواهد آمد. جهت دریافت اطلاعات بیشتر در این زمینه می‌توانید به ضمائم مراجعه نمایید.

اگر برنامه C شما تنها از یک فایل تشکیل شده است، معمولا می‌توانید از make به سادگی و به صورت زیر استفاده کنید:

make prog1

این دستور prog1.c را کامپایل می‌کند و فایل اجرایی خروجی به نام prog1 تولید می‌کند.

وقتی که یک پروژه از چندین فایل تشکیل شده است، شما می‌توانید هر فایل C را به صورت جداگانه کامپایل نمایید و سپس آنها را پیوند بزنید (Link) تا یک برنامه ایجاد نمایید:

cc -c hello.c
cc -c goodbye.c
cc hello.o goodbye.o -o hello

در هنگام رفع اشکال (debugging)برنامه، کامپایل کردن جداگانه سریع‌تر خواهد بود، زیرا تنها فایل‌هایی که در هنگام رفع اشکال تغییر داده شده‌اند نیاز به کامپایل شدن مجدد دارند. وقتی که شما از make برای مدیریت پروژه خود استفاده می‌کنید، این ابزار فایل‌های تغییر داده شده را پیدا می‌کند و تنها آنهایی را که لازم است مجددا کامپایل می‌کند.

کوئیز

سوالات

مشق

[نظرات شما برای ما مهم است. چنانچه نظری، اصلاحیه‌ای یا سوالی
در مورد این فصل دارید، آن را به آدرس زیر ارسال فرمایید: comments@peoi.org .]

قبل: تاریخچه برنامه نویسی به زبان C

بعد: متغیرها، انواع داده‌ها و ثابت‌ها