تاریخچه زبان سی:
زبان سی در سال ۱۹۷۲ توسط دنیس ریچی طراحی شد. این زبان تکامل یافته زبان BCPL می باشد که طراح آن مارتین ریچاردز است. زبان BCPL از زبان B که طراح آن کِن تامپسون می باشد، نتیجه شده است. علت نامگذاری C این است که بعد از B طراحی شد.
کسانی که تا حدودی با زبانهای برنامه سازی آشنایی دارند، می دانند که ربان دیگری به نام C++ وجود دارد و آن از C ناشی شده است. C++ علاوه بر ویژگی های C، ویژگی های جدیدی دارد که در C موجود نیست. در آموزش حاضر، زبان برنامه نویسی C مورد بررسی قرار می گیرد. در این قسمت بعضی از ویژگی های زبان C را مورد بررسی قرار می دهیم.
ویژگی های زبان سی:
- زبان C یک زبان میانی است. زبان های برنامه سازی را می توان به سه دسته تقسیم کرد:
- زبانهای سطح بالا
- زبانهای میانی
- زبانهای سطح پایین
زبان برنامهنویسی سطح بالا :(High-level programming language)
زبانی است که نسبت به زبان برنامه نویسی سطح پایین راحتتر قابل استفاده و قابل حمل بین سیستمهای متفاوت و دارای انتزاع بیشتری هستند. چنین زبانهایی عموماً از عملیات CPU مانند مدلهای دسترسی به حافظه و مدیریت حوزه دور هستند.
مشخصات زبانهای سطح بالا
عبارت زبانهای سطح بالا بدین معنی نیست که این زبان نسبت به زبانهای سطح پایین برتر هستند بلکه اگر شما میزان اطلاع از نحوه عملکرد رایانهها را به عنوان ملاک در نظر بگیرید برعکس این مطلب درست است. عبارت زبان سطح بالا در حقیقت به معنای دوری این زبانها از زبان ماشین است. به جای کار کردن با ثباتها، آدرسهای حافظه، و فراخوانی پشته زبان برنامهنویسی سطح بالا از متغیرها، آرایهها، و عبارات پیچیده ریاضی و منطقی استفاده مینماید. این زبانها مستقیماً مانند زبان اسمبلی به زبان ماشین ترجمه نمیگردند. ویژگیهای دیگر همانند توابع کار با رشتهها، مفاهیم شیگرایی، و کار با ورودی و خروجی در فایلها در آنها وجود دارد.
به بیان دیگر در حالی که زبان برنامهنویسی سطح بالا برنامهنویسی را آسانتر مینماید اما زبان برنامهنویسی سطح پایین برنامههای بهینهتری تولید میکند.
در یک زبان سطح بالا این امکان را فراهم میسازد تا اجزای پیچیده را به اجزای سادهتر اما هنوز پیچیده تقسیم نموده تا برنامهنویس را از انجام کارهای پیچیده بازدارد. به این دلیل برنامههایی که نیاز به کار با سرعت بالا و بهینهتر دارند باید با زبان سطح پایین نوشته شود حتی اگر زبان سطح بالا این کار را سادهتر سازد.
زبانهای سطح بالا پر کاربردترین و در عین حال جذابترین و کاربردیترین محیطهای برنامه نویسی را شامل میشوند، چرا که محیط آن کاربر پسند (User Friendly) بوده و یادگیری اصطلاحات و مفاهیم آن در محیط و قالبی گرافیکی به کاربر ارائه میشود، برنامه نویسان به راحتی به یادگیری دستورهای و قواعد آن به دلیل اینکه به زبان محاوره ایی و انگلیسی نزدیک است میپردازند، اینگونه زبانها از سرعت کمتری نسبت به زبانهای سطح میانی و پایین برخوردار میباشد، به دلیل اینکه دستورهای بایستی به زبان قابل فهم برای ماشین تبدیل گردند که این خود زمان بر میباشد، ولی در عین حال فضای کمتری اشغال میکنند که نمونه ای از این زبانها، زبانهای برنامه نویسی پاسکال، C، ویژوال، دلفی، فرترن و جاوا میباشند.
امروزه با توجه به ساختار پیچیده ریزپردازندهها کامپایلرهای پیشرفته با استفاده از تکنیکهای بهینهسازی برنامههای بهتری از برنامههای نوشته شده با دست فراهم مینمایند.
زبان برنامهنویسی سطح پایین :(Low-level programming language)
زبانی است که به مقدار کم یا هیچ انتزاعی نسبت به ریزپردازنده فراهم نمینماید. عبارت سطح پایین به این معنی نیست که این زبان نسبت به زبان برنامه نویسی سطح بالا ارزش کمتری دارند بلکه به معنای عدم وجود انتزاع بین این زبان و ساختار ریزپردازنده است از این جهت گاهی این زبانها را نزدیک به سختافزار نیز مینامند. سطح بالا و سطح پایین نسبی هستند و یک برنامهنویس جاوا ممکن است زبان سی را سطح پایین بداند در حالی یک برنامهنویس سی زبان ماشین را در سطحی پایینتر از خود میداند.
زبانهای سطح پایین را گاهی به دو دسته نسل اول و نسل دوم تقسیم مینمایند:
اولین نسل
اولین نسل زبان برنامهنویسی کد ماشین است. این زبان تنها زبانی است که به صورت مستقیم توسط ریزپردازنده درک میگردد. در حال حاضر برنامهنویسان از زبان ماشین استفاده نمیکنند چرا که همانند زبان اسمبلی نیاز به توجه به جزئیات زیادی داشته که زبان سطح بالا خود آنها را برطرف مینماید؛ و برای هر دستور نیاز به یافتن کد عددی متناسب با آن دستور است. به این دلیل زبانهای نسل دوم که یک سطح انتزاع بالاتر از کد ماشین قرار دارد به وجود آمدند.
دومین نسل
زبان نسل دوم زبان اسمبلی است. این زبان با وجود این که در سطح انتزاع بالاتری قرار دارد اما ساختار ریزپردازنده مانند ثباتها و دستورالعملها را مورد توجه قرار میدهد. این دستورالعملهای ساده سپس تبدیل به کد ماشین میگردد. کد اسمبلی را میتوان به سطح بالاتری از انتزاع گسترش داد. به عنوان مثال زبان اسمبلی را میتوان به صورت قابل خواندنتری مانند کد زیر نوشت.
توضیحات: تجرید یا انتزاع در مهندسی نرمافزار را میشود همان امتداد و استمرار تدابیر و مفاهیمی چون توسّل به استفاده از متغیره در جبر به منظور مدیریت پیچیدگی دانست. همانطور که با ترکیب عملیّاتی مثل جمع، و ضرب با متغیرهای جبری میتوان به علم حساب حالتی تعمیمیافته و بلندتراز شده داد، در برنامههای کامپیوتری هم میتوان با استفاده از متغیّرها و توابع برنامهنویسی، همان هدفها را دنبال کرد. تفاوت بسیار عمده را اینبار باید در پیچیدگی، مقیاس پذیری، سرعت و کارایی، و ابعاد بزرگتر و گستردهتر مسائل مورد محاسبه جستجو نمود. تجرید یا انتزاع در دانش رایانه و مهندسی نرمافزار به معنای تفکیک مباحث مربوط به هم و نگریستن به موضوع جدای از مباحث وابسته به آن است. مزیت این کار در مهندسی نرمافزار کمک به مدیریت پیچیدگی و پیشگیری از وابستگی (Tight Coupling) اجزای سیستم به یکدیگر است که باید در سامانههای نرمافزاری تا حد امکان از آن کاست. تعریف دیگری از انتزاع در علوم رایانه: در علم رایانه، راهکار و تمرین انتزاع، اطلاعات جزئی را کاهش دادن بهطوریکه شخص بتواند روی مفاهیم کمتری تمرکز کند. انتزاع – مفهوم یا ایدهای که وابسته به هیچ نمونهٔ خاصی نباشد.
زبان های سطح میانی:
علت میانی بودن زبان C این است که، از طرفی همانند زبان سطح پایینی مثل اسمبلی قادر است مستقیما به حافظه دستیابی داشته باشد و با مفاهیم بیت، بایت و آدرس کار کند و از طرف دیگر، برنامه های این زبان، همچون زبانهای سطح بالایی مثل پاسکال، از قابلیت خوانایی بالایی بر خوردارند. به عبارت دیگر، دستورالعملهای این زبان، به زبان محاوره ای انسان نزدیک است، که این ویژگی، مربوط به زبانهای سطح بالاست.
زبان های سطح بالا | زبانهای میانی | زبانهای سطح پایین |
پاسکال اِدا ماجولا_ ۲ کوبول بیسیک | جاوا فورث C،C++ | ماکرواسمبلر اسمبلر |
- زبان C، یک زبان ساخت یافته است. در این زبان با استفاده از حلقه های تکرار مثل while، for و do while می توان برنامه های نوشت که قابلیت خوانایی و درک آنها بالا باشد.
برنامهنویسی ساختیافته به انگلیسی: (Structured programming)
یک پارادایم برنامه نویسی است که طبق آن برنامهنویس قدمها و روالهایی را که لازم است تا برنامه به جواب برسد را مشخص میکند. در این روش از برنامهنویسی، انجام یک روال به روالهای کوچکتر تقسیم میشود و به این ترتیب یک برنامه با شکسته شدن به ریز برنامههای کوچکتر سعی میکند تا عملکرد مد نظر را پیادهسازی کند.
نکته: روش ساختیافته از آنجا که باعث می گردد برنامه به اجزای کوچکتری تقسیم گردد، نوشتن و اشکال یابی (Debugging) برنامه و توسعه آینده آن را ساده تر می سازد. همچنین خواندن و درک برنامه در روش ساختیافته ساده تر می باشد.
مثال
به عنوان مثال برای نوشتن برنامهای که قراراست اطلاعات نمرات یک محصل را بگیرد و کارنامه آن را چاپ کند، زیر روالهای زیر لازم است:
- زیر روالی ای برای خواندن اطلاعات ورودی
- زیر روالی ای برای جمعآوری اطلاعات ورودی و محاسبۀ معدل
- زیر روالی برای چاپ اطلاعات به صورت یک جدول
- زیر روالی برای اتصال به چاپگر و چاپ گزارش
هر زیر روال آنقدر کوچک میشود که برنامهنویس بتواند راحتتر کار کردن آن را درک کند (هر زیر روال معمولاً ۳۰ خط برنامهنویسی است). به این ترتیب برنامهنویس با نوشتن هر زیر روال بخشی از برنامه را تولید میکند و برنامهنویسان مختلف میتوانند بر روی زیر روالهای مختلف کار کنند تا در نهایت به اضافه نمودن آنها به یکدیگر برنامه نهایی ساخته شود.
زبانهای ساخت یافته | زبانهای غیرساخت یافته |
پاسکال اِدا C و C++ ماجولا_۲ جاوا | فرترن بیسیک کوبول |
- زبان C، قابل انعطاف و بسیار قدرتمند است. در این زبان، هیچ محدودیتی برای برنامه نویس وجود ندارد. هر آنچه را فکر می کنید، می توانید در این زبان پیاده سازی کنید.
- زبان C مشابه Pascal قابلیت Top down programming دارد یعنی تا متغیرها اعلان نشوند نمی توان از آنها استفاده کرد و برنامه را طوری نوشت که از پرش به بالا استفاده نشود. منطق برنامه از بالا به پائین می باشد و می توان هسته اصلی برنامه را در یک تابع اصلی نوشت و وظایف فرعی را به صورت صدا زدن توابعی در قسمت اصلی انجام داد.
- زبان C مشابه پاسکال قابلیت Modular programming دارند. بدین معنا که می توان برنامه را به قسمت های مجزا تقسیم کرد که اطلاعات هر قسمت از دید قسمت دیگر مخفی است. این قسمت باعث می شود نوشتن برنامه ها ساده تر و وضوح آنها بیشتر گردد. همچنین عیب یابی (debug) برنامه ها را ساده تر می سازد.
- C، زبان برنامه نویسی سیستم است. برنامه های سیستم، برنامه هایی هستند که امکان بهره برداری از سخت افزار و سایر نرم افزارها را فراهم می کنند. بعضی از برنامه های سیستم عبارتند از : سیستم عامل، مفسر، کامپایلر، ویراستارها، واژه پردازها، مدیریت بانکهای اطلاعاتی و اسمبلر.
- ارتباط تنگاتنگی بین زبان C و اسمبلی وجود دارد و به این ترتیب میتوان از تمام قابلیتهای اسمبلی در زبان C استفاده کرد.
- C، زبان قابل حمل است. معنای قابل حمل بودن این است که برنامه های که زبان C ، در یک نوع کامپیوتر( مثل آی.بی.ام) نوشته شدند، بدون تغییرات یا انجام تغییرات اندک، در کامپیوترهای دیگر(مثل VAX و DEC) قابل استفاده اند.
- C، زبان کوچکی است. تعداد کلمات کلیدی این زبان انگشت شمار است. تصور نشود که هر چه تعداد کلمات کلیدی زبان بیشتر باشد، آن زبان قدرتمند است. به عنوان مثال، زبان بیسیک در حدود ۱۵۰ کلمه کلیدی دارد ولی قدرت زبان C به مراتب بیشتر از زبان بیسیک است. توجه داشته باشید که بعضی از کامپیالرهای C، علاوه بر این ۳۲ کلمه کلیدی، کلمات دیگری را به زبان اضافه کرده اند.
- C نسبت به حروف حساس است. یعنی در این زبان، بین حروف کوچک و بزرگ تفاوت است و تمام کلمات کلیدی این زبان با حروف کوچک نوشته می شوند. به عنوان مثال، while یک کلمه کلیدی است ولی WHILE اینطور نیست. توصیه می شود که تمام برنامه های C با حروف کوچک نوشته شوند.
کلمات کلیدی زبان C |
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while |
کلمات کلیدی C که بعضی از کامپایلرها اضافه کردند. |
asm _cs _ds _es ss cdecl far huge interrupt near pascal |
- زبان C مشابه پاسکال به صورت کامپایلری می باشد ولی زبان بیسیک مفسری است. در زبان های مفسری هر خط ابتدا خوانده می شود و اگر خطای گرامری نداشته باشد تبدیل به زبان ماشین شده و سپس اجرا می گردد ولی در زبان های کامپایلری کل برنامه خوانده شده و تبدیل به کد ماشین شده و بعدا اجرا می گردد. به عبارتی دیگر در مفسر ترجمه و اجرا همزمان و خط به خط صورت می گیرد ولی در کامپایلر عمل ترجمه و اجرا مجزا از یکدیگر می باشند.
- به طور کلی در زبان ها ۳ نوع خطا وجود دارد: ۱- Compile time errors یا خطاهای syntax که خطاهای گرامری دستورات بوده و اگر برنامه ای خطای syntax داشته باشد،تبدیل به کد ماشین نمی شود. ۲- خطاهای زمان اجراء یا run-time errors، مثل حالتی که در زمان اجرا عددی تقسیم بر صفر شود. ۳- خطاهای منطقی (Logical error)، در این نوع خطاها در هنگام کامپایل و یا در هنگام اجراء پیامی صادر نمی شود ولی شما جوابی از برنامه می گیرید که انتظار ندارید. مثل وقتی که متغیر صحیح دو بایتی را به متغیر صحیح یک بایتی نسبت می دهید.
- دستورالعملهای برنامه C دارای ویژگی های زیر هستند:
- هر بلوک در C بین دو علامت { و } قرار گرفته و در حکم یک جمله می باشد.
- هر دستور زبان C به ; ختم می شود.
- حداکثر طول یک دستور، ۲۵۵ کاراکتر است.
- هر دستور می تواند در یک یا چند سطر ادامه داشته باشد.
- در هر سطر می توان چند دستور را تایپ کرد(این کار، توصیه نمی شود).
- توضیحات می توانند در بین */ و/* قرار گیرند و یا بعد از // ظاهر شوند.
۱ ۲ |
/* This is a sample comment*/ // This is another sample comment |