جاوا و سی شارپ - شباهت های زیاد, تفاوت های زیاد.

  • مقدمه

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

جاوا که یک معتقد حقیقی به برنامه نویسی شی گرا میباشد, با دیدی نو به میدان وارد شد... یک زبان کاملا شی گرا که Automatic Garbage Collected هم بود و این موضوع نوید یک روشی نو در تولید نرم افزارهای تجاری را میداد. در واقع حفظ یکپارچگی object و مراقبت از آن مانند یک سامورائی واقعی هدف جاوا بود و حتی این اصول رو در ورای یک object ساده نیز انجام میداد. جاوا یک الگو از یک زبان حقیقتا شی گرا در تمامی جنبه هاست. حتی کل اپلیکیشن رو هم در یک vm قرار میداد و از اون بعد هم اپلیکیشن رو یک object تلقی میکرد و مورد حفاظت قرار میداد (در همین حد شی گرا!). غیر ممکنه که این موضوع برای شما جالب نباشد. این خلوص و اعتقاد قوی به اصول شی گرایی.


جامعیت خاصی در زیرساخت های جاوا وجود داره.
جامعیت خاصی در زیرساخت های جاوا وجود داره.


یک بار بنویس و همه جا اجرا کن!
یک بار بنویس و همه جا اجرا کن!



مایکروسافت, نظرش به جاوا واقعا جلب شد و در تلاش بود تا از این زبان در محصول بزرگ و موفق خودش یعنی ویندوز استفاده کنه. ویرایشی از زبان جاوا تحت عنوان ++j رو آماده کرد ولی این زبان در همون ابتدای امر نتونست مورد تایید شرکت Sun باشه و بعنوان یک نسخه ای از زبان جاوا پذیرفته نشد. احتمالا چون استانداردهای سخت گیرانه جاوا رو رعایت نمیکرد. یا شاید هم دیدی متفاوت داشت در برخی موارد...

شخص شخیص جیمز گاسلینگ سی شارپ رو نوعی تقلید از جاوا درنظر میگرفت و انصافا شباهت ها هم کم نبود
شخص شخیص جیمز گاسلینگ سی شارپ رو نوعی تقلید از جاوا درنظر میگرفت و انصافا شباهت ها هم کم نبود


به هرحال ++j مایکروسافت نتوانست تاییدیه موردنیاز رو دریافت کنه ولی این پایان کار نبود. مهره ای در مایکروسافت حضور داشت با سابقه ای درخشان به اسم آندرس هیلزبرگ. مایکروسافت به این ایده های جاوا علاقه مند بود یک زبان Automatic Garbage Collected که باعث بشه تمرکز و وقت برنامه نویس بیشتر به سمت کار خودش باشه تا مفاهیم سیستم عاملی.

رزومه درخشان این معمار, شبیه کسی نبود که به راحتی پا پس بکشه
رزومه درخشان این معمار, شبیه کسی نبود که به راحتی پا پس بکشه


به هر حال مایکروسافت بصورت کاملا فعال شروع به توسعه زبان سی شارپ کرد. سی شارپ همچنان شباهت هایی به جاوا داشت ولی لزوما شی گرایی رو به اون غلظت جاوا نمیدید. مثلا در عمیق ترین لایه های زبان سی شارپ و فریمورک های مبتنی بر اون ما مفهوم زیبایی مثل Delegate رو میبینیم که در واقع میشه گفت به نوعی یک نوع فانکشن پوینتر هستند. که از دید جاوا این فیچر ها کمی غیر شی گرا بنظر میاد. و جاوا اصلا چیزی به اسم پوینتر نداره. سی شارپ از تایپ هایی مثل struct هم استفاده میکرد ولی در جاوا همه چیز به معنای واقعی یک class هستند و این موضوع هم چندان شی گرا طبق اون تعریف سخت گیرانه جاوا نبود. شاید دلیل اینکه چیزی به اسم ++j عملیاتی نشد هم همین تفاوت های فلسفی در موضوع شی گرایی بود. در جاوا پوینتری وجود نداشت چون ایده جاوا از شی گرایی چیز دیگری بود. در واقع سی شارپ برداشتی از دو دنیای سی پلاس پلاس و جاوا بود. و خود آندرس هیلزبرگ به این موضوع معتقد بود که سی شارپ الهامات بیشتری از سی پلاس پلاس داره تا جاوا.


اتمسفر جاوا مثل یک برادر بزرگتر شما رو مجبور به رعایت الزامات برنامه نویسی شی گرا میکنه و اجازه تخطی رو به شما نمیده. سی شارپ اون چیزی که برای توسعه به سبک شی گرایی نیاز هست رو خیلی عالی و تمیز در اختیار شما قرار میده ولی دید متفاوتی از شی گرایی داره و بصورت ساده تر شاید بشه نتیجه گرفت که سی شارپ کمی General Purpose تر و جاوا کمی Object Oriented تر هستش.


