PDA

View Full Version : مقاله: چرا C++‎ جایگزین c نشد؟



csvbcscp
پنج شنبه 22 اسفند 1392, 06:20 صبح
تا حالا فکر کردید که چرا C++‎‎ جایگزین c نشد؟
از نظر من، دلیل ناموفق بودن ++C برای پشت سر گذاشتنِ C اینه که این زبان سعی کرد همه ی قابلیت ها رو در خودش جای بده و همین نگرش در طراحی زبان باعث شد خیلی از برنامه نویس ها به همون C قانع بشن.

هیچ دقت کردید که #C به چه سرعتی تونست کاری کنه که همه VB رو یادشون بره؟
به خاطر دارید PHP چه بلایی سر ASP آورد؟
یا Python با Perl چی کار کرد؟
اما تا به حال از خودتون پرسیدید که چرا ++C نتونست بعد از این همه مدت جای C رو بگیره؟

خوب به صورت ساده این سوال می‌تونه دو تا جواب داشته باشه:


C به اندازه ی کافی خوب هست.
++C به اندازه ی کافی خوب نیست.


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

C بر خلاف هدفی که در ابتدا داشت، تونست راه خودش رو به برنامه های مدرن و سطح بالا هم باز کنه. نمونش می‌تونه پلتفرم Gnome باشه. عده ی زیادی هستن که ممکنه فکر کنن C همون محیط آبی رنگ Turbo C هستش که توی دانشگاه یاد میگیرن و باهاش برنامه های داس رو مینویسن. برای این افراد، من توصیه میکنم که نگاهی به پلتفرم Gnome بندازن. عده ای هم فکر میکنن C یه زبان قدیمیه. برای این افراد هم باید عرض کنم که آخرین استاندارد این زبان به سال 1999 برمیگرده (C99) یعنی بعد از ابداع شدن جاوا یا پایتون. و در حال حاظر، یعنی سال ۲۰۱۰ میلادی، پراستفاده ترین کامپایلر C موسوم به GCC هنوز هم که هنوزه تمام قابلیت های استاندارد C99 رو به صورت کامل پیاده سازی نکرده. موقع نوشتن این مطلب، کم کم تدارکات مربوط به صدور استاندارد بعدی C در حال انجامه.

عده ایی هم هستن که فکر میکنن زبان های غیر شی گرا برای تولید برنامه های بزرگ یا به اصطلاح تجاری مناسب نیستن. برای این عده هم باید بگم که C مثل BASIC نیست. C یک زبان قدرتمندِ رویه گراست که کدها میتونن در توابع و یا ساختار های مختلفی مثل enum ها یا Structure ها طبقه بندی بشن. در ضمن، C مکانیزم های خاصی برای سورس کدها ارائه میکنه که از نمونه ی اون ها می تونم به «هدر فایل» ها و یا عناطر Static در فایل ها اشاره کنم. همچنین پروژه هایی مثل OpenGL یا Linux یا Gnome می‌تونن نمونه ی زنده ایی برای رد کردن این نظریه باشن که یه زبان غیر شی گرا مثل C به درد برنامه های بزرگ و تجاری نمی خوره

البته این نکته هم نباید فراموش بشه که به دلیل شباهت منطق شی گرایی با منطق زندگیِ واقعیِ انسانها، پیاده سازی سیستم های بزرگ در این زبان ها مسلما ساده تر و گاهی هم تمیزتر صورت میگیره.

++C به اندازه ی کافی خوب نیست.
وقتی زبانی مثل C وجود داره، که سریعه، قابل حمله، نزدیک به سخت افزاره، و قابلیت نوشتن برنامه های بزرگ و حساس رو داره، چرا باید زبان دیگه ایی مبتنی بر این زبان ابداع بشه؟ این سوال در حال حاظر مسخره به نظر میرسه چون واقعا نمیشه یه جواب منطقی براش پیدا کرد. اما در دهه ۸۰ و مخصوصا دهه ی ۹۰، موج عظیمی از منطق برنامه نویسی شکل گرفت که در حال حاظر به اون برنامه نویسی «شی گرا» میگیم. ++C به وجود اومد تا امکانات شی گرایی رو به C اضافه کنه و قابلیت های سطح بالاتری رو در این زبان قرار بده تا به این ترتیب ساخت برنامه های سطح بالاتر راحت تر بشه.

