مشخصه های زبان C که باعث منحصر بفرد بودن آن می شود
1396/10/10 16:51 , شایان مسلمی

مشخصه های زبان C که باعث منحصر بفرد بودن آن می شود

همانطور که در بحث های قبل درباره ی زبان برنامه نویسی C خواندید، زبان C مادر تمامی زبان های مدرن برنامه نویسی محسوب می شود.تقریباً هر زبان مورد استفاده ی روزانه شامل چندین ویژگی است که ابتدا در C مشاهده شد.این زبان به طور گسترده به منظور نوشتن نرم افزار برای کوچکترین میکروکامپیوترهای یکپارچه تا بزرگترین سوپرکامپیوترها کاربرد داشته است.

برنامه هایی که در C نوشته می شوند طیف وسیعی را شامل میشوند، نرم افزار سیستمی،نرم افزار دسکتاپ،نرم افزار اداری،مراکز داده و غیره.اگر شما دانش زبان C را داشته باشید،میتوانید آغاز خوبی در حرفه ی برنامه نویسی داشته باشید.

تاریخچه ی کوتاهی از C

توسعه ی زبان C رابطه ی نزدیکی با Unix دارد.این زبان حدود سال 1972 توسعه یافت و اضافات آن در سال های بعد به آن اضافه شدند.

قبل از توسعه ی C،سیستم عامل یونیکس برای کامپیوتر PDP-7 که از زبان اسمبلی خودش استفاده میکرد،توسعه داده شده بود.بعداً روی این پلتفرم یک کامپایلر برای C ساخته شد،دوباره با استفاده از زبان اسمبلی.در این زمان،C به منظور تسهیل توسعه ی خود یونیکس طراحی شده بود.با استفاده از این کامپایلر،یونیکس برای کامپیوتر PDP-11 در زبان C کاملاً بازنویسی شد.و دوباره، کامپایلر زبان C در C بازنویسی شد.

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

هنگامی که زبان C توسعه یافت،تشخیص داده شد که میتوان با استفاده از این زبان چیزهای بسیار بیشتری نسبت به نرم افزارهای سیستمی نوشت.و بنابراین،C آغازگر نوشتن نرم افزارهایی مثل فایل سرورها،دیتابیس سرورها،network stack ها،نرم افزارهای دسکتاپ و (بعدها) وب سرورها بود.

در سال 1978،Brian Kernighan و Dennis Ritchie کتاب The C Programming Language را منتشر کردند.این کتاب به عنوان یک مرجع غیر رسمی از C Language Specification برای سال های زیادی شناخته میشد تا اینکه در سال 1989،C  توسط ANSI به صورت رسمی استانداردسازی شد.آخرین نسخه ی C، C11 می باشد و در سال 2011  عرضه شده است.

بیایید ببینیم چه ویژگی هایی باعث منحصربفرد شدن C شده است.

C در مقابل C++ : آیا به هم مربوط اند؟

هرچه نرم افزارهای پیچیده تری در C توسعه بیابند،مفاهیم شئ گرایی مثل پلی مورفیسم،بسته بندی و غیره کمک به ساماندهی این پیچیدگی میکند.این به سمت توسعه ی C++ پیش خواهد رفت.

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

یک برنامه ی C در تئوری میتواند با یک کامپایلر C++ بدون نیاز داشتن هیچ تغییری کامپایل شود.اگرچه عملاً برخی از کدها نتیجه ای جز خطا ندارند و باید تغییراتی در آن ها اعمال کرد.

تعداد کمی از کلیدواژه ها

زبان C در مقایسه با قدرتی که دارد،زبان کوچکی بوده است.این به این دلیل است که C تنها 32 کلمه به عنوان کلیدواژه با یک معنای خاص اعلام میکند.در مقابل،C++ 82 کلمه را اعلام میکند،جاوا 50 و جاوااسکریپت 63 کلمه.COBOL به طور خیره کننده ای 357 کلمه را به عنوان کلیدواژه اعلام میکند.

String Type غیر واضح

برخلاف بیشتر زبان های مدرن مثل Java,C++ و جاوااسکریپت،C نوع جداگانه ای برای string ها فراهم نمیکند.یک استرینگ به عنوان یک آرایه از کاراکترهایی که به 0 کاراکتر محدود شده اند،در نظر گرفته میشوند.طول یک استرینگ به صورت قراردادی مشخص می شود:تعداد کاراکترهای تا 0 character . شما برای رد کردن آن و شمارش یا ذخیره بعد از “\0” آزاد هستید. این مشکل در نوع استرینگ بانی بوجود آمودن باگ های زیادی در طول این سال ها شده است و به نام buffer overflow شناخته میشود.

