سعید نوری
سعید نوری
خواندن ۶ دقیقه·۷ سال پیش

بهترین زبان برنامه‌نویسی برای نوشتن برنامه‌های با بازدهی بالا

من هنوز امیدوار هستم که دنیای زبان‌های برنامه‌نویسی دچار تحول شود. من از نوشتن با زبان‌های سی یا جاوا خسته شده‌ام، من زبان‌های بهتری می‌خواهم.

من به طور خاص به چیزی که «برنامه‌نویسی با بهره‌وری بالا» نامیده‌ام علاقه‌مندم. من می‌خواهم زبانی را انتخاب کنم که بیشترین استفاده را از سخت‌افزار کنم. برنامه‌نویسی در پایتون یا جاوا اسکریپت جالب است اما بعضی وقت‌ها پیش می‌آید که برای نوشتن یک برنامه باید از سخت‌افزار خالص استفاده کنید.

  • به همین منظور من لیست زبان‌های مورد نظر را محدود به «زبان‌های برنامه‌نویسی سیستمی» کرده‌ام که عبارتند از سوئیفت (Swift)، راست (Rust)، گو (Go)، سی پلاس پلاس و سی. این زبان‌ها برای چیزی بیشتر از ساختن برنامه‌های کاربردی مناسب هستند، یعنی موتورهای پایگاه داده، سرورها و چیزهایی مانند این‌ها. همه این‌ زبان‌ها کامپایلری هستند که این ویژگی باعث می‌شود بهره‌وری برنامه‌های تولیدی بیشتر شود.
  • من فکر می‌کنم همه برنامه‌نویسان با این موضوع که سی و سی پلاس پلاس زبان‌های برنامه‌نویسی سیستمی هستند موافق هستند، در حالی که واجد شرایط بودن زبان‌های سوئیفت و گو مورد بحث است. آیا شما یک سیستم عامل را با گو می‌نویسید؟ من همچین کاری نمی‌کنم. اما مثل اینکه ویکیپدیا همه‌ی این زبان‌ها را جزو زبان‌های برنامه‌نویسی سیستمی طبقه‌بندی کرده است.
  • من زبان اسمبلی را از لیست حذف کرده‌ام چون نمی‌توانم تصور کنم که به صورت روزانه از این زبان استفاده کنم. این زبان فقط در جاهایی که مقدار کمی کد نیاز است کاربرد دارد (احتمالا در نرم‌افزار‌های تعبیه شده).
  • من قصد دارم زبان‌های راست ، D و Nim  را نیز حذف کنم زیرا این زبان‌ها تعداد بسیار کمی کاربر دارند. برنامه‌نویسی یک کار اجتماعی است، اگر کسی نباشد که از کد شما استفاده کند دیگر مهم نیست که کد شما چقدر سریع اجرا می‌شود. من فکر می‌کنم این زبان‌ها زبان‌های خیلی جالبی هستند ولی تا وقتی که تعداد زیادی کاربر از این زبان‌ها استفاده نکنند من آنها را در لیست قرار نمی‌دهم. زبان فرترن هم به دلیل مشابهی از لیست بیرون گذارده می‌شود، هر چند که این زبان کاربران پیگیری دارد ولی حوزه عملکرد این زبان محدود و اختصاصی است.
  • من همچنین زبان‌های غیر سیستمی مانند پی‌اچ‌پی، جاوا اسکریپت،متلب، روبی، آر و پایتون را در لیست قرار نداده‌ام زیرا هر چند که این زبان‌ها می‌توانند سریع باشند ولی هیچکدام از آنها به صورت اختصاصی برای بازدهی بالا طراحی نشده‌اند. آنها برای منظور‌های خاصی به مقدار کافی سریع هستند ولی محدودیت‌های بزرگی هم دارند، مثلا جاوا اسکریپت و پایتون به صورت بومی از مولتی-تردینگ پشتیبانی نمی‌کنند.
  • جاوا و سی شارپ موارد جالبی هستند. هر دوی این زبان‌ها به عنوان زبان‌های برنامه نویسی سیستمی توصیف و استفاده شده‌اند. شواهد حاکی از ان است که جاوا می‌تواند برای ساخت سیستم‌هایی که می‌توانند بسیار خوب عمل کنند استفاده شود. اما من فکر می‌کنم که اجرا در یک ماشین مجازی (JVM,CLR) یک محدودیت بزرگ است زیرا شما هرگز نمی‌توانید به سخت‌افزار خالص دسترسی داشته باشید. من اسکالا را هم جزو دسته‌بندی جاوا حساب کرده‌ام.
  • تعداد زیادی زبان دیگر هم وجود دارد که آنها را ذکر نکرده‌ام زیرا هیچکدام از آنها نخواهند توانست به اندازه کافی کاربر جذب کنند.


