زبان C چیست؟ تاریخچه و مقدمه ای بر زبان C
++C
زبان برنامه نویسی C ، زبانی همه منظوره، ساخت یافته و روندگرا میباشد که در سال ۱۹۷۲ توسط دنیس ریچی در آزمایشگاه بل ساخته شد.
برای بررسی تاریخچه زبان C باید به سال ۱۹۶۷ بازگردیم
که مارتین ریچاردز را برای نوشتن نرمافزارهای سیستمعامل و کامپایلر در
دانشگاه کمبریج ابداع کرد. سپس در سال ۱۹۷۰ کن تامپسون زبان B را بر مبنای ویژگیهای زبان BCPL نوشت و از آن برای ایجاد اولین نسخههای سیستمعامل یونیکس در آزمایشگاههای بل استفاده کرد. زبان C
در سال ۱۹۷۲ توسط دنیس ریچی از روی زبان B و BCPL در آزمایشگاه بل ساخته
شد و ویژگیهای جدیدی همچون نظارت بر نوع دادهها نیز به آن اضافه شد.
ریچی از این زبان برای ایجاد سیستمعامل یونیکس استفاده
کرد اما بعدها اکثر سیستمعاملهای دیگر نیز با همین زبان نوشته شدند. این
زبان با سرعت بسیاری گسترش یافت و چاپ کتاب “The C Programming Language”
در سال ۱۹۷۸ توسط کرنیگان و ریچی باعث رشد روزافزون این زبان در جهان شد.
متاسفانه استفاده گسترده این زبان در انواع کامپیوترها و سختافزارهای
مختلف باعث شد که نسخههای مختلفی از این زبان بوجود آید که با یکدیگر
ناسازگار بودند. در سال ۱۹۸۳ انستیتوی ملی استاندارد آمریکا (ANSI)
کمیتهای موسوم به X3J11 را را مأمور کرد تا یک تعریف فاقد ابهام و مستقل
از ماشین را از این زبان تدوین نماید. در سال ۱۹۸۹ این استاندارد تحت
عنوان ANSI C به تصویب رسید و سپس در سال ۱۹۹۰، سازمان استانداردهای بین
المللی (ISO) نیز این استاندارد را پذیرفت و مستندات مشترک آنها تحت عنوان
ANSI/ISO C منتشر گردید.
در سالهای بعد و با ظهور روشهای برنامهنویسی شئگرا نسخه جدیدی از زبان C بنام C++ توسط بیارنه استراوستروپ در اوایل ۱۹۸۰ در آزمایشگاه بل توسعه یافت. در C++ علاوه بر امکانات جدیدی که به زبان C اضافه شده است، خاصیت شئگرایی را نیز به آن اضافه شدهاست.
با گسترش شبکه و اینترنت، نیاز به زبانی احساس شد که برنامههای آن
بتوانند برروی هر ماشین و هر سیستمعامل دلخواهی اجرا گردد. شرکت سان
مایکروسیستمز در سال ۱۹۹۵ میلادی زبان جاوا را برمبنای C و C++ ایجاد کرد
که هم اکنون از آن در سطح وسیعی استفاده میشود و برنامههای نوشته شده به
آن برروی هر کامپیوتری که از جاوا پشتیبانی کند (تقریباً تمام سیستمهای
شناخته شده) قابل اجرا میباشد. شرکت مایکروسافت در رقابت با شرکت سان، در
سال ۲۰۰۲ زبان جدیدی بنام C# (سی شارپ) را ارائه داد که رقیبی برای Java بشمار میرود.
اطلاعات کامل در ادامه مطلب…
پس از نوشتن یک الگوریتم باید آن را با
استفاده از یک زبان برنامه نویسی تبدیل به یک برنامه قابل اجرا برای
کامپیوتر نماییم. این زبانها به سه دسته کلی تقسیم میگردند :
۱- زبان ماشین (سطح پایین) : این زبان مستقیما با صفر و
یک نوشته می شود و بدون هیچ واسطه ای برروی کامپیوتر قابل اجرا است.
طراحان سخت افزار هر کامپیوتر، زبان ماشین خاص خود را برای آن ماشین طراحی
می نمایند. به همین دلیل هر برنامه ای که به زبان ماشین نوشته شود، فقط
برروی همان ماشین خاص کار می کند، بهمین دلیل برنامه های نوشته شده به
زبان ماشین را غیر قابل حمل می نامند. از طرف دیگر یادگیری این زبان بسیار
مشکل بوده و برنامه نویسی با آن نیز بسیار سخت است و همچنین احتمال بروز
خطا نیز در آن زیاد است.
۲- زبان اسمبلی : این زبان شکل ساده تر زبان ماشین است،
بدین صورت که برای هر دستورالعمل زبان ماشین، یک اسم نمادین انتخاب شده
است (مانند دستور ADD بجای کد دودویی دستورالعمل جمع) که بخاطر سپردن و
برنامه نویسی با آنها برای انسانها ساده تر است. اما این برنامه ها برای
ماشین قابل فهم نیست و باید قبل از اجرا شدن توسط برنامه مترجمی بنام
اسمبلر به زبان ماشین تبدیل شود. توجه کنید که از آنجا که هر دستور زبان
اسمبلی معادل یک دستور زبان ماشین است، این زبان نیز وابسته به ماشین می
باشد و برنامه های نوشته شده به این زبان فقط برروی همان کامپیوتری که
برای آن نوشته شده اند قابل اجرا است. علاوه براین کار با این زبانها هنوز
هم نسبتا مشکل بود و فقط متخصصین کامپیوتر قادر به استفاده از آنها بودند.
۳- زبانهای سطح بالا : دستورالعملهای این زبانها بسیار
نزدیک به زبان انسانها (بطور مشخص زبان انگلیسی) می باشد و بهمین دلیل
برنامه نویسی به آنها بسیار ساده تر بوده و می توان الگوریتمها را به
راحتی به این زبانها تبدیل کرد. از آنجا که این زبانها به هیچ ماشین خاصی
وابسته نیستند، برنامه های نوشته شده با این زبانها (تا حد زیادی) قابل
حمل می باشند. مثالهایی از این زبانها عبارتند از :
- بیسیک (Basic): برای کاربردهای آموزشی
- فرترن (Fortran) : برای کاربردهای علمی و مهندسی
- پاسکال (Pascal) : برای کاربردهای آموزشی و علمی
و بالاخره زبان برنامه نویسی C که
درمورد آن بیشتر صحبت خواهیم کرد. البته برنامه های نوشته شده به این
زبانها ابتدا باید به زبان ماشین ترجمه شوند تا برروی کامپیوتر قابل اجرا
باشند. برای ترجمه این زبانها از کامپایلرها و یا مفسرها استفاده می شود.
برنامه نویسی ساخت یافته
در دهه ۱۹۶۰ میلادی توسعه نرمافزار دچار مشکلات عدیدهای شد. در آن
زمان سبک خاصی برای برنامه نویسی وجود نداشت و برنامهها بدون هیچگونه
ساختار خاصی نوشته میشدند. وجود دستور پرش (goto) نیز مشکلات بسیاری را
برای فهم و درک برنامه توسط افراد دیگر ایجاد میکرد، چرا که جریان اجرای
برنامه مرتبا دچار تغییر جهت شده و دنبال کردن آن دشوار میگردید. لذا
نوشتن برنامهها عملی بسیار زمان بر و پرهزینه شده بود و معمولاً اشکال
زدایی، اعمال تغییرات و گسترش برنامهها بسیار مشکل بود. فعالیتهای پژوهشی
در این دهه باعث بوجود آمدن سبک جدیدی از برنامه نویسی بنام روش
ساختیافته گردید؛ روش منظمی که باعث ایجاد برنامههایی کاملاً واضح و
خوانا گردید که اشکالزدایی و خطایابی آنها نیز بسیار سادهتر بود.
اصلیترین نکته در این روش عدم استفاده از دستور پرش (goto) است.
تحقیقات بوهم و ژاکوپینی نشان داد که میتوان هر برنامهای را بدون دستور
پرش و فقط با استفاده از ۳ ساختار کنترلی ترتیب، انتخاب و تکرار نوشت.
ساختار ترتیب، همان اجرای دستورات بصورت متوالی (یکی پس از دیگری) است
که کلیه زبانهای برنامه نویسی در حالت عادی بهمان صورت عمل میکنند.
ساختار انتخاب به برنامه نویس اجازه میدهد که براساس درستی یا نادرستی یک شرط، تصمیم بگیرد کدام مجموعه از دستورات اجرا شود.
ساختار تکرار نیز به برنامه نویسان اجازه میدهد مجموعه خاصی از دستورات را تا زمانیکه شرط خاصی برقرار باشد، تکرار نماید.
هر برنامه ساختیافته از تعدادی بلوک تشکیل میشود که این بلوکها به
ترتیب اجرا میشوند تا برنامه خاتمه یابد (ساختار ترتیب). هر بلوک
میتواند یک دستور ساده مانند خواندن، نوشتن یا تخصیص مقدار به یک متغیر
باشد و یا اینکه شامل دستوراتی باشد که یکی از ۳ ساختار فوق را پیاده سازی
کنند. نکته مهم اینجاست که درمورد دستورات داخل هر بلوک نیز همین قوانین
برقرار است و این دستورات میتوانند از تعدادی بلوک به شرح فوق ایجاد شوند
و تشکیل ساختارهایی مانند حلقههای تودرتو را دهند.
نکته مهم اینجاست که طبق قوانین فوق یک حلقه تکرار یا بطور کامل داخل
حلقه تکرار دیگر است و یا بطور کامل خارج آن قرار میگیرد و هیچگاه
حلقههای روی هم افتاده نخواهیم داشت.
از جمله اولین تلاشها در زمینه ساخت زبانهای برنامه نویسی ساختیافته،
زبان پاسکال بود که توسط پروفسور نیکلاس ورث در سال ۱۹۷۱ برای آموزش
برنامه نویسی ساختیافته در محیطهای آموزشی ساخته شد و بسرعت در دانشگاهها
رواج یافت. اما بدلیل نداشتن بسیاری از ویژگیهای مورد نیاز مراکز صنعتی و
تجاری در بیرون دانشگاهها موفقیتی نیافت.
کمیبعد زبان C ارائه گردید که علاوه بر دارا بودن
ویژگیهای برنامه نویسی ساختیافته بدلیل سرعت و کارایی بالا مقبولیتی همه
گیر یافت و هم اکنون سالهاست که بهعنوان بزرگترین زبان برنامه نویسی
دنیا شناخته شده است.
مراحل اجرای یک برنامه C
برای اجرای یک برنامه C ابتدا باید آن را نوشت. برای
اینکار میتوان از هر ویرایشگر متنی موجود استفاده کرد و سپس فایل حاصل را
با پسوند .C ذخیره نمود (فایلهای C++ با پسوند.CPP ذخیره میگردند). به
این فایل، کد مبدأ (source code) گفته میشود. مرحله بعدی تبدیل کد مبدا
به زبان ماشین است که به آن کد مقصد (object code) گفته میشود. همانطورکه
قبلا نیز گفته شد برای اینکار از یک برنامه مترجم بنام کامپایلر استفاده
میشود. کامپایلرهای متعددی برای زبان C توسط شرکتهای
مختلف و برای سیستمعاملهای مختلف نوشته شده است که میتوانید برحسب نیاز
از هریک از آنها استفاده نمایید. اما هنوز برنامه برای اجرا آماده نیست.
معمولاً برنامه نویسان از در برنامههای خود از یک سری از کدهای از پیش
آماده شده برای انجام عملیات متداول (مانند محاسبه جذر و یا سینوس)
استفاده میکنند که برنامه آنها قبلا نوشته و ترجمه شده است. این
برنامهها یا در قالب کتابخانههای استاندارد توسط شرکتهای ارائه کننده
نرمافزار عرضه شده است و یا توسط دیگر همکاران برنامه نویس اصلی نوشته و
در اختیار وی قرار داده شده است. در این مرحله باید کد مقصد برنامه اصلی
با کدهای مربوط به این برنامههای کمکی پیوند زدهشود. برای اینکار نیاز
به یک پیوندزننده (Linker) داریم و نتیجه این عمل یک فایل قابل اجرا خواهد
بود (در سیستمعامل ویندوز این فایل پسوند .EXE خواهد داشت). مرحله بعدی
اجرای برنامه و دادن ورودیهای لازم به آن و اخذ خروجیها میباشد. در شکل
زیر این مراحل نشان داده شده اند.
یک برنامه ساده با ورودی و خروجی
مسلما طی مراحل بالا برای اجرای هر برنامه زمانبر میباشد، بهمین دلیل
اکثر تولید کنندگان کامپایلرها، محیطهایی را برای برنامه نویسی ارائه کرده
اند که کلیه مراحل بالا را بطور اتوماتیک انجام میدهند.
به این محیطها IDE (Integrated Development Environment) یا محیط مجتمع
توسعه نرمافزار گفته میشود. این محیطها دارای یک ویرایشگر متن میباشند
که معمولاً دارای خواص جالبی همچون استفاده از رنگهای مختلف برای نشان
دادن اجزای مختلف برنامه مانند کلمات کلیدی و قابلیت تکمیل اتوماتیک
قسمتهای مختلف برنامه میباشد. پس از نوشتن برنامه و با انتخاب گزینهای
مانند Run کلیه عملیات فوق بطور اتوماتیک انجام شده و برنامه اجرا
میگردد. علاوه براین، این محیطها معمولاً دارای امکانات اشکالزدایی
برنامه (Debug) نیز می باشند که شامل مواردی همچون اجرای خط به خط برنامه
و یا دیدن محتویات متغیرها در زمان اجرا است. چند محیط معروف برنامه نویسی
عبارتاند از :
- Borlan_d C++ 3.1 برای محیط DOS
- Borlan_d C++ از نسخه ۴ به بالا برای Windows
- Microsoft Visual C++ برای محیط Windows
- Borlan_d C++ Builder برای محیط Windows
خطاهای برنامه نویسی
بنظر میرسد خطاها جزء جداناپذیر برنامهها هستند. بندرت میتوان
برنامهای نوشت که در همان بار اول بدرستی و بدون هیچگونه خطایی اجرا شود.
اما خطاها از لحاظ تأثیری که بر اجرای برنامهها میگذارند، متفاوتند.
گروهی ممکن است باعث شوند که از همان ابتدا برنامه اصلاً کامپایل نشود و
گروه دیگر ممکن است پس از گذشت مدتها و در اثر دادن یک ورودی خاص به
برنامه، باعث یک خروجی نامناسب و یا یک رفتار دور از انتظار (مانند قفل
شدن برنامه) شوند. بطور کلی خطاها به دو دسته تقسیم میشوند:
- خطاهای نحوی (خطاهای زمان کامپایل): این خطاها در
اثر رعایت نکردن قواعد دستورات زبان C و یا تایپ اشتباه یک دستور بوجود
میآیند و در همان ابتدا توسط کامپایلر به برنامه نویس اعلام میگردد.
برنامه نویس باید این خطا را رفع کرده و سپس برنامه را مجدداً کامپایل
نماید. لذا معمولاً این قبیل خطاها خطر کمتری را در بردارند.
- خطاهای منطقی (خطاهای زمان اجرا): این دسته خطاها در
اثر اشتباه برنامه نویس در طراحی الگوریتم درست برای برنامه و یا گاهی در
اثر درنظر نگرفتن بعضی شرایط خاص در برنامه ایجاد میشوند. متأسفانه این
دسته خطاها در زمان کامپایل اعلام نمیشوند و در زمان اجرای برنامه خود را
نشان میدهند. بنابراین، این خود برنامهنویس است که پس از نوشتن برنامه
باید آن را تست کرده و خطاهای منطقی آن را پیدا کرده و رفع نماید.
متاسفانه ممکن است یک برنامهنویس خطای منطقی برنامه خود را تشخیص ندهد و
این خطا پس از مدتها و تحت یک شرایط خاص توسط کاربر برنامه کشف شود. بهمین
دلیل این دسته از خطاها خطرناکتر هستند. خود این خطاها به دو دسته تقسیم
میگردند:
- خطاهای مهلک: در این دسته خطاها کامپیوتر بلافاصله
اجرای برنامه را متوقف کرده و خطا را به کاربر گزارش میکند. مثال معروف
این خطاها خطای تقسیم بر صفر میباشد.
- خطاهای غیرمهلک: در این دسته خطا،d. اجرای برنامه
ادامه مییابد ولی برنامه نتایج اشتباه تولید مینماید. بهعنوان مثال
ممکن است دراثر وجود یک خطای منطقی در یک برنامه حقوق و دستمزد،e. حقوق
کارمندان اشتباه محاسبه شود و تا مدتها نیز کسی متوجه این خطا نشود!
با توجه به آنچه گفته شد، در مییابیم که رفع اشکال برنامهها بخصوص
خطاهای منطقی از مهمترین و مشکلترین وظایف یک برنامه نویس بوده و گاهی
حتی سختتر از خود برنامهنویسی است! بهمین دلیل است که بسیاری از
شرکتها(همانند مایکروسافت) ابتدا نسخهٔ اولیه نرمافزار خود را در اختیار
کاربران قرار میدهند تا اشکالات آن گزارش شده و رفع گردد. بسیار مهم است
که در ابتدا سعی کنید برنامهای بنویسید که حداقل خطاها را داشته باشد، در
گام دوم با آزمایش دقیق برنامه خود هرگونه خطای احتمالی را پیدا کنید و در
گام سوم بتوانید دلیل بروز خطا را پیدا کرده و آنرا رفع نمایید. هر سه عمل
فوق کار سختی بوده و نیاز به تجربه و مهارت دارد.
آخرین نکته اینکه در اصطلاح برنامه نویسی به هرگونه خطا، bug و به رفع خطا debug گفته میشود.
مربوط به:++C چیست؟،basic،Borlan_d C++،Borlan_d C++ 3.1،Borlan_d C++ Builder،C++،fortran،Microsoft Visual C++،pascal،برنامه نویسی،برنامه نویسی C،برنامه نویسی C چیست؟،بسیک،تاریخچه،تاریخچه C،زبان،زبان B،زبان BCPL،زبان C،زبان java،زبان اسمبلی،زبان برنامه نویسی C،زبان جاوا،زبان ماشین،زبان های سطح بالا،سطح پایین،سی،فرترن،پاسکال،یونیکس