Nikelec.ir آموزش الکترونیک و کامپیوتر

General - سپتامبر 5, 2020

C++ Vs C

سیب یا سیبری !

مقایسه ای که میخوایم انجام بدیم از مواردی هست که می تونه بحث های بی مورد زیاد داشته باشه چون مثل اینه که سیب و سیبری رو باهم مقایسه کنیم درسته که سیبری بوی سیب داره ولی طعم و مزه گلابی داره ! درسته که سیبری رو بیشتر میپسندند ولی چون کمیاب تره باید بیشتر هم براش هزینه کنید .

حتی اگر از منظرهای دیگه بهش نگاه کنیم بهتره تفاوت های بین توت و توت فرنگی مثال بزنیم یکیشون میوه درختی هست یکیشون میوه بوته ای .توت فرنگی مثل توت عقبه نداره و در واقع بعد از یکم تغییرات روی جنگلیش چیزی که امروزه میبینیم در دسترس قرار گرفته .

خب از بحث میوه ها که یکم فاصله بگیریم میرسیم به C , Cpp البته که بهتره زیاد دور نشیم از بحث میوه ها چون اینجا هم مثل همون هست از منظری میشه نگاه کرد که Cpp یک زبان سطح بالا و OOP محسوب میشه اما C یک زبان procedural محسوب میشه ( البته که میشه تو Cpp هم procedural  رفتار کرد ) .اما موارد مهمتری هست که باعث میشه بخوایم این دورو باهم مقایسه کنیم .مثلا اینکه با توجه به افزایش منابع میکروکنترلرها گرایش استفاده از Cpp هم برای میکروکنترلرها یکم داره بیشتر میشه چون دوست داریم از ویژگی هایی که یک زبان OOP بما میده استفاده کنیم . ولی … اینجا ولی داره که باید در نظر بگیریم و قصد ما هم تو این مطلب بررسی همین ولی ها هست . ( تو این مطلب تا میشه قرار نیست ویژگی هایی که OOP بما میده مثل polymorphism, encapsulation, inheritance بررسی کنیم به بعضی هاشون نگاهی می ندازیم ولی هدفمون آموزش این ویژگی ها نیست تو این مطلب )

این مورد برای بازی نویس ها هم مطرح هست که C یا CPP که بنچ مارک هایی هم برای بازی نویس ها و هم برای میکروکنترلرها هست اما بنچ مارک همیشه نقدهایی بهش وارد هست مثلا چه سخت افزاری استفاده شده ،چطور کد زده شده و … ( اونم برا خودش عالمی داره ) که واردش نمیشیم واضحات بیان می کنیم تا از بحث های افراطی دور باشیم .