اجازه دهید بعضی از ویژگی های پسندیده برای برنامه نویسی با بازدهی بالا را ذکر کنم که زبان‌های برنامه‌نویسی جاری در آنها عملکرد خوبی داشته‌اند:

۱- سیستم‌عامل‌ها به وسیله سی و سی پلاس پلاس ساخته شده‌اند. علاوه بر این خیلی از کتابخانه‌های مهم برای زبان سی اینترفیس دارند، این بدان معنا است که توانایی فراخواندن توابع زبان سی با کمترین سربار در بعضی موارد مهم است. هر چند که زبان گو به شما اجازه می‌دهد که توابع زبان سی را فراخوانی کنید ولی این کار سربار زیادی را به عملکرد تحمیل می‌کند. همه‌ی زبان‌های دیگر می‌توانند توابع زبان سی را با کمترین سربار فراخوانی کنند.

  • برنده آشکار: سی و سی پلاس پلاس
  • بازیکن خوب: سوئیفت
  • بازنده: گو


۲- اگر چه این قابل بحث است اما من فکر می‌کنم زبانی که مدیریت حافظه دستی دارد احتمالا در کارایی بهتر عمل می‌کند. در سیستم‌های مدرن، مدیریت حافظه نیز اغلب یک سربار مهم است. زبان‌های سی و سی پلاس پلاس مدیریت حافظه دستی دارند. سوئیفت سیستم شمارشگر ارجاع دارد که حالتی از مدیریت مدرن حافظه است، اما با این مزیت که کاملا جبری است یعنی وقتی که داده از محدوده‌اش خارج می‌شود حافظه بازپس‌ گرفته می‌شود. اگر چه شمارش ارجاع هم سربار دارد، مخصوصا در زمینه مولتی‌تردینگ. زبان گو زباله‌روب نسلی (generational garbage collection) دارد همانند جاوا و سی‌شارپ. این بدان معنا است که این زباله‌روب هر از گاهی برنامه را برای بازپس‌گیری حافظه متوقف می‌کند، هر چند که این زباله‌روب طوری بهینه شده است که توقف‌ها کوتاه باشد. این بهینه‌سازی کار پسندیده‌ای است زیرا توقف برنامه مطلوب نیست. من نمی‌دانم کدام روش را ترجیح می‌دهم؟ روش سوئیفت یا روش گو.

  • برنده: سی و سی پلاس پلاس
  • بازند: گو و سوئیفت


۳- پردازنده کامپیوترهای ما تعداد زیادی هسته دارد. برنامه‌نویسی پارالل مهم است. ما ترجبح می‌دهیم که زبان برنامه‌نویسی ما برنامه‌نویسی چند هسته‌ای را به خوبی پشیبانی کند. من فکر می‌کنم که زبان گو در این زمینه به صورت واضح دست بالا را دارد. اگر چه هر آنچه که می‌شود با گو در مورد چند هسته‌ای انجام داد را می شود با زبان سی نیز انجام داد ولی این کار به راحتی زبان گو نیست. تا جایی که من می‌دانم زبان سوئیفت یک روش استاندارد در مورد استفاده از چند هسته دارد که «توزیع‌کننده مرکزی بزرگ» نامیده می‌شود. این زبان همچنین Operation/OperationQueue را برای سطوح بالاتر مولتی-تردینگ دارد. این ممکن است خوب باشد اما نمی‌تواند با قابلیت‌های موجود در دیگر زبان‌های لیست رقابت کند.

  • نام بردن ویژه: گو
  • برنده: سی و سی پلاس پلاس
  • بازنده: سوئیفت


