تصور کنید میتوانستید با سادگی پایتون کد بنویسید اما در لحظه اجرا، سرعتی معادل زبان C داشته باشید. اگر امروز بین «سادگی کدنویسی» و «سرعت اجرای واقعی» در حال انتخاب هستید، Nimic این معادله را تغییر میدهد. در حالی که پایتون به دلیل انعطافپذیری شهرت دارد، اما اغلب با گلوگاههای مفسر دست و پنجه نرم میکند که سرعت خام اجرای کد را کاهش میدهد.
به نقل از مستندات رسمی این پروژه در گیتهاب (به تاریخ ۲۳ ژوئن ۲۰۲۶)، Nimic یک ماژول پایتونی است که زیرمجموعهای از کد پایتون را به زبان Nim تبدیل (Transpile) میکند. این ابزار در واقع یک پل است؛ کدهای شما در زمان توسعه پایتون هستند، اما در زمان کامپایل به فایلهای باینری بومی (Native Binaries) با عملکرد بالا تبدیل میشوند که مستقیماً روی سختافزار اجرا میگردند. سالهاست که توسعهدهندگان پایتون با یک توازن دشوار روبرو بودهاند: یا کدی ساده و خوانا بنویسند و سرعت پایین را بپذیرند، یا بخشهای حساس به عملکرد را مجدداً در C++ یا Rust بازنویسی کنند. Nimic با تبدیل AST (درخت نحو) پایتون به سینتکس Nim، این مشکل را حل میکند.
معماری فنی
سیستم از یک سلسلهمراتب ماژولار سازمانیافته تشکیل شده است. فایل ntypes.py به عنوان API عمومی عمل کرده و سیستم تایپ و شیمهای (shims) کلیدواژههای Nim را بازتوزیع میکند. منطق اصلی در ntypesystem.py قرار دارد، در حالی که transpiler.py مسئولیت تبدیل کد به سورس Nim را بر عهده دارد. اجزای تکمیلی شامل inliner.py برای گسترش قالبها، پوشه ncode/ برای تعاریف Nim، پوشه nimpy/ برای تولید کتابخانههای پایتونی و همچنین پوشههای std/ و system/ برای شیمهای کتابخانه استاندارد Nim و ماژولهای سیستمی مانند ansi_c است.
این سیستم بر پایه یک رویکرد لایهای برای مدیریت حافظه و تایپ بنا شده است:
- سیستم تایپ هسته: بر پایه ماژول داخلی
ctypesساخته شده است. این لایه ازNtypeوNTypeRegistryبرای بافرهایی با معنای مقداری (Value Semantics) استفاده میکند. این بخش شامل انواعNScalarمانند اعداد صحیح با عرض ثابت (int8تاint64وuint8تاuint64) و اعداد اعشاری (float16تاfloat64) همراه با قابلیت ارتقای حسابی (Arithmetic Promotion) است. - ساختارهای پیشرفته: فیلدهای «آبژه» به سبک Nim را از طریق یادداشتهای
Objectپیادهسازی میکند و از طریق سیستمmatch kind:از اتحادیههای متمایز (Discriminated Unions یا Case Objects) پشتیبانی میکند. همچنینNIntEnumبرای ثبت خودکار Enumهای صحیح و زیرکلاسهایstringبا اپراتورهای%و&سازگار با Nim در آن تعبیه شده است. - کانتینرها و حافظه: از توالیهای قابل گسترش (
seq[T]) و آرایههای با اندیس اشارهگر (UncheckedArray[T]) پشتیبانی میکند. همچنین ابزارهای سطح پایین حافظه مانندcast[T](x)،sizeof(x)،addr(x)وunsafe_addr(x)را فراهم میآورد. - تبدیلگر (Transpiler): یک پیادهسازی تغییریافته از
ast.pyدر CPython است که از یک_Unparserگسترشیافته برای تولید کد Nim استفاده میکند. این فرآیند شامل بیش از ۳۰ قانون تبدیل است که مواردی چون تورفتگیها، امضاهای توابع و جریانهای کنترلی را پوشش میدهد. - موتور اینلاینینگ: دکوراتورهای
@templateو@template_expandعملیات Inlining توابع را در سطح AST انجام میدهند تا با جایگزین کردن نام پارامترها با آرگومانهای فراخوانی، هزینهی Call Overhead حذف شود.
قراردادهای DSL
Nimic قراردادهای سینتکسی خاصی را معرفی میکند که معنای آنها در زمان تبدیل تغییر میکند. برای مثال، استفاده از with let:، with var: یا with const: برای تعریف تعدیلکنندههای محدوده متغیر در Nim به کار میرود. دکوراتور @dispatch امکان چند-پاشش (Multi-dispatch) را از طریق یادداشتهای تایپی فراهم میکند و @distinct تایپهایی ایجاد میکند که تبدیل ضمنی ندارند.
سایر قراردادهای کلیدی شامل موارد زیر است:
- آرگومانهای تغییرپذیر: تعریف
def f(x: mut @ Vec3):در پایتون معادلvarدر Nim است. - مقداردهی: اپراتور
<<=برای تخصیص مقدار به متغیرهای تغییرپذیر (Mutable) استفاده میشود. - تکرار (Iteration): تابع
fields(obj)اجازه میدهد تا روی فیلدهای یک آبژه پیمایش کنید. - راهنمای کامپایلر: کاربران میتوانند از
comptime(expr)برای ارزیابی در زمان کامپایل و همچنین از{.pragma.}در Docstringها برای ارسال راهنماهایی مانندinlineیاborrowیاnoSideEffectبه کامپایلر Nim استفاده کنند.
این رویکرد، پیشفرضهای قدیمی درباره پایتون را به عنوان یک زبان «چسب» (Glue Language) میشکند. با فراهم کردن امکان عملیات روی آدرسهای حافظه و اشارهگرها، Nimic پایتون را به یک زبان برنامهنویسی سیستم نزدیک کرده است. در واقع، پایتون به عنوان یک رابط سطحبالا (Frontend) برای یک پسزمینه کامپایلی قدرتمند عمل میکند.
برای یک توسعهدهنده عملیاتی، این بدان معناست که میتوان یک الگوریتم پیچیده را ابتدا در پایتون پروتوتایپ کرد و سپس بدون بازنویسی کامل، آن را به سرعت تولیدی (Production-grade) رساند. این ابزار بهویژه برای کارهای سنگین محاسباتی مفید است؛ به طوری که پروژه در حال حاضر پیادهسازیهای موفقی مانند یک Raytracer و یک مبدل ppm-to-mp4 را در لیست دستاوردهای خود دارد.
گام بعدی شما
- مخزن گیتهاب Nimic را بررسی کرده و با تعریف ساختارهای ساده در ماژول
ntypesشروع کنید. - بخشهای گلوگاه (Bottleneck) کد خود را شناسایی کرده و آنها را با دکوراتور
@templateبهینهسازی نمایید. - قابلیتهای
comptimeرا برای کاهش بار محاسباتی زمان اجرا آزمایش کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو