الگوریتم

مجموعه مقالات علوم کامپیوتر

الگوریتم

مجموعه مقالات علوم کامپیوتر

  • ۱
  • ۰

چرا  c++ همچنان زبان کارامدی است

 

Not found

چند هفته پیش من یک بازی آنلاین تحت مرورگر را در فستیوالی آموزشی ساختم.  ایده ساخت یک بازی آنلاین مانند این را از مدتها پیش در سر داشتم و بالاخره شانس کار کردن در بازه زمانی طولانی بر روی ایده ام را پیداکردم.کار، بسیار ساده بود اما مهمترین خروجی این بود که چندین بازیکن می توانستند در تعامل با یکدیگر از انجام بازی لذت ببرند.

یک سرور Websocket  در جاوا ، گرافیک های جاوا اسکریپت در قسمت پیشین (Frontend) را به قسمت پسین (Backend) پیوند می داد. من تلاش کردم با استفاده از P5.js از جاوا اسکریپت پیشین (Frontend) تنها به عنوان رندر گرافیکی استفاده کنم و کلیه پردازش ها را در قسمت پسین (Backend) انجام دهم تا از این طریق همه چیز را تا حد امکان امن نگاه دارم...

کاربر تنها می بایست کلید های صفحه کلید یا ماوس را بفشارد در حالیکه سرور جاوا در حال پردازش ورودی ها و بازگرداندن اشیا (Objects) برای رندر کردن آنچه در شعاع دید بازیکن است می باشد.

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

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

فضای فیزیکی حافظه محدود است به نوع سخت افزار حافظه با دسترسی تصادفی (RAM) در نتیجه برنامه نیاز به راهی دارد تا از دست اشیاء بلااستفاده موجود در پشته خلاص شود. در جاوا این عمل به صورت اتوماتیک صورت می گیرد.هر برنامه جاوا با توجه به مقدار مشخصی از RAM که به آن اختصاص یافته ، زمانی که به حداکثر محدوده پشته خود نزدیک می شود برنامه “Garbage Collection”  را اجرا می کند. این برنامه حافظه را برای پیدا کردن ارجاعات به اشیائی که دیگر در دامنهء دسترسی نیستند اسکن نموده و آنها را برای پاک کردن علامت گذاری می نماید.

در یک برنامه مانند بازی ، این فرایند می تواند بسیار نامطلوب باشد زیرا بعد از فقط چند فریم ، حفظه پر خواهد شد و برنامه برای اجرای “Garbage Collection”  متوقف خواهد شد.این امر دلیلی است بر آنکه که بازیهای زیادی تحت جاوا ساخته نمی شوند و زمانی هم که ساخته شوند ( اغلب ، بازیهای تلفن همراه ) آنهایی که کارایی بالایی دارند از تخصیص پویای حافظه به اشیا و در نتیجه از اجرای برنامه “Garbage Collection”  جلوگیری می کنند.

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

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

قسمت عمده ای از اینکه چرا همچنان C++ زبان مناسبی است به این بازمیگردد که به برنامه نویس اجازه کنترل جزئیات سخت افزار را می دهد بدون آنکه به سطح زبان اسمبلی فرو بیفتد. کد C++  همچنان در همه جا مورد استفاده قرار می گیرد و ظاهرا این به دلایل موروثی نیست زیرا کمپانی SpaceX برای موشک های خود از C++ استفاده می کند.

در مورد نرم افزار من ، می بایست از حالت اتوماتیک Garbage Collection  اجتناب می کردم زیرا از نظر فنی درحال نوشتن یک سیستم بلادرنگ (Real-Time) بودم به این دلیل که می بایست اطمینان پیدا می کردم تا به روز رسانی در هر ثانیه را در حد تعداد مشخصی حفظ کنم.

به هر حال در زمینه های جدی تر مانند روباتیک ، صنعت اتومبیل و البته راکت های فضایی این نیاز بلادرنگ حالت حیاتی دارد.

در نهایت نرم افزار من برنده جایزه اصلی فستیوال شد اما آنچه برای من دارای اهمیت بود و من را برآن داشت تا تجربه ام را با شما شریک شوم ؛  قدرت نمایی تمام نشدنی C++ در مقابل سایر زبانهای مدعی بود .

نویسنده : Trevor Nguyen