برگزیده های پرشین تولز

آموزش برنامه نویسی به زبان c

Moein TN

Registered User
تاریخ عضویت
26 اکتبر 2017
نوشته‌ها
340
لایک‌ها
52
سن
25
آموزش برنامه نویسی به زبان c


ویژگی هایی که زبان برنامه نویسی C را منحصر بفرد می سازد



cprogrammingokok.jpg



برنامه نویسی به زبان c را می توان مادر تمام زبان های برنامه نویسی مدرن به شمار آورد. تقریبا تمام زبان های برنامه نویسی که امروزه مورد استفاده قرار می گیرند، حداقل چند ویژگی از این زبان را به ارث برده اند.
زبانC به صورت گسترده برای توسعه نرم افزارهای کوچکترین میکروکامپیوترها تا بزرگترین کارخانه ها و ابر کامپیوترها به کار گرفته شده است.
اپلیکیشن های نوشته شده به زبان C شامل نرم افزارهای سیستمی، دسکتاپ، شرکتی، دیتابیس و غیره می باشد. در ادامه مقاله اصول این زبان شرح داده شده که می تواند در شروع موفقیت آمیز یک دوره برنامه نویسی تاثیر زیادی داشته باشد.

تاریخچه زبان C


توسعه برنامه نویسی به زبان c ارتباط نزدیکی با یونیکس داشته است. این زبان در سال 1972 توسعه داده شده اما بسیاری از ویژگی ها در سال های بعد به آن اضافه شده است.
پیش از توسعه زبان C، سیستم عامل یونیکس با استفاده از زبان اسمبلی برای کامپیوتر PDP-7 توسعه داده شده بود. بعدها بر اساس این پلتفرم و با استفاده از زبان اسمبلی کامپایلری برای C طراحی شد. دراین زمان زبان C برای تسهیل توسعه خود یونیکس طراحی شده بود. با استفاده از این کامپایلر، یونیکس برای کامپیوترPDP-7 در زبان C به صورت کامل بازنویسی شد. علاوه براین، کامپایلر زبان C نیز در زبان C و با استفاده از ابزارهای فوق العادهlex و yacc مجددا بازنویسی شد و از این طریق فرایند بوت‌استرپ (چارچوب انتهایی) C و یونیکس کامل شد.
دلیل اصلی بازنویسی یونیکس به زبان C ایجاد قابلیت جابجایی بود. از آنجایی که زبان های اسمبلی نسبت به معماری های مختلف CPU متفاوت هستند، پورت کردن سیستم عامل یونیکس برای هر یک از آنها نیازمند تلاش فراوانی بود. با توسعه یک زبان برنامه نویسی مثل C و بازنویسی سیستم عامل یونیکس به زبان C فرایند پورت کردن تا حد زیادی تسهیل می شد.
پس از توسعه این زبان، برنامه نویسان پی بردند که علاوه برنوشتن نرم افزارهای سیستمی، در موارد دیگری نیز می توان از آن استفاده کرد. بنابرین این افراد از زبان C برای نوشتن نرم افزارهایی از قبیل سرور فایل، سرورهای دیتابیس، پشته های شبکه، نزم افزار دسکتاپ و بعدا برای توسعه سرورهای وب و غیره استفاده کردند. در سال 1978 برایان کرنیگن و دنیس ریچی کتاب زبان برنامه نویسی C را منتشر کردند که تا سال 1989 و استاندارد سازی این زبان توسط ANSI به عنوان یک راهنمای غیر رسمی مورد استفاده قرار می گرفت.
گفتنی است آخرین نسخه منتشر شده از این زبان C11 نام دارد و در سال 2011 منتشر شده است.

آیا C و C++ با هم ارتباطی دارند؟



c++logo.jpg