مدل طراحی ++C دو اشکال داشت.


اشکال اول توسط برنامه نویس های سطح پایین گرفته میشد: چرا ++C به اندازه ی C بهینه و سطح پایین نیست؟
اشکال دوم رو برنامه نویس های سطح بالا به ++C میگیرن: چرا ++C به عنوان یه زبان شی گرا باید اینقدر سخت و سطح پایین باشه؟

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

اما ++C دوست داشت که کامل باشه. کم کم قابلیت های بیشتری به این زبان اضافه شد و همین باعث شد ++C به یک زبان بسیار بزرگ تبدیل بشه. بزرگ بودن چند اشکال ایجاد میکنه:


مدت طولانی برای یادگیری
مدت طولانی برای تسلط بر زبان
مدت زمان بیشتر برای کامپایل برنامه
کند تر شدن برنامه
سخت شدن پیاده سازی کامپایلر برای زبان
سخت تر شدن انتقال زبان به سیستم های مختلف
و غیره…

اگه C نبود، ++C می تونست خیلی موفق تر بشه. اما C وجود داره و همه ++C رو با این زبان مقایسه میکنن. بدتر از اون اینه که اکثر اوقات برنامه نویس های ++C برنامه ی C مینویسن! یعنی همون رفتاری که از C انتظار دارن رو از ++C هم انتظار دارن. مثلا شنیدید که میگن هر قابلیتی که شما در C دارید در ++C هم هست؟ این حرف کاملا درسته اما اگه قرار باشه هر کاری رو که در C انجام میدیم، در ++C هم به همون روش انجام بدیم دیگه برای چی این زبان ابداع شده؟
بله، ++C مثل C اشاره گر داره ولی قراره که شما از new استفاده کنی.
++C هم می تونه برای رشته ها از آرایه های کاراکتری استفاده کنه اما قراره که شما از نوع string بهره ببری.
اگه قرار نیست به این شکل برنامه نویسی کنید برای چی ++C رو انتخاب میکنید؟

این قضیه در مورد قابلیت های مختلف ++C هم صدق میکنه. مثلا همه میدونیم که ++C یکی از سه زبان اصلی مورد استفاده در گوگل هستش. این درسته، اما فکر میکنید گوگل به چه صورتی از ++C استفاده میکنه؟ این ها مواردی از استایل کدنویسی ++C در گوگل هستن:


از متغیر های static در کلاس استفاده نکنید
سازنده های «کپی کردن» و «نسبت دادن» رو برای کلاس غیر فعال کنید
سعی کنید از« وراثت چندگانه» استفاده نکنید
از «سربارگذاری عملگر» خودداری کنید
از «سربارگذاری توابع» کمتر استفاده کنید
از «آرگومان های پیشفرض» استفاده نکنید
تحت هیچ شرایطی از «استثنا ها» استفاده نکنید
از RTTI استفاده نکنید
از stream ها استفاده نکنید مگر برای logging کردن
و غیره…


حالا اینجا این سوال پیش میاد که پس قراره از چه چیزیه این زبان استفاد بشه؟ حتی Mozilla پا رو فراتر گذاشته و گفته به طور کل از STL استفاده نکنید! یعنی حتی از <iostream> و cin و cout هم استفاده نکنید.

در اکثر مواقع برنامه نویس های ++C فقط قسمتی از این زبان رو برای کار انتخاب میکنن چون این زبان به قدری بزرگه که واقعا نمیشه از همه چیزش استفاده کرد. جالب اینه که اگه تو یه تیم کاری باشید، ممکنه سلیقه ی افراد برای انتخاب زیرمجموعه ایی از قابلیت های این زبان متفاوت باشه. مثلا سازندگان GTKmm بر عکس موزیلا با افتخار اعلام میکنن که یکی از برتری هاشون نسبت به Qt اینه که از کتابخانه ی استاندارد STL استفاده میکنن. حالا اینجا این سوال پیش میاد که این قراره یک مزیت باشه یا یه اشکال؟ اگر یک مزیته پس استفاده ی Qt از QTL قراره یه اشکال به حساب بیاد؟

اگه درست به این تیم های کاری نگاه کنید متوجه میشید اون ها به غیر از «شی گرایی» خالص، هیچ قسمت دیگه ای از ++C رو استفاده نمیکنن.

مساله ی بعدی خود منطق شی گرایی هستش. شی گرایی هیچ چیزی بیشتر از یه روش برنامه نویسی برای نوشتن کدهای دسته بندی شده و قابل استفاده ی مجدد نیست. ++C حتی در پیاده سازی امکانات شی گرایی هم زیاده روی هایی کرده.
برای مثال شما میدونستید که یه زبان شی گرا مثل پایتون اصلا متغیر privtate نداره؟ سوال من از شما اینه که کلا چرا باید متغیر private داشت؟ یه لحظه خوب فکر کنید… کلاس ما از ترس چه کسی یا چه چیزی باید اطلاعات رو مخفی کنه؟ اینا فقط چند خط کد هستن. خودشون عقل ندارن که تصمیم بگیرن. خودشون بدون اجازه ی شما نمیتونن از متغیر های همدیگه استفاده کنن، مگه اینکه شما علنا در کدهاتون اجازه ی این کار رو بدید.

اگر حتی تمام متغیرهاتون رو public تعریف کنید، تا وقتی که خودتون ازشون استفاده نکنید، چجوری ممکنه کدی به اون ها دسترسی داشته باشه؟ در پایتون تمام اعضای کلاس public هستن چون طراحی پایتون به این صورتِ که « یک برنامه نویس اونقدر احمق نیست که بدون دلیل از چیزی استفاده کنه و وقتی هم ازش استفاده میکنه حتما بهش نیاز داشته»

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

نظر شما در مورد این مطلب چیه ؟

UfnCod3r
پنج شنبه 22 اسفند 1392, 08:22 صبح
حرفات کاملا اشتباه هست . اخه وقتی اطلاعات کافی نداری برا چی میای تومار می نویسی
اولا که مگه قراره بود سی++ میاد سی رو از بین ببرن
اصلا کی گفته سی++ به اندازه سی سطح پایین نیست
سی++ تمام قابلیت های سی رو داره + مباحث شی گرایی و خیلی چیزایی دیگه
درمورد چیزهایی مثل سازنده و متغیر های استاتیک و وراثت باید بگم که شما کامپایلر رو درست نمی شناسی و خبر نداری چ کدی تولید می کنه
وقتی سازنده خالی هست یا اصلا نداری چیزی صدا زده نمیشه. وقتی ی جمع و یا مقدار دهی ساده تو سازنده هست خودش سازنده رو inline می کنه.
قدیما سی مرسوم بود و هنو سی++ جا نیفتاده بود و کامپایلر خوب هم براش نیومده بود و سیستم ها هم ضعیف بودن و کامپایل برنامه زمان زیادی می برد.
الان بهترین بازی ها و موتور های بازی از سی++ استفاده می کنن (Unreal, CryEngine).
کتاب خونه های اینتل اکثرا از سی++ استفاده می کنن (TBB). انودیا از سی++ استفاده می کنه (Cuda, Phys, Apex)



در اکثر مواقع برنامه نویس های ++C فقط قسمتی از این زبان رو برای کار انتخاب میکنن چون این زبان به قدری بزرگه که واقعا نمیشه از همه چیزش استفاده کرد.

این مشکل سی++ نیست مشکل برنامه نویسه که توانایی استفاده از این امکانات رو نداره.



حالا اینجا این سوال پیش میاد که پس قراره از چه چیزیه این زبان استفاد بشه؟ حتی Mozilla پا رو فراتر گذاشته و گفته به طور کل از STL استفاده نکنید! یعنی حتی از <iostream> و cin و cout هم استفاده نکنید.

عزیز من اینا ربطی به سی++ نداره . اینا کتاب خانه هست . توی برنامه های حرفه ای تر خیلی کم از CRT استفاده می شه . می تونی از توابع سیستم عامل استفاده کنی.
:عصبانی++:

بابک.م.
پنج شنبه 22 اسفند 1392, 11:02 صبح
مساله ی بعدی خود منطق شی گرایی هستش. شی گرایی هیچ چیزی بیشتر از یه روش برنامه نویسی برای نوشتن کدهای دسته بندی شده و قابل استفاده ی مجدد نیست. ++C حتی در پیاده سازی امکانات شی گرایی هم زیاده روی هایی کرده.
برای مثال شما میدونستید که یه زبان شی گرا مثل پایتون اصلا متغیر privtate نداره؟ سوال من از شما اینه که کلا چرا باید متغیر private داشت؟ یه لحظه خوب فکر کنید… کلاس ما از ترس چه کسی یا چه چیزی باید اطلاعات رو مخفی کنه؟ اینا فقط چند خط کد هستن. خودشون عقل ندارن که تصمیم بگیرن. خودشون بدون اجازه ی شما نمیتونن از متغیر های همدیگه استفاده کنن، مگه اینکه شما علنا در کدهاتون اجازه ی این کار رو بدید.

اگر حتی تمام متغیرهاتون رو public تعریف کنید، تا وقتی که خودتون ازشون استفاده نکنید، چجوری ممکنه کدی به اون ها دسترسی داشته باشه؟ در پایتون تمام اعضای کلاس public هستن چون طراحی پایتون به این صورتِ که « یک برنامه نویس اونقدر احمق نیست که بدون دلیل از چیزی استفاده کنه و وقتی هم ازش استفاده میکنه حتما بهش نیاز داشته»

همانطور که گفتین مهمترین محصول شی گرایی قابلیت استفاده مجدد است اما این هدف هیچ وقت بدون کپسوله سازی کامل حاصل نمی شه. مهمترین نتیجه کپسوله سازی ناقص . از دست دادن خوانایی کد و سردرگم شدن کاربر برای انتخاب متد مناسب و نهایتا نگهداری مشکل تر و ... است. وجود و استفاده مناسب از Access modifier ها از جمله private در کپسوله سازی بسیار اهمیت دارد.



در پایتون با تکنیک Name Mangling امکان تعریف متغییر و متد private وجود دارد:



class MyClass:

"""A simple example class"""
__PrivateVariable = 1234


PublicVariable = 6789


def __PrivateMathod(self):
return '__PrivateMathod'


def PublicMathod(self):
return 'PublicMathod'

Salar Moghaddam
پنج شنبه 22 اسفند 1392, 13:26 عصر
شما هیچ کتابی در رابطه با مهندسی نرم افزار نخوندید، مخصوصا قسمت داده های خصوصی و عمومی که فاجعه بود :|

درسته کل پستتون اشتباهه ولی اگر حتی درست هم بود هرگز همچین تایپیک هایی باز نکنید، چون در اکثر مواقع دچار کدورت و ترولینگ میشه

negative60
پنج شنبه 22 اسفند 1392, 17:50 عصر
هر زبانی جای خودش بايد استفاده بشه و قرار نبوده c++ جايگزين C بشه همونطور که نميشه يه تريلر رو با ماشين سواری مقايسه کرد چون هر کدوم در جای خودش بهترين نتيجه رو ميتونه داشته باشه.
در ضمن بيشتر برنامه هاي بزرگ ساخته شده با c++ نوشته شده يا يک رگ و ريشيه از c++ داره نميدونم رو چه حساب ميگيد c++ به اندازه خوب نيست!

motherboard
پنج شنبه 22 اسفند 1392, 18:19 عصر
ما به همین ++c راضی هستیم.:چشمک:

csvbcscp
پنج شنبه 22 اسفند 1392, 18:25 عصر
از همه شما متشکرم
من با همه نظرات شما موافقم و ممنونم که وقت گذاشتید و نظرتونو در مورد این مطلب گفتید.
من خودم از شیفته های شی گرا هستم و به نظرم شی گرایی از بزرگترین دستاورد های بشر در حوزه برنامه نویسیه که باعث انقلاب بزرگی در توسعه نرم افزرا شد.
من و همسرم استاد زهرا بیات مولف کتاب پرطرفدار معمای شی گرا در سی شارپ هستیم و این خود دلیل محکمیست که من هرگز مخالف شی گرایی و بالاخص زبان قدرتمند C++ نیستم

اما حالا حتما میپرسید پس این چیز هایی که گفتید چه بود ؟
من صبح این مقاله را در آدرس https://docs.google.com/document/edit?id=1e2201S7xSi31QPHQ0_KoLzKNmrn3CYmZUv3oJG6KG-U&hl=en دیدم، وخیلی برایم جالب بود که نظر بقیه رو هم در مورد این موضوع بدونم

چون هنوزم برام سواله که چرا زبان قدیمی C هنوز در بین مردم محبوبیت داره؟