سی پلاس پلاس C++ چیست؟
C++ یه زبان برنامه نویسی سطح بالا و چند منظوره هست که توسط دانشمند کامپیوتر دانمارکی بیارنه استروستروپ ساخته شده. این زبان برای اولین بار توی سال 1985 به عنوان یه افزونه برای زبان C منتشر شد و از اون زمان به طور قابل توجهی گسترش پیدا کرده. از سال 1997، C++ شامل ویژگی های شی گرایی، برنامه نویسی جنریک و فانکشنال شده، علاوه بر قابلیت هایی برای مدیریت حافظه سطح پایین که برای سیستم هایی مثل میکروکامپیوترها یا ساخت سیستم عامل هایی مثل لینوکس و ویندوز استفاده میشه.این زبان معمولا به عنوان یک زبان کامپایلشده پیاده سازی میشه و بسیاری از شرکت ها کامپایلرهای C++ ارائه میدن، از جمله Free Software Foundation، LLVM، مایکروسافت، اینتل، Embarcadero، اوراکل و IBM.C++ با هدف برنامه نویسی سیستمی و نرم افزارهای تعبیه شده در محیط های با منابع محدود و همچنین سیستم های بزرگ طراحی شده و عملکرد، کارایی و انعطاف پذیری جزو نکات کلیدی طراحی اون هستن.علاوه بر این، C++ توی خیلی از حوزه های دیگه هم مفید واقع شده، از جمله زیرساخت های نرم افزاری و اپلیکیشن های دارای محدودیت منابع. این شامل برنامه های دسکتاپ، بازی های ویدیویی، سرورها (مثل تجارت الکترونیک، موتورهای جستجو یا پایگاه های داده) و برنامه های حساس به عملکرد بالا (مثل سوییچ های تلفنی یا کاوشگرهای فضایی) میشه.
تاریخچه سی پلاس پلاس C++
در سال 1979، بیارنه استروستروپ، دانشمند کامپیوتر دانمارکی، کار روی "C with Classes" رو شروع کرد، که پیشرو زبان C++ محسوب میشه. انگیزه ایجاد این زبان جدید از تجربهی استروستروپ در برنامه نویسی برای پایاننامهی دکترای خودش نشأت گرفت.او متوجه شد که زبانSimula ویژگیهایی داره که برای توسعه نرمافزارهای بزرگ خیلی مفیده، اما به خاطر کند بودنش برای استفادهی عملی مناسب نیست. در مقابل، BCPL خیلی سریع بود اما سطح خیلی پایینی داشت و برای توسعهی نرمافزارهای بزرگ مناسب نبود.وقتی استروستروپ توی آزمایشگاههای AT&T Bell مشغول به کار شد، با مشکل تحلیل کرنل UNIX در زمینهی پردازش توزیعشده مواجه شد. با یادآوری تجربهی دکتراش، تصمیم گرفت زبان C رو با ویژگیهای شبیه به Simula گسترش بده. زبان C انتخاب شد چون چندمنظوره، سریع، قابل حمل و بهطور گسترده مورد استفاده بود. علاوه بر تأثیر C و Simula، زبانهای دیگهای هم روی طراحی این زبان جدید تأثیر گذاشتن، از جمله ALGOL 68، Ada، CLU و ML.
زبان C++
زبان C++ شامل دو بخش اصلیه : یک نگاشت مستقیم از ویژگیهای سختافزاری که عمدتاً توسط زیرمجموعه C ارائه میشه، و انتزاعهای بدون هزینهی اضافی که بر اساس همین نگاشتها ساخته شدن.بیارنه استروستروپ، C++ رو به عنوان "یک زبان برنامهنویسی سبک برای ساخت و استفاده از انتزاعهای کارآمد و زیبا" توصیف میکنه. اون همچنین میگه "ترکیب دسترسی مستقیم به سختافزار و انتزاع، پایهی اصلی C++ هست. انجام این کار به شکلی کارآمد، چیزی هست که این زبان رو از بقیهی زبانها متمایز میکنه."C++ بیشتر سینتکس خودش رو از زبان C به ارث برده. به همین دلیل، برنامهHello World که با استاندارد C مطابقت داشته باشه، در C++ هم معتبر هست.
ذخیرهسازی اشیا (Object Storage) در C++
C++مثل زبان C از چهار نوع مدیریت حافظه پشتیبانی میکنه:
- اشیای با مدت ذخیرهسازی استاتیک (Static Storage Duration Objects)
این اشیا در طول اجرای برنامه وجود دارن و فقط یکبار مقداردهی اولیه میشن.
- اشیای با مدت ذخیرهسازی وابسته به ترد (Thread Storage Duration Objects)
این اشیا به یک ترد خاص مرتبط هستن و در طول عمر اون ترد وجود دارن.
- اشیای با مدت ذخیرهسازی خودکار (Automatic Storage Duration Objects)
این اشیا درون یک بلاک تعریف میشن و وقتی اجرای بلاک به پایان برسه، از بین میرن.
- اشیای با مدت ذخیرهسازی پویا (Dynamic Storage Duration Objects)
این اشیا بهصورت دینامیک در Heap تخصیص داده میشن و تا زمانی که بهصورت دستی آزاد نشن، باقی میمونن.
تمپلیت ها (Templates) C++
تمپلیت های C++ امکان برنامه نویسی جنریک رو فراهم میکنن. C++ از تمپلیت های تابع، کلاس، نام مستعار (Alias)، و متغیر پشتیبانی میکنه. تمپلیت ها میتونن بر اساس نوع ها، مقادیر ثابت در زمان کامپایل و حتی تمپلیت های دیگه پارامتری سازی بشن.تمپلیت ها در زمان کامپایل نمونه سازی (Instantiation) میشن. برای نمونه سازی یک تمپلیت، کامپایلر آرگومان های مشخصی رو جایگزین پارامترهای تمپلیت میکنه تا یک نسخه خاص از تابع یا کلاس ایجاد بشه. با این حال، برخی جایگزینی ها ممکنه ممکن نباشن و در این موارد، مکانیزم "Substitution Failure Is Not An Error" (SFINAE) باعث میشه این جایگزینی های نامعتبر، خطا محسوب نشن بلکه حذف بشن.تمپلیت ها یک ابزار قدرتمند برای برنامه نویسی جنریک، متاپروگرامینگ با تمپلیت و بهینه سازی کد هستن، اما این قدرت هزینه هایی هم داره. استفاده از تمپلیت ها میتونه باعث افزایش اندازه کد شیء (Object Code) بشه، چون هر بار که یک تمپلیت نمونه سازی میشه، یک نسخه جدا از کد اون تولید میشه، برای هر مجموعه از آرگومان های تمپلیت.با این حال، مقدار کدی که تولید میشه معمولا به همون اندازه یا حتی کمتر از کدی هست که اگر به صورت دستی نوشته میشد، تولید میشد.این روش با جنریک های زمان اجرا (Run-time Generics) که در زبان هایی مثل Java دیده میشه متفاوته. در این زبان ها، نوع در زمان کامپایل حذف میشه (Type Erasure) و فقط یک بدنه عمومی از تمپلیت حفظ میشه، که در زمان اجرا با انواع مختلف مدیریت میشه.
اشیا (Objects) در C++
C++ ویژگی های برنامه نویسی شی گرا (OOP) رو به زبان C اضافه میکنه. این زبان از کلاس ها پشتیبانی میکنه که چهار ویژگی اصلی OOP (و برخی ویژگی های فراتر از OOP) رو ارائه میدن : انتزاع (Abstraction)، کپسوله سازی (Encapsulation)، وراثت (Inheritance) و چندریختی (Polymorphism) .یکی از ویژگی های متمایز کلاس های C++ نسبت به کلاس های سایر زبان های برنامه نویسی، پشتیبانی از سازنده های مخرب مشخص (Deterministic Destructors) هست که به نوبه خودشون از مفهوم "تخصیص منابع همزمان با مقداردهی اولیه " (RAII - Resource Acquisition is Initialization) پشتیبانی میکنن.