اختاپوس خسته

یادداشت‌هایی پیرامون کد، زندگی و دوستان

چرا سی‌شارپ بد است؟

همون‌طور که می‌دونید محصولات مایکروسافت و به‌ویژه زبان سی‌شارپ بین برنامه‌نویس‌های کشورمون طرف‌دارهای خیلی زیادی داره. فکر نمی‌کنم هیچ کشوری دیگه‌ای مثل ایران صنعت نرم‌افزاری شرکت‌محور داشته باشه. این پست قرار نیست یک پست یک‌طرفه در مورد بد بودن مایکروسافت و دفاع از آزادی نرم‌افزار، نوشته شده از طرف یک گنو/لینوکسی دوآتیشه باشه :) من مدت‌ها با سی‌شارپ کد نوشتم و پروژه‌هایی رو هم تحویل مشتری دادم. بعدها به‌طور کامل به سی++ و کیوت مهاجرت کردم. حدود سال ۸۹ بود که آخرین کارم رو با سی‌شارپ انجام دادم. دو ماه پیش به فکرم رسید که مدت‌هاست خبری از مایکروسافت و محصولاتش ندارم. بهتره یه سری بزنم و ببینم چه تکنولوژی‌هایی معرفی کردن و یا محصولات قبلی رو تا کجا پیش بردن.

نتیجه‌ای که گرفتم این بود که مایکروسافت از سال ۲۰۱۱ به این‌طرف تغییر اساسی‌ای توی محصولاتش منتشر نکرده. البته اگر از برنامه‌نویس‌های دات‌نتی بپرسید دقیقاً خلاف این موضوع رو به شما میگن :) در ادامه بیشتر توضیح میدم. اما اول می‌خوام دلایل عدم استفاده از محصولات کمپانی‌هایی مثل مایکروسافت رو توضیح بدم. این کار رو با یک مثال شروع می‌کنم. مثالی که به شکل تحلیلی و براساس تخصص اصلی‌م (برنامه‌نویسی) نوشته شده. دلایل این که زبان سی‌شارپ زبان بدی هست رو می‌خوام توضیح بدم.

۱. معماری بسیار بد

برای شروع باید به معماری و چرخهٔ کاری برنامه‌های دات‌نت نگاهی بکنیم. زبان مورد مطالعهٔ ما زبان سی‌شارپ هست. سی‌شارپ عضوی از خانوادهٔ زبان‌های دات‌نت. این زبان‌ها فقط یک کامپایلر دارن. (مونو رو به‌حساب نمی‌آریم) این کامپایلر جزئی از مجموعه‌ای بزرگ‌تر هست به اسم دات‌نت. باید توجه داشته باشیم که دات‌نت یک کتابخانه نیست بلکه یک چهارچوب کاری یا همون framework هست. دقیقاً نقطه ضعف معماری مایکروسافت هم همین‌جاست. این فریم‌ورک به بدترین شکل ممکن ساخته شده. ایرادات زیادی توش وجود داره که بعضی‌ها رو توضیح میدم.

اول این که یک زبان واسط بیهوده وجود داره به اسم IL. کدهای سی‌شارپ به کد ماشین ترجمه نمی‌شن و مستقیماً به کد IL ترجمه میشن. سیستم‌عامل نمی‌تونه کد میانی رو اجرا کنه (برای همینه که شما نمی‌تونید بدون نصب دات‌نت فریم‌ورک روی کامپیوتر مقصد، برنامه‌هاتون رو منتشر کنید). یعنی مایکروسافت حتا به ABI سیستم‌عامل خودش هم احترام نذاشته و یه واسط بین سیستم‌عامل و برنامه ایجاد کرده. اما چرا؟ دلیل این کار به طور مشخص همگردانی راحت‌تر بین زبان‌های خانوادهٔ دات‌نت هست. اما دلیلی که خود کمپانی توضیح میده خیلی خنده‌دارتره. اون‌ها میگن ما این کار رو به خاطر پیاده‌سازی امکانات چندسکویی انجام دادیم! این دقیقاً یک جوک هست. برنامه‌های نوشته شده با محصولات مایکروسافت رو هیچ‌جور نمی‌تونید روی سیستم‌عامل‌های دیگه مثل مک‌اواس و یا گنو/لینوکس اجرا کنید. پس چندسکویی یعنی چی؟ باید از مدیران مایکروسافت بخوایم که برامون توضیح بدن منظورشون از سکو (همون پلتفرم) چی بوده. شاید ویندوزهای مختلف رو سکوهای مختلف حساب می‌کنن!

اما چرا مایکروسافت باید چندین زبان رو در یک مجموعه داشته باشه؟ هیچ دلیل مهندسی پشت این قضیه نیست. تنها چیزی که مطرح‌ه تبلیغات و بازاریابی هست. اساساً وجود داشتن زبان‌هایی که مایکروسافت تولید کرده هیچ توجیهی غیر از منافع تبلیغاتی نداره! چون از لحاظ سیستمی دقیقاً هیچ تفاوتی بین J#، Visual Basic .NET، C++.NET و سی‌شارپ وجود نداره. تنها سینتکس این زبان‌ها با همدیگه فرق داره. توی پاراگراف قبلی توضیح دادم که تمام زبان‌های دات‌نت به IL ترجمه میشن؛ حالا فقط می‌خوام اضافه کنم که ساختارهای سمنتیک این زبان‌ها هم دقیقاً یکسان هستند. بنابراین مایکروسافت می‌تونه تمام زبان‌های مجموعهٔ دات‌نت رو حذف کنه و به‌جاشون فقط سی‌شارپ (یا هر کدوم رو که دوست داشت) رو نگه داره. توجه داشته باشید که زبان Visual C++ رو با Visual C++.NET اشتباه نگیرید. کامپایلر مایکروسافت استاندارد سی++ رو کم و بیش پیاده‌سازی کرده و باید خاطرمون نگه داریم که سی++ جزئی از دات‌نت نیست اما VC++.NET جزئی از دات‌نت هست.

۲. کارایی پایین

همهٔ ما می‌دونیم که زبان سی‌شارپ زبان بسیار کندی هست. اگه نمی‌دونیم می‌تونیم چند تا بنچمارک ساده بنویسیم :) شخصاً تعداد زیادی از این بنچمارک‌ها رو نوشتم و تست کردم. شما اگر ساده‌ترین برنامه‌ها رو با سی‌شارپ بنویسید و اجرا کنید مشاهده می‌کنید که مقدار خیلی زیادی حافظه براشون گرفته شده و پردازش خیلی زیادی از سی‌پی‌یو رو می‌گیرن. یکی از دلایل این وضعیت همون واسط اضافی هست که بین سیستم‌عامل و برنامه قرار گرفته. اما دلیل اصلی پیاده‌سازی بد کامپایلر هست. کامپایلر سی‌شارپ در مقایسه با کامپایلرهای قوی‌تر مثل GCC پیاده‌سازی خیلی ابتدایی‌تری داره. البته باید توجه داشته باشیم که بهینه‌سازی Backend توی کامپایلرهای مایکروسافت خیلی قوی‌تر از گنو هست. دلیل‌ش اینه که سازندهٔ ABI و سازندهٔ Compiler زیر سقف یک شرکت هستند و همچنین اون ABI به‌طور کامل منتشر نشده (که کس دیگه‌ای مثل افراد گنو بیان و بهتر از مهندس‌های مایکروسافت براش کامپایلر بسازن). با این وجود بهینه‌سازی Frontend در GCC به مراتب قوی‌تر از .NET انجام شده. چرا؟ چون GCC رو آدم‌های بسیار باسواد می‌نویسند و تعداد مغزهایی که روی پروژه‌های گنو کار می‌کنند بیشتر از تعداد کل مهندس‌های گروه توسعهٔ کامپایلر در کمپانی مایکروسافت هست.

۳. محصولات حبابی

یادداشت پس از نگارش: قبول دارم که خیلی دارم به مایکروسافت فشار میارم و خیلی ازش بد میگم :) ولی واقعاً هیچ مشکل شخصی‌ای با این کمپانی ندارم و بیل گیتس رو هم خیلی دوسش دارم.

مایکروسافت گورستان محصولات/پروتکل‌ها و ابزارهاست. چیزهایی که مایکروسافت می‌سازه خیلی زود محبوبیت‌شون رو از دست میدن و استفاده‌کننده‌ها مجبور هستند چیزهای جدیدی رو با اون‌ها جایگزین کنند. اگه یک برنامه‌نویس سابقه‌دار در ایران باشید می‌دونید که در مورد چی صحبت می‌کنم. چیزهایی زمانی به‌شدت مد بودند اما امروز کاملاً محو شدند. الان مُد روز استفاده از WPF برای رابط کاربری هست. همچنین امکانات جدیدی که در نسخهٔ جدیدی سی‌شارپ اضافه شده. قبل از WPF اما چیز دیگری رایج بود: Windows Forms. و قبل از اون MFC و قبل از اون ALT و قبل از اون COM+ و قبل از اون هم COM و بسیاری تکنولوژی‌های دیگه که کاملاً با همدیگه متفاوت بودند و هرکدوم مدت کوتاهی بعد از معرفی شدن از مد افتادن. خوب مایکروسافت چرا این کار رو می‌کنه؟ برای تبلیغات. چون یک محصول هر چقدر هم که خوب باشه ارزش تبلیغاتی‌ش رو بعد از یکی دو سال از دست میده. اون‌ها باید با معرفی چیزهای جدید و به‌دردنخور بازار رو مشغول نگه دارند. البته اشتغالی از نوع عبث. این کار اون‌ها تأثیر خیلی منفی‌ای روی برنامه‌نویس‌ها می‌ذارن: به‌عنوان کسی که شغلش مهندسی نرم‌افزار (بخش تولید) هست شما باید عمر کاری‌تون رو با نوشتن برنامه‌ها بگذرونید. هر چند وقت یک‌بار هر چیزی که یاد گرفته بودید هیچ میشه و باید از نو (نه از صفر) شروع کنید. هیچ تضمینی وجود نداره که این تکنولوژی‌ای که شما استفاده می‌کنید، دو سال بعد هم خریدار داشته باشه. بنابراین همواره در حال یادگیری و تست کردن چیزهای جدید خواهید بود. البته منکر این نیستم که امتحان کردن چیزهای جدید خوبه اما بد نیست به فکر اعصاب خودمون در بلند مدت هم باشیم.

روی دیگهٔ سکه چه کسانی هستند؟ مردان و زنان باایمانی که از سی++ و استاندارها استفاده می‌کنن :) اگه یه چیزی خیلی خوب طراحی شده باشه، مدت خیلی زیادی دوام میاره. مثلاً پروتکل TCP رو درنظر بگیرید. نزدیک چهل سال از معرفی اولین RFC ی TCP می‌گذره. تو این مدت چه تغییری کرده؟ تقریباً هیچی! فقط دو تا بهینه‌سازی خیلی جزئی اضافه کردند. همچنین زبان سی++ رو درنظر بگیرید. این زبان طی سی سال گذشته تغییر چندانی نکرده. جز این که سال ۲۰۱۱ (بعد از بیست و اندی سال) استاندارد جدید رو معرفی کردند. بنابراین من به‌عنوان یک برنامه‌نویس متوسط سی++ می‌تونم اطمنان داشته باشم که کدی که می‌نویسم حداقل طی چهل سال آینده کامپایل میشه و کامپایلر خواهد داشت :)

خوب فکر می‌کنم برای یک پست شب‌جمعه‌ای به‌قدر کافی وراجی کرده باشم. بقیهٔ ماجرا رو بعداً تعریف می‌کنم. راستی نظرات‌تون رو دریغ نکنید.

دیدگاه‌ها