۴- برای کارایی بالا، یک زبان برنامه نویسی خوب باید یک ویژگی به نام «قابلیت تشخیص آسان کارایی» را داشته باشد. این بدان معنی است وقتی شما به یک قطعه کد نگاه می‌کنید باید بتوانید پیش‌بینی کنید که این قطعه کد با چه سرعتی اجرا می‌شود. اگر بخواهم صادق باشم باید بگویم که این کار در طول زمان بسیار سخت‌تر شده است و ما مجبور شده‌ایم که بیشتر و بیشتر به بنچمارک‌ها تکیه کنیم. اگر چه برای زبان‌های ساده‌تر مثل سی و گو بیش‌بینی کارایی کد‌ها را راحت‌‌تر کرده‌اند. در واقع هر چه زبان گسترده‌تر می‌شود کامپایل کد‌های آن در سرتان سخت تر می‌شود.

  • برنده: سی و گو
  • بازنده: سوئیفت و سی پلاس پلاس


۵- پردازنده‌های ما دستورالعمل‌های جالب جدیدی دارند مثل دستورالعمل‌های SIMD. این دستورالعمل‌ها باید به آسانی از طریق زبان‌های برنامه‌نویسی در دسترس باشند. هیچ زبان برنامه‌نویسی برای برنامه‌ نوشتن با چیزی مثل SIMD آسان نیست اما زبان‌های سی و سی پلاس پلاس به طور واضحی بر دیگران برتری دارند. در زبان گو شما می‌توانید توابع را با زبان اسمبلی بنویسید و سپس این توابع را در گو فراخوانی کنید اما این کار سربار زیادی را بر کارایی تحمیل می‌کند. سوئیفت به صورت آشکاری در این زمینه بهتر است، برای این زبان یک پکیچ بنام simd وجود دارد ولی این پکیج فقط در سیستم عامل مک کار می‌کند.

  • برنده: سی و سی پلاس پلاس
  • بازنده: گو و سوئیفت


۶- ده‌ها سال گذشته است و هنوز یک روش فراگیر برای مدیریت وابستگی‌ها در زبان سی وجود ندارد. همچنین هیچ روش استاندردی برای ساخت (build) برنامه‌ها وجود ندارد. البته IDE شما اضافه کردن وابستگی ها و ساخت برنامه را تسهیل می‌کند اما داشتن چیزی که در زبان برنامه‌نویسی به صورت توکار وجود داشته باشد کار را بسیار راحت‌تر می‌کند. در زبان‌های گو و سوئیفت یک روش چند-پلتفرم استاندارد برای اضافه کردن وابستگی‌ها، ساخت برنامه و تست برنامه وجود دارد.

  • برند: گو و سوئیفت ( نام بردن ویژه از گو)
  • بازنده: سی و سی پلاس پلاس


در جدول زیر تحلیل خودم را خلاصه کرده‌ام:

اگر من به منظور برنامه‌نویسی با کارایی بالا استخدام شوم، هر کدام از زبان‌های بالا به من «تحمیل» شود من خوشحال خواهم بود. همه‌ی آنها گزینه‌های خوبی هستند. همه‌ی آنها با سرعت زیادی در حال بهتر شدن هستند، به عنوان مثال من فکر می‌کنم زبان گو از زمانی که من آن را آموخته‌ام به میزان خیره کننده‌ای پیشرفت کرده است.


منبع: lemire.me

این مطلب همچنین در این لینک در وبسایت شخصی من انتشار یافته است.

برنامه‌نویسیبرنامه‌نویسی سیستمیمقایسه زبان‌های برنامه‌نویسیsystem programming
علاقه‌مند به فناوری، توسعه دهنده پایتون و بک‌اند در آینده‌ای دور یا نزدیک!
شاید از این پست‌ها خوشتان بیاید