در حقیقت،اولین کِرمی که در اینترنت یافت شد، Morris Internet Worm بود،این کرم نتیجه ی وجود باگی اینچنینی در قسمت مهمی از نرم افزار سیستم به نام finger daemon بود.

در اینجا مثالی از باگ اینچنینی آورده شده است،این مثال نشان میدهد که معرفی باگ های مثل این به یک نرم افزار چقدر آسان است.برنامه به خوبی کامپایل میشود،اما به دلیل وجود داشتن buffer overflow گاهی کرش میدهد.

# include <stdio.h>

 

main()

{

  char *buf = "hello world";

  buf[12] = 'a';

  printf("%s\n", buf);

}

در مقابل،بیشتر زبان های برنامه نویسی مدرن یک string type واضحی دارند که ایجاد چنین شیطنت هایی را غیر ممکن میسازد.حتی C++،که کدبالا را به خوبی کامپایل میکند،یک نوع std::string واضح و روشن دارد.

Pointer Manipulation

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

باگ امنیتی مفتضح SSL Heartbleed که در سال 2014 کشف شد نتیجه ی مدیریت نادرست موقعیت های پوینتر بود و اهمیت حیاتی مدیریت صحیح پوینتر در C را یادآور شد.

حتی خطاهای BSOD  )صفحه ی آبی مرگ) که در سیستم های ویندوزی وجود دارد احتمالاً ناشی از اداره ی نادرست pointer میباشد.

زبان های بغیر از C++ اجازه ی دستکاری پوینتر را نمیدهند و بنابراین به این سبک باگ ها آسیب پذیری ندارند.

آرایه ها و پوینترها تبادل پذیر هستند

در C،منابع آرایه ها و پوینترها قابل تعویض هستند.این زبان استفاده از یک منبع آرایه را در جایی که یک پوینتر مورد نیاز است مجاز میداند و برعکس.در حالی که این دستکاری قدرتمندی را می طلبد،اما باگ های بزرگی را نیز بوجود می آورد.

استفاده ی  وسیع  از ماکروهای “define”

ماکروها برای تعویض یک نام برای یک توسعه ی متفاوت مورد استفاده قرار میگیرند.آن ها ممکن است برای تغییر تعریف یک نام در زمان کامپایل به کار بروند،یا برای تعویض یک توسعه ی طولانی تر برای یک نام ساده.سیستم ماکرو C شرایط ifdef را پشتیبانی میکند که باعث کامپایل شرطی میشود.این یک نرم افزار یک طرفه است که به معماری ها و سیستم های عامل مختلف پورت میشود.نام های کلی  به همراه توسعه های مختلف برای شرایط مختلف ،در زمان کامپایل تعریف و تعویض میشوند.

با استفاده از این ماکروها میتوان تمامی سکشن های کد در حال کامپایل را در بر گرفت یا حذف کرد.

این ماکروها نهی شده هستند اما در C++ در دسترسند.سایر زبان ها مثل جاوا،جاوااسکریپت،پایتون و غیره چنین امکانی ندارند.

ماژول های بسته بندی شده در فایل ها

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

در مقابل، سایر زبان ها مانند C++،جاوا و پایتون به طور کلی از کلاس ها پشتیبانی میکنند و بسته بندی یا encapsulation تنها با کلاس ها پیش میرود.

لایبرری های خارجی

جدا از سازه های ابتدایی زبان،بیشتر قابلیت های پیچیده تر در C به لایبرری های خارجی سپرده شده اند.دستکاری استرینگ،ریاضیات،ورودی-خروجی،شبکه و غیره تماماً توسط لایبری های خارجی فراهم شده اند.در مقابل،سایر زبان ها معمولاً یک لایبرری کامل از ماژول ها با خود زبان را در اختیار دارند.

این مقاله برخی از مشخصه های زبان C را نشان داد،مخصوصاً مشخصه هایی که جدا از سایر زبان ها هستند.

آیا شما با زبان C کار کرده اید؟به آن علاقه داشتید یا ترجیح دادید با زبان دیگری کار کنید؟ لطفاً توضیحاتتان را با ما به اشتراک بگذارید.

 منبع : MakeUseOf

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات