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 از امکانات خیلی ساده ی شی گرایی استفاده کرده و این نشون میده که تب شی گرایی دیگه خوابیده و برنامه نویس ها فهمیدن که لازم نیست برای نوشتن برنامه های بزرگ از قوانین پیچیده ی شی گرایی طبعیت کنن.
نظر شما در مورد این مطلب چیه ؟
از نظر من، دلیل ناموفق بودن ++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 از امکانات خیلی ساده ی شی گرایی استفاده کرده و این نشون میده که تب شی گرایی دیگه خوابیده و برنامه نویس ها فهمیدن که لازم نیست برای نوشتن برنامه های بزرگ از قوانین پیچیده ی شی گرایی طبعیت کنن.
نظر شما در مورد این مطلب چیه ؟