با اینحال سی شارپ پا به میدان گذاشت و ظرافت و قدرتی که در بیان داشت واضح بود که این زبان آینده فوق العاده روشنی خواهد داشت. سینتکس های سی شارپ شاعرانه بود... زیبا بود و قدرتمند و مختصر.

زبانی روان و قدرتمند
زبانی روان و قدرتمند


کلمات محدود... قدرت بیان بالا!
کلمات محدود... قدرت بیان بالا!



اما علاوه بر تفاوت های تئوریک در حوزه شی گرایی, در حوزه خود محصول هم یکبار دیگه این دو برادر در مسیر مقابل هم قرار داشتند.

جاوا و اتمسفرش همیشه open-source تر از سی شارپ و دات نت بود. و اصلا سیاست تجاری مایکروسافت در اون زمان این بود که یک پلتفرم توسعه استاندارد برای سیستم عامل ویندوز (با تعداد یوزر باورنکردنی در کره زمین) بسازه. و جاوا در سال 2006 رسما open-source شد. در فریمورک های جاوا انتزاعات کمی واضح تر هستند و در واقع stack ی که از ابزارها وجود داره مربوط به یک شرکت نیستند مثلا جاوای سان و تام کت از شرکت آپاچی و...


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

غروب خورشید
غروب خورشید


اتمسفر جاوا پشتیبانی بزرگ رو از دست داده بود. و خیلی محتاطانه به حیات خودش ادامه میداد. و در همون حال سی شارپ و دات نت در حال رشد قابل توجهی بودند. ویژگی هایی چون Linq با پکیج های فوق العاده ای مثل EntityFramework و Identity واقعا کاراکتر خاصی از فضای دات نت رو ساخته بودند. بعلاوه این که مایکروسافت سعی میکرد انتزاعات غیر ضروری رو از دید کاربر مخفی کنه و همیشه دیدش به این صورت بود که ما ابزار رو تهیه میکنیم تا شما درگیر برنامه و بیزینس خودت باشی. خیلی در واقع درگیر مفاهیمی چون jse و یا jee و ejb و یا perspective های خاص در IDE نباشید و کمی کامپوننتی تر تعامل داشته باشید با ابزارها تا انتزاعی تر. که واقعا سادگی و زیبایی خاصی هم داره این طرز تفکر.

گفتیم که دست تقدیر داشت این دو دنیا رو به جهت های متضاد هدایت میکرد. چرا؟ چون دو اتفاق افتاد... تغییرات عمیق در culture مایکروسافت با ظهور مدیرعامل جدید(ساتیا نادلا) و مالکیت شرکت oracle بر اتمسفر جاوا. زمزمه اوپن سورس شدن دات نت و بازنویسی مجدد این چارچوب شنیده میشد و این خبری نبود که مهم نباشه در دنیای IT. دات نت تبدیل شد به دات نت کور و اپن سورس شد. دیگه کاملا انحصاری نبود و از سیستم عامل های مختلفی پشتیبانی میکرد. بسیار سریعتر و انتزاعی تر شده بود و از لحاظ performance به یک کابوسی برای رقبا تبدیل شده بود. دیگر زنجیری بر گردن این هیولا وجود نداشت. جاوا توسط شرکت اوراکل مدیریت میشد و نیازها و ترندهای بازار رو بیشتر مدنظر قرار میداد تا عقاید بنیادین و محترمی که موجب شکل گیری جاوا شده بودند.

بعنوان مثال چیزی به اسم Stream Api معرفی شد و سعی داشت برخی از قابلیت های Linq مایکروسافت رو پوشش بده و این یه مثالی بود که اتمسفر جاوا کم کم نرمش بیشتری نشون میداد. جاوا به اصطلاح شرکتی تر شد و دات نت open-source تر.

  • نتیجه گیری

بدیهیه که انتخاب میان این دو دلیل بر محدودیت دیگری نیست. اتفاقات تاریخی که رخ داد به ما اهمیت یک نکته رو نشون میده در دنیای نرم افزار. توازن... trade-off کردن که همه قدیمی های دنیای نرم افزار این موضوع رو با تمام وجودشون احساس کردند. در آخر میشه گفت سی شارپ و جاوا از یکدیگر آموختند و حضور این دو قطب موجب شد که این دو زبان برنامه نویسی بعنوان افسانه در تاریخ دنیای کامپیوتر جاودانه بشوند. به این تصویر دقت کنید.