چرا Nim ؟

یکی از تفریحات من، امتحان کردن زبان های برنامه نویسی مختلف و کمتر مرسوم هست، دلیلش هم آشنا شدن با ایده های جدیدی هست که این زبان ها دارند. چند وقت پیش به طور اتفاقی با زبان نیم(Nim) آشنا شدم و برام جالب بود.

زبان نمرود(Nimrod) توسط آقای آندریاس رامف در سال 2008 منتشر شد تا یک زبان کامپایلری به سرعت سی، خوانا مثل پایتون و توسعه‌پذیر مثل لیسپ باشد. در سال 2014 هم نام زبان از نمرود به نیم(Nim) تغییر پیدا کرد.

نیم بخش خیلی زیادی از سینتکسش رو از پاسکال ایده گرفته(کامپایلر اولیه نیم هم در پاسکال نوشته شده) که این باعث میشه افرادی که دنبال یک زبان شبیه پاسکال/دلفی هستند، نیم یک گزینه عالی براشون باشه :

میبینید که تعریف object ها و پروسیجر ها کاملا شبیه پاسکال انجام میشه، اما خبری از begin و end پردردسر هم نیست.

نیم به جای بلاک بندی به صورت begin و end که در پاسکال وجود داره، از سیستم indenting پایتون الگو گرفته تا حد بسیاری هم ویژگی های پایتون رو درون خودش پیاده سازی کرده(هم در سینتکس و هم در کتابخانه استاندارد):

Compilation Backends

نیم یک زبان کامپایلری هست و برای کامپایل سه نوع بک‌اند متفاوت داره : c، cpp، js که کد نیم شما به بک‌اند موردنظر transpile میشه و بعد با یک کامپایلر c یا c++ به باینری تبدیل میشه(اگر خروجی جاوااسکریپت بگیرید که نیازی به کامپایلر سوم-شخص ندارید).

مدیریت حافظه

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

به صورت پیشفرض نیم از یک جمع‌کننده زباله مبتنی بر reference counting برای مدیریت حافظه استفاده میکند اما میتوانید از روش های زیر نیز برای مدیریت حافظه استفاده کنید:

  • حالت های arc و orc
  • جمع‌کننده زباله مبتنی بر mark and sweep
  • جمع‌کننده زباله boehm
  • جمع‌کننده زباله GoLang(وقتی استفاده میشود که بخواهید با GoLang تعامل کنید)
  • مدیریت حافظه دستی(همه‌ی امور حافظه را باید دستی مدیریت کنید)

مقایسه حالت های مختلف مدیریت حافظه نیم :


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