از الان بهتره بدونید از اون دست سوالات که آخرش به وضعیتی که داخلش هستید برمیگرده اما من یک بررسی می کنم اینجا براتون و یک نتیجه هم میگیریم .

  1. این مورد به عنوان مرگ زبان هم C هم در موردش بحث میکنند از زمان های بسیار قدیم ( که زبان CPP ارائه شد ) .
  2. بعضی از میکروها زبان C++ براشون قابل استفاده نیست دلایلش هم :
    1. کمبود فضای رمش برای کارهای داینامیکی که انجام میده مناسب نیست .
    2. براش کامپایلر C++ وجود نداره .
  3. این خیلی مهمه که بدونید کجا هستید و کجا قراره کار کنید ما پیشفرض میذاریم خروجی دانشگاه های کشورمون ، خب تو اکثر موارد دانشجوهای الکترونیکی که اکثریت کار با میکروکنترلرها رو انجام میدند نه زبان C++ آموزش می بینند نه میرند دنبالش ، پس شما در جامعه مهندسین الکترونیک قراره به زبون سطح بالا صحبت کنید که خیلی ها باهاش آشنا نیستند پس این براتون یجوری تنهایی پیش میاره ! ( نکته زبان سطح بالا نه یعنی زبان بهتر برای اینکار این زبان داخل دسته زبان های سطح بالا قرار میگیره )
  4. بعضی از ویژگی هایی که داخل زبان سطح بالا داریم مثل “رسیدگی به استثنائات” علاوه بر اینکه میتونه مزیت باشه نیاز به استفاده از منابع بیشتری هم دارند .
    1. برای درک بهتر بذارید براتون مثالی بزنم : ما ارث بری تو زبان های سطح بالا داریم علاوه بر اون تو بعضیاشون مثل همین C++ قابلیت ارث بری چندتایی هم داریم ، اگر فرض کنیم شما از این گزینه استفاده کنید در این صورت وقتی از “this” استفاده می کنید در اکثر موارد موجب افزایش زمان اجرا و فضای مورد نیاز برای برنامه میشه ( با توجه به اینکه نیاز به ایجاد جدول هایی برای اینکه this ما به تابع مورد نظر روی شی ء درست ارجاع داده بشه هست )( که برای اینکار دو روش وجود داره که هر دوش می تونه زمان و فضا رو اضافه کنه به برنامه ما )
  5. رسیدگی به Thread ها و سینک کردن ورودی خروجی ها می تونه نیاز به کلی منابع داشته باشه .
  6. ما تو اکثر موارد موقع استفاده از زبان سطح بالا مثل همین C++ برای میکروکنترلرها میایم خیلی از مواردی که بالا گفتیم رو حذف می کنیم !
  7. حذف کردن بعضی از ویژگی ها از یک زبان باعث میشه شما از حالت پیشفرض اون برنامه نویسی خارج بشی و مادامی که داری با زبانی که بعضی از قسمت هاش غیرفعال شده برنامه می نویسی فکرت باید مواظب باشه که خب این قسمت غیر فعال شده الان و باید به سبک دیگه ای پیادش کنم یا حواسم باشه که این قابلیت اینجا نداریم .
  8. مورد بسیار مهمی که داخل برنامه نویسی تو این زبان می تونه پیش بیاد نشت حافظه هست که بسیار باید مواظب این مورد باشید ( البته این مورد تو C هم ممکنه پیش بیاد ولی اینجا بدلیل ویژگی هایی که وجود داره احتمالش بسیار بیشتر هست )
  9. نکته مهم بعدی کد اسمبلی هست که توسط کامپایلر تولید میشه این شما هستید که با داشتن اطلاعات کافی در مورد برنامه نویسی اسمبلی می تونید دو مثال پیاده کنید و با بهترین کامپایلری که هست کد کامپایل کنید و نتیجشون رو باهم مقایسه کنید شاید امروز که من دارم این پست می نویسم هنوز این دوتا باهم تفاوت داشته باشند و یک ساعت دیگه این روند با ارائه ابزارهای جدید برعکس بشه .
  10. برای جمع بندی پایانی تمام مواردی که بالا گفته شد به عنوان مزیت هایی از CPP هم هستند !( من میتونستم به سبک دیگه ای این متن بنویسم و شما برداشت برعکس این داشته باشید ) پس نمیشه گفت اینا معایب هستند این چیزی هست که بهش میگیم Trade Off یعنی بعضی چیزارو میدیم و بعضی چیزای دیگه رو بدست میاریم مثلا هزینه می کنیم و راحتی بدست میاریم ! پس در آخر این شما هستی که بسته به شرایطی که درش قرار داری و منابع و اطلاعاتی که داری تصمیم میگیری چه موردی انتخاب کنی . ( تو اکثر موارد هم این چیزا فقط زمانت از بین میبره و بهتره که پروژه رو پیش ببری بجای اینکه مثلا کلی زمان بذاری تا تصمیم بگیری کدوم زبان انتخاب کنی )

در ادامه تفاوت بین سه پیکره بندی برای زبان های برنامه نویسی براتون آماده کردم که مقایسه حافظه مصرف شده بین C و CPP extended , CPP هست :

-محیط توسعه استفاده شده : IAR
-Optimizations Level = Low
-نتیجه برنامه C
-محیط توسعه استفاده شده : IAR
-Optimizations Level = Low
-نتیجه برنامه Cpp
Options = Exceptions Enable / RTTI Enable
-محیط توسعه استفاده شده : IAR
-Optimizations Level = Low
-نتیجه برنامه Cpp
Options = Exceptions Disable / RTTI Disable

در آخر این شما هستید که با منابع و موقعیتی که درش قرار دارید تصمیم میگیرد از چه زبانی با چه ویژگی هایی استفاده کنید . (در نظر داشته باشید با توجه به نتیجه آماده شده بالا مشاهده می کنید که ++Embedded C بسیار خروجی نزدیکی به C دارد )