
زبان برنامهنویسی سی، زبانی همه منظوره، ساختیافته، دستوری و روندگرا میباشد که در سال ۱۹۷۲ توسط دنیس ریچی در آزمایشگاههای بل ساخته شد.
پیشینه:
در سال ۱۹۶۷ مارتین ریچاردز زبان BCPL را برای نوشتن نرمافزارهای سیستمعامل و کامپایلر در دانشگاه کمبریج ابداع کرد. سپس در سال ۱۹۷۰ کن تامپسون زبان B را بر مبنای ویژگیهای زبان BCPL نوشت و از آن برای ایجاد اولین نسخههای سیستمعامل یونیکس در آزمایشگاههای بل استفاده کرد. زبان C در سال ۱۹۷۲ توسط دنیس ریچی از روی زبان B و BCPL در آزمایشگاه بل ساخته شد و ویژگیهای جدیدی همچون نظارت بر نوع دادهها نیز به آن اضافه شد. ریچی از این زبان برای ایجاد سیستمعامل یونیکس استفاده کرد اما بعدها اکثر سیستمعاملهای دیگر نیز با همین زبان نوشته شدند. این زبان با سرعت بسیاری گسترش یافت و چاپ کتاب "The C Programming Language" در سال ۱۹۷۸ توسط برایان کرنیگان و ریچی باعث رشد روزافزون این زبان در جهان شد. متأسفانه استفاده گسترده این زبان در انواع کامپیوترها و سختافزارهای مختلف باعث شد که نسخههای مختلفی از این زبان بوجود آید که با یکدیگر ناسازگار بودند. در سال ۱۹۸۳ مؤسسه استانداردهای ملی آمریکا (ANSI) کمیتهای موسوم به X3J11 را را مأمور کرد تا یک تعریف فاقد ابهام و مستقل از ماشین را از این زبان تدوین نماید. در سال ۱۹۸۹ این استاندارد تحت عنوان ANSI C به تصویب رسید و سپس در سال ۱۹۹۰، سازمان بینالمللی استانداردسازی (ISO) نیز این استاندارد را پذیرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گردید. در سالهای بعد و با ظهور روشهای برنامهنویسی شئگرا نسخه جدیدی از زبان C بنام C++ توسط بییارنه استراستروپ در اوایل ۱۹۸۰ در آزمایشگاههای بل توسعه یافت. در C++ علاوه بر امکانات جدید، خاصیت شئگرایی نیز به C اضافه شدهاست. با گسترش شبکه و اینترنت، نیاز به زبانی احساس شد که برنامههای آن بتوانند برروی هر ماشین و هر سیستمعامل دلخواهی اجرا گردد. شرکت سان مایکروسیستمز در سال ۱۹۹۵ میلادی زبان جاوا را برمبنای C و C++ ایجاد کرد که هم اکنون از آن در سطح وسیعی استفاده میشود و برنامههای نوشته شده به آن برروی هر کامپیوتری که از جاوا پشتیبانی کند (تقریباً تمام سیستمهای شناخته شده) قابل اجرا میباشد.
برنامه نویسی ساخت یافته:
در دهه ۱۹۶۰ میلادی توسعه نرمافزار دچار مشکلات عدیدهای شد. در آن زمان سبک خاصی برای برنامه نویسی وجود نداشت و برنامهها بدون هیچگونه ساختار خاصی نوشته میشدند. وجود دستور پرش (goto) نیز مشکلات بسیاری را برای فهم و درک برنامه توسط افراد دیگر ایجاد میکرد، چرا که جریان اجرای برنامه مرتباً دچار تغییر جهت شده و دنبال کردن آن دشوار میگردید؛ لذا نوشتن برنامهها عملی بسیار زمان بر و پرهزینه شده بود و معمولاً اشکال زدایی، اعمال تغییرات و گسترش برنامهها بسیار مشکل بود. فعالیتهای پژوهشی در این دهه باعث بوجود آمدن سبک جدیدی از برنامه نویسی بنام برنامهنویسی ساختیافته گردید؛ روش منظمی که باعث ایجاد برنامههایی کاملاً واضح و خوانا گردید که اشکالزدایی و خطایابی آنها نیز بسیار سادهتر بود. اصلیترین نکته در این روش عدم استفاده از دستور پرش (goto) است. تحقیقات بوهم و ژاکوپینی نشان داد که میتوان هر برنامهای را بدون دستور پرش و فقط با استفاده از ۳ ساختار کنترلی ترتیب، انتخاب و تکرار نوشت. ساختار ترتیب، همان اجرای دستورات بصورت متوالی (یکی پس از دیگری) است که کلیه زبانهای برنامه نویسی در حالت عادی بهمان صورت عمل میکنند. ساختار انتخاب به برنامهنویس اجازه میدهد که براساس درستی یا نادرستی یک شرط، تصمیم بگیرد کدام مجموعه از دستورات اجرا شود. ساختار تکرار نیز به برنامه نویسان اجازه میدهد مجموعه خاصی از دستورات را تا زمانیکه شرط خاصی برقرار باشد، تکرار نماید. هر برنامه ساختیافته از تعدادی بلوک تشکیل میشود که این بلوکها به ترتیب اجرا میشوند تا برنامه خاتمه یابد (ساختار ترتیب). هر بلوک میتواند یک دستور ساده مانند خواندن، نوشتن یا تخصیص مقدار به یک متغیر باشد و یا اینکه شامل دستورهایی باشد که یکی از ۳ ساختار فوق را پیادهسازی کنند. نکته مهم اینجاست که درمورد دستورات داخل هر بلوک نیز همین قوانین برقرار است و این دستورات میتوانند از تعدادی بلوک به شرح فوق ایجاد شوند و تشکیل ساختارهایی مانند حلقههای تودرتو را دهند. نکته مهم اینجاست که طبق قوانین فوق یک حلقه تکرار یا بطور کامل داخل حلقه تکرار دیگر است و یا بطور کامل خارج آن قرار میگیرد و هیچگاه حلقههای روی هم افتاده نخواهیم داشت. از جمله اولین تلاشها در زمینه ساخت زبانهای برنامه نویسی ساختیافته، زبان پاسکال بود که توسط پروفسور نیکلاوس ویرت در سال ۱۹۷۱ برای آموزش برنامه نویسی ساخت یافته در محیطهای آموزشی ساخته شد و بسرعت در دانشگاهها رواج یافت اما بدلیل نداشتن بسیاری از ویژگیهای مورد نیاز مراکز صنعتی و تجاری در بیرون دانشگاهها موفقیتی نیافت. کمیبعد زبان C ارائه گردید که علاوه بر دارا بودن ویژگیهای برنامه نویسی ساخت یافته بدلیل سرعت و کارایی بالا مقبولیتی همه گیر یافت و هم اکنون سالهاست که بهعنوان بزرگترین زبان برنامهنویسی دنیا شناخته شده است.
مراحل اجرای یک برنامه C:
برنامههای نوشته شده به زبان C در فایلی متنی با پسوند c. ذخیره میشوند. به این فایل، کد منبع (source code) گفته میشود. فایل کد منبع برای اجرا باید به زبان ماشین ترجمه شود که به اینکار ترجمه (compile) و به برنامهای که عمل ترجمه به زبان ماشین یا زبان دیگر را انجام میدهد مترجم (compiler) میگویند. کامپایلرهای متعددی برای زبان C و برای سیستمعاملهای مختلف نوشته شده است، مانند Clang. معمولاً برنامه نویسان C در برنامههای خود از یک سری از کدهای از پیش آماده شده برای انجام عملیات متداول (مانند محاسبه جذر و یا سینوس) استفاده میکنند که برنامه آنها قبلاً نوشته و ترجمه شده است. این برنامهها یا در قالب کتابخانههای استاندارد توسط شرکتهای ارائه کننده نرمافزار و یا توسط دیگر برنامهنویسان نوشته و در اختیار شخص یا بر روی اینترنت قرار داده شده است که در چنین وضعیتی باید کد منبع با کدهای مربوط به برنامههای کمکی پیوند زدهشود. برای اینکار نیاز به یک پیوند دهنده (Linker) داریم و نتیجه این عمل یک فایل اجرایی خواهد بود. مرحله بعدی اجرای برنامه و دادن ورودیهای لازم به آن و اخذ خروجیها میباشد. در شکل زیر این مراحل نشان داده شدهاند. یک برنامه ساده با ورودی و خروجی مسلماً انجام مراحل بالا برای اجرای هر برنامه زمانبر میباشد، بهمین دلیل اکثر توسعهدهندگان کامپایلرها، محیطهایی را برای برنامه نویسی ارائه کردهاند که کلیه مراحل بالا را بطور اتوماتیک انجام میدهند. به این محیطها Integrated Development Environment (سرواژه:IDE) (محیط توسعه مجتمع) گفته میشود. این محیطها دارای یک ویرایشگر متن میباشند که معمولاً دارای ویژگیهایی همچون استفاده از رنگهای مختلف برای نشان دادن اجزای مختلف برنامه مانند کلمات کلیدی و قابلیت تکمیل اتوماتیک قسمتهای مختلف برنامه میباشد. پس از نوشتن برنامه و Run کردن آن، کلیه عملیات فوق بطور اتوماتیک انجام شده و برنامه اجرا میگردد. علاوه براین، این محیطها معمولاً دارای امکانات اشکالزدایی برنامه (Debug) نیز میباشند که شامل مواردی همچون اجرای خط به خط برنامه و یا دیدن محتویات متغیرها در زمان اجرا است.
استفاده از آرایه های ادبی C :
بسیاری از موارد پیش میآید که برنامه نویس نیاز به استفاده از تعداد زیادی متغیر پیدا میکند. مثلاً اگر بخواهیم جملات ۱ تا ۱۰۰ سری فیبوناچی را برای استفاده ذخیره کنیم، به صد متغیر نیاز داریم. تعریف این صد متغیر به صورت مستقل و با نامهای جداگانه کاری سخت و طاقت فرساست و البته معقولانه نیست. به همین خاطر در زبان C قابلیتی پیش بینی شده تا بتواند تعداد دلخواهی متغیر از یک نوع را به راحتی ایجاد کرد. به این متغیرها که در حافظه پشت سر هم قرار میگیرند و همگی از یک نوع هستند آرایه (Array) میگویند. آرایهها کاربردهای بسیار زیادی دارند و همانند دنبالهها در ریاضی عمل میکنند. همان طور که در ریاضی برای مشخص کردن یک جمله از دنباله از اندیس استفاده میکنیم، در C نیز برای مشخص کردن یک متغیر خاص از اندیس استفاده میشود. همان طور که مشاهده میکنید خانهٔ پنجم شمارهٔ ۴ دارد و این بدین خاطر است که خانهها از شمارهٔ ۰ تا n-1 (که n تعداد خانه هاست) شماره گذاری میشود. پس باید به این مورد دقت کرد. مورد دیگر این که شمارهٔ خانه در [] قرار میگیرد. درون علامت آکلاد میتوان عبارت نیز قرار داد. همان طور که گفته شد در حافظهٔ رایانه خانههای آرایه پشت سر هم قرار میگیرند. اندازهٔ هر خانه به اندازهٔ نوع تعریف شده است. مثلاً در مثال قبل اگر int دو بایت اشغال کند آرایهٔ array، در کل ۲۰ بایت از حافظه اشغال خواهد کرد. این که خانهها پشت سر هم قرار میگیرند ویژگی کارایی است که در بحث اشاره گرها به کار میآید.
اشاره گرها در C:
یکی از مهمترین قابلیتهای زبان C، امکان استفاده از اشاره گر هااست. اشاره گرها کارایی، قدرت و انعطافپذیری برنامه را بیش تر مینمایند. علاوه بر فراهم آوردن امکان نوشتن کدهای برنامهٔ کوتاهتر، غنی تر و کاراتر، گاهی مواردی پیش میآید که انجام محاسبات مورد نیاز برنامه تنها توسط اشاره گرها امکانپذیر میباشد. به همین دلیل، از این توانایی در برنامههای C زیاد استفاده میگردد. اگر چه در ظاهر کار با اشاره گرها مشکل است و درک برنامهای که از آنها استفاده شده است ساده نیست، اما در حقیقت اگر از آنها به درستی استفاده گردد، وضوح و سادگی برنامه افزایش مییابد.
برنامه نویسی C سی زبان نرم افزاری