با افزایش پیچیدگی برنامه هایی که در C نوشته می شدند، مفاهیم شی گرایی از قبیل کپسوله سازی و چند ریختی برای مدیریت این پیچیدگی ها مورد استفاده قرار گرفتند که در نهایت به توسعه زبان C++ منجر شد.
C++ با اضافه کردن چند ویژگی خاص به زبان C به منظور توسعه نرم افزارهای شی گرا توسعه پیدا کرد. ایده اصلی توسعه این زبان ایجاد تغییرات تدریجی در زبان C بود به گونه ای که بتوان C و ماژول C++ را در یک برنامه و از طریق یک کامپایلر باهم ترکیب کرد. این مساله امکان استفاده مجدد از ماژول های قدیمی C را در برنامه های بزرگ نوشته شده با استفاده از مفاهیم شی گرایی فراهم می کرد.
از نظر تئوری می توان یک برنامه C را بدون هیچ تغییری در کامپایلر C++ کامپایل کرد. با این حال در عمل بررسی سختگیرانه تر کدها در کامپایلر C++ خطاهایی را شناسایی می کنند که پیش از کامپایل باید اصلاح شوند.
زبان C نسبت به قدرتی که دارد بسیار ساده است. این زبان تنها 32 کلمه کلیدی با معنای خاص دارد در حالی که C++ 82 کلمه کلیدی، جاوا 50 کلمه کلیدی، جاوا اسکریپت 63 کلمه کلیدی و COBOL 357 کلمه کلیدی دارد. تصویر کنید به خاظر سپردن صدها کلمه کلیدی و کاربردهای آنها تا چه می تواند دشوار باشد. زبان C برخلاف بسیاری از زبان های مدرن، هیچ رشته خاصی ندارد. در این زبان رشت ها به عنوان آرایه ای از کاراکتها در نظر گرفته می شود که با کاراکتر 0 ( با “\0” نشان داده می شود) پایان می یابد.
طول این رشته از طریق یک قرار داد مشخص می شود: تعداد کارکترها تا کاراکتر 0. با این حال میتوانید این قرارداد را نادیده گرفته و کاراکترهای قبل از “\0” را شمارش کرده یا ذخیره کنید.
گفتنی است عدم وجود نوع خاصی از کاراکتر یا قرارداد مذکور در سال های گذشته به باگ های فراوانی از قبیل سرریز بافر منجر شده است.
برای مثال اولین کرمی که به اینترنت راه پیدا کرد موریس نام داشت، و در نتیجه وقوع همین باگ در بخش مهمی از نرم افزار سیستم به نام فینگر دایمون ایجاد شده بود. در مثال زیر احتمال بالای وقوع این باگ در یک برنامه نشان داده شده است. این برنامه کامپایل می شود اما خطای سرریز بافر در آن رخ می دهد:# include
main()
}
;"char *buf = "hello world
;'buf[12] = 'a
;(printf("%s\n", buf
{


برخلاف برنامه نویسی به زبان c در بیشتر زبان های مدرن نوع رشته باید دقیقا مشخص شود . حتی در C++ هم پیش از کامپایل کد بالا باید با افزودن کد std::stringtype نوع رشته را مشخص کرد.
اشاره گر مرجعی به یک مکان در حافظه است. C از نظر خواندن و نوشتن مکان های حافظه انعطاف پذیری بالایی دارد. با این حالا این انعطاف پذیری هزینه زیادی به دنبال داشته و منشا باگ های بسیاری بوده است.
مهم ترین و تاثیرگذارترین باگ های ناشی از این انطعاف پذیری که اینترنت را تحت تاثیر قرار می دهند در سرورهای وب، ایمیل و FTP رخ می دهند. حتی امروزه نیز شاهد وقوع باگهایی در زمینه درج و بروزرسانی مکان های نامعتبر در حافظه هستیم.

pointers-584x500.png



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

آرایه ها و اشاره گرها را می توان به جای هم مورد استفاده قرار داد


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

کاربردهای گسترده تعریف کردن ماکروها


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

ماژول های کپسوله شده در فایل ها


C مفهومی به نام کلاس ندارد و به همین خاطر از آشکاری محافظت شده، عمومی و خصوصی پشتیبانی نمی کند. تنها کپسوله سازی ممکن در C، به فایل ها برمی گردد. توابع، متغیرهای جهانی و انواع متغیرهایی که در یک فایل منبع نوشته می شوند در آن فایل نمایان هستند مگر اینکه نام های آنها صادر شده باشد.
کلمات کلیدی static و extern به منظور کنترل نمایانی اسامی توابع و متغیرها ارائه شده اند.
از طرف دیگر زبان هایی از قبیل C++، جاوا و پایتون از کلاس ها و کپسوله سازی مربوط به آنها پشتیبانی می کنند.

کتابخانه های خارجی


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

منابع:
118فایل
sematec-co
faradars
 
بالا