پرش به محتوای اصلی
پرش به محتوای مقاله

زبان برنامه‌نویسی Red با پیوند استاتیک توزیع تک‌فایلی نرم‌افزار را ممکن کرد

·۱۰ تیر ۱۴۰۵۷ دقیقه مطالعه
پشتیبانی از پیونددهی ایستا
پشتیبانی از پیونددهی ایستا
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

پیاده‌سازی یک پیوندگر استاتیک کامل برای C در زنجیره ابزار Red که توزیع تک-فایلی را ممکن می‌کند و نکته کلیدی آن، توسعه لایه‌های پیچیده کامپایلر توسط عامل‌های AI است.

تصور کنید یک فایل اجرایی تکه تکه و مستقل با حجم کمتر از ۵۰ کیلوبایت داشته باشید که نه به نصب‌کننده (Installer) جداگانه نیاز دارد و نه به تنظیم متغیرهای محیطی سیستم (Environment Variables) احتیاج دارد. طبق اعلام تیم توسعه در ۳۰ ژوئن ۲۰۲۶، این موضوع در زبان Red با پشتیبانی از پیوند استاتیک (Static Linking) به واقعیت تبدیل شد. این قابلیت اجازه می‌دهد تا تمامی وابستگی‌ها مستقیماً در داخل فایل اجرایی بسته‌بندی شوند.

سال‌ها بود که Red/System عمدتاً بر پیوند پویا (Dynamic Linking) تکیه می‌کرد؛ حالتی که در آن برنامه در زمان اجرا به دنبال فایل‌های .dll در ویندوز یا .so در لینوکس می‌گردد. این وضعیت اغلب منجر به ایجاد «جهنم وابستگی‌ها» (Dependency Hell) می‌شد، جایی که توسعه‌دهندگان مجبور بودند کتابخانه‌های مورد نیاز را در کنار کدهای خود ارسال کنند تا برنامه اجرا شود. با انتقال به پیوند استاتیک — که شبیه به چسباندن تمام قطعات لازم یک ماشین در یک بسته است تا در هر جایی بدون ابزار اضافی کار کند — این اصطکاک کاملاً حذف شده است. اکنون یک برنامه می‌تواند به عنوان یک فایل تک‌جزئی (Lone File) روی هر سیستم سازگار اجرا شود.

همان‌طور که در تحلیل‌های قبلی ما درباره‌ی ابزارهای توسعه‌ی مدرن اشاره کردیم، این پیشرفت در زمان چرخش گسترده به سمت مهندسی نرم‌افزار مبتنی بر هوش مصنوعی رخ داده است. تیم Red صراحتاً ذکر کرد که این سازوکار با کمک گسترده مدل‌های پیشرو و محیط‌های محلی، به‌ویژه Claude Code و Codex ساخته شده است. این رویکرد با دیدگاه‌هایی همسو است که دسترسی مستقیم APIها را برای افزایش سرعت مهندسی کد حیاتی می‌دانند. این موضوع تایید می‌کند که در عصر تسلط عامل‌ها (Agents) که دنیا را در نوردیده‌اند، زبان Red با تکامل برای همکاری بهتر با این دستیاران هوشمند، جایگاه و ارتباط خود را با دنیای مدرن حفظ می‌کند. در همین راستا، تحول در نحوه تعامل این عامل‌ها، مانند جایگزینی بروکرها با سیستم فایل برای مدیریت ناوگان هوش مصنوعی، چشم‌انداز جدیدی از سازماندهی ابزارهای توسعه را ترسیم می‌کند.

سازوکار لایه‌ی پیوند استاتیک

به نقل از مستندات red-lang.org، این قابلیت یک ترفند ساده برای کنار هم قرار دادن بایت‌ها (Byte-concatenation) نیست، بلکه یک پیوندگر استاتیک کامل با ویژگی‌های پیشرفته است. این ابزار اکنون چندین عملیات پیچیده را به‌صورت دستی انجام می‌دهد: خواندن فرمت‌های شیء (Object Format) مختص هر پلتفرم، استخراج تنها بخش‌های ضروری، ادغام بخش‌های تکراری، حل نمادهای سیستمی و اصلاح جابه‌جایی‌ها (Patch Relocations).

به‌طور مشخص، زنجیره ابزار (Toolchain) این فرآیندهای زیر را اجرا می‌کند:

  • بارگذاری گزینشی آرشیو (Selective Archive Loading): یک آرشیو می‌تواند شامل صدها فایل شیء باشد. پیوندگر تنها اعضایی را استخراج می‌کند که نمادی (Symbol) را حل کنند که قبلاً به آن ارجاع شده است و سپس این زنجیره وابستگی را تا انتهای آن دنبال می‌کند. در نتیجه، پیوند دادن به یک فایل .lib بزرگ، منجر به حجیم شدن غیرضروری فایل اجرایی نهایی نمی‌شود.
  • ادغام COMDAT و نمادهای ضعیف (Weak-Symbol Folding): در زبان‌های C و C++ مدرن (به‌ویژه با استفاده از inline)، اغلب یک نمونه‌سازی قالب (Template Instantiation)، تابع درون‌خطی یا vtable در هر واحد ترجمه (Translation Unit) منتشر می‌شود. پیوندگر این گروه‌ها را ردیابی کرده و نسخه‌های تکراری را به همراه جابه‌جایی‌هایی که به آن‌ها اشاره می‌کردند، ادغام کرده و تنها یک نسخه را نگه می‌دارد.
  • پشتیبانی کامل از جابه‌جایی (Full Relocation Support): این ابزار جابه‌جایی‌های پیچیده و مختص هر فرمت را مدیریت می‌کند. این مورد شامل «Immediateهای تقسیم‌شده» در ARM Thumb-2 و تعاملات BL/BLX مورد نیاز برای رزبری‌پای (Raspberry Pi)، و همچنین جابه‌جایی‌های «تفاضل بخش پراکنده» (Scattered Section-Difference) در Mach-O است که توسط جداول سوییچ بهینه شده تولید می‌شوند.
  • حل نمادهای سیستمی (System Symbol Resolution): ارجاعات به libc و libSystem و همچنین مجموعه‌ای داخلی از توابع ذاتی کامپایلر (مانند Stack Probes و تقسیم ۶۴ بیتی) به‌طور خودکار حل می‌شوند. این امر باعث می‌شود برنامه‌ها بدون نیاز به حمل کل محیط زمان اجرای C (C Runtime)، پیوند داده شوند.

در واقع این ابزار دقیقاً مانند link.exe در ویندوز، ld در لینوکس و ld64 در مک عمل می‌کند، اما برای زیرمجموعه‌ای از نیازهای خاص که توسط Red/System لازم است، بهینه شده است.

نحوه پیاده‌سازی پیوند استاتیک

توسعه‌دهندگان اکنون می‌توانند با استفاده از یک پرچم (Flag) ساده در خط فرمان، بین پیوند پویا و استاتیک جابجا شوند. برای نمایش این فرآیند، از کتابخانه miniz استفاده شده است؛ یک کتابخانه کوچک با مجوز MIT که APIهای zlib و deflate را پیاده‌سازی می‌کند.

از آنجا که Red/System در حال حاضر کد ۳۲ بیتی تولید می‌کند، فایل شیء مورد نظر نیز باید ۳۲ بیتی باشد. برای دستیابی به این هدف در ویندوز با استفاده از MSVC، تیم توسعه توصیه می‌کند برخی ویژگی‌های اضافی کامپایلر که به کمک‌های زمان اجرای غیرضروری ارجاع می‌دهند (مانند Stack Canaries یا جداول استثنای C++) را غیرفعال کنید. این کار با دستور زیر انجام می‌شود:
cl /c /MT /GS- /EHs-c- /GR- miniz.c lib /out:miniz.lib miniz.obj

پس از کامپایل، زنجیره ابزار بر اساس قراردادهای نام‌گذاری، واردات (Import) را مدیریت می‌کند:

  • واردات بدون پسوند (Extension-less Imports): یک دستور واردات مانند #import [ "miniz" cdecl [...] ] انعطاف‌پذیر است. به‌طور پیش‌فرض، miniz به کتابخانه مشترک پلتفرم (مثلاً miniz.dll در ویندوز یا libminiz.so در لینوکس) حل می‌شود. در این حالت، اجرای دستور red -r demo.reds منجر به پیوند پویا می‌گردد.
  • سوئیچ استاتیک (The Static Switch): افزودن پرچم -s (یا --static)، به صورت red -r -s demo.reds به ابزار می‌گوید که همان نام miniz را به کتابخانه استاتیک (miniz.lib) متصل کند. با این کار، توابع mz_compress و mz_uncompress مستقیماً در فایل اجرایی «پخته» و ادغام می‌شوند.
  • جایگزینی صریح (Explicit Overrides): برای کنترل دقیق‌تر، توسعه‌دهندگان می‌توانند پسوند فایل را به‌طور کامل بنویسند. این کار باعث می‌شود پرچم -s برای آن کتابخانه خاص نادیده گرفته شود. برای مثال، #import ["user32.dll" stdcall [...]] همیشه پویا باقی می‌ماند، در حالی که #import ["miniz.lib" cdecl [...]] (در ویندوز) یا #import ["libminiz.a" cdecl [...]] (در لینوکس/مک) همیشه استاتیک خواهد بود.

این سازگاری با نسخه‌های قبلی تضمین می‌کند که کدهای موجود که از پسوندهای .dll یا .so استفاده می‌کنند، بدون تغییر به کار خود ادامه دهند.

اعتبارسنجی واقعی: CherryTracker

برای اثبات پایداری و کارایی این زنجیره ابزار، تیم توسعه پروژه CherryTracker را منتشر کرد؛ یک پخش‌کننده موسیقی به سبک Soundtracker (مد پلیر). این پروژه به عنوان یک معیار (Benchmark) هم برای پیوندگر جدید و هم برای ارزیابی توانایی‌های عامل‌های کدنویسی AI عمل می‌کند. سازنده پروژه اشاره کرد که اگرچه رسیدن به یک نسخه صیقل‌خورده نیاز به ده‌ها تکرار (Iteration) با عامل AI و سپس بررسی‌های دستی برای بهبود استایل و کیفیت کد داشت، اما نتیجه نهایی یک ابزار کاملاً عملیاتی است.

برنامه CherryTracker از یک رابط کاربری مبتنی بر Draw استفاده می‌کند و برای پردازش سریع داده‌ها، از یک لایه Red/System بهره می‌برد. این برنامه به دو کتابخانه کلیدی در پس‌زمینه متکی است:

  • libxmp: برای رمزگشایی فرمت‌های مختلف آهنگ‌های mod (که نسخه‌های متنوعی از ModArchive در دسترس هستند).
  • SDL3: برای تامین لایه صوتی برنامه.

پشتیبانی از پیوند ایستا

این کتابخانه‌ها در پوشه libs پروژه به صورت نسخه‌های استاتیک ۳۲ بیتی ارائه شده‌اند و کد واردات آن‌ها از گزینه بدون پسوند استفاده می‌کند: #import ["libs/libxmp" cdecl [...]] و #import ["libs/SDL3" cdecl [...]].

گردش‌کار توسعه و ادغام با AI

توسعه CherryTracker یک گردش‌کار تکرارپذیر و بسیار بهینه را نشان می‌دهد که توسط زنجیره ابزار جدید ممکن شده است. در یک مخزن (Repository) محلی که شامل هر دو نسخه مشترک (Shared) و استاتیک از کتابخانه‌های خارجی بود، توسعه‌دهنده از دو حالت مختلف استفاده کرد:

  • حالت توسعه (Dev Mode): استفاده از مود کامپایل -c و کتابخانه‌های مشترک به کاربر و عامل AI اجازه داد تا نسخه‌های جدید را برای تست از طریق libRedRT بسیار سریع بازکامپایل کنند.
  • حالت انتشار (Release Mode): برای نسخه‌های نهایی، کاربر با استفاده از -r -s به پیوند استاتیک سوئیچ کرد تا فایل توزیع نهایی و مستقل را تولید کند.

این رویکرد ترکیبی (Hybrid) در طول چندین هفته توسعه در زمان‌های অবসর، ساده و کارآمد بود. فایل اجرایی نهایی ویندوز با یک گواهی امضای کد شخصی (Personal Code Signing Certificate) امضا شده است و سورس‌کد آن در گیت‌هاب در دسترس است.

پلتفرم‌های مورد پشتیبانی

قابلیت پیوند استاتیک در تمامی اهداف بومی (Native Targets) اصلی سازگار است و فرمت‌های شیء زیر را پشتیبانی می‌کند:

  • ویندوز (x86): اشیاء و کتابخانه‌های COFF (.obj / .lib)
  • لینوکس (x86): اشیاء و آرشیوهای ELF (.o / .a)
  • لینوکس ARM (از جمله رزبری‌پای): پشتیبانی از ELF ARM، شامل هر دو نوع کد ARM و Thumb-2
  • مک (Intel): اشیاء و آرشیوهای Mach-O

کامپایل متقاطع (Cross-compilation) همچنان به‌طور کامل فعال است. یک توسعه‌دهنده می‌تواند دستور -t RPi -s را روی دسکتاپ خود اجرا کند تا یک باینری مستقل ARM تولید کند که آماده استقرار فوری روی یک رزبری‌پای باشد.

تحلیل: حرکت به سمت نرم‌افزارهای «بدون نصب»

این به‌روزرسانی، پیش‌فرض‌های توزیع نرم‌افزار را برای توسعه‌دهندگان Red تغییر می‌دهد. با تبدیل پیوندگر استاتیک به یک «شهروند درجه اول»، Red خود را برای عصر «ابزارهای قابل حمل» (Portable Tools) آماده می‌کند؛ جایی که سربارِ داشتن یک نصب‌کننده به عنوان یک نقطه ضعف و محدودیت دیده می‌شود. همان‌طور که زمانی ارسطو اوناسیس درباره دریانوردی در بادهای شدید گفته بود، Red نیز در حال یادگیری هدایت در تغییرات پرتلاطم چشم‌انداز کدنویسی است.

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

علاوه بر این، پذیرش اینکه این ابزار با کمک Claude Code و Codex ساخته شده، سیگنالی از تغییر در نحوه نگهداری زنجیره‌های ابزار زبان‌های برنامه‌نویسی است. پیچیدگی نوشتن یک پیوندگر — که باید با ظرافت‌ها و جزئیات COFF، ELF و Mach-O سازگار باشد — پیش‌تر یک مانع ورود بسیار بزرگ بود که اکنون عامل‌های AI این مانع را پایین آورده‌اند.

البته هنوز مواردی در نقشه راه (Roadmap) آینده باقی است. تیم توسعه اشاره کرد که پشتیبانی کامل از Runtime زبان C++، شامل RTTI (اطلاعات نوع زمان اجرا)، استثناها (Exceptions) و کتابخانه استاندارد std:: به دلیل پیچیدگی بسیار بیشتر، به عنوان یک «سوراخ خرگوش عمیق‌تر» برای توسعه‌های آتی برنامه‌ریزی شده است. به همین ترتیب، پیوند افزایشی (Incremental Linking) و انتقال اطلاعات عیب‌یابی (Debug-information Passthrough) نیز در برنامه‌های آینده هستند. در حال حاضر، استفاده از APIهای ساده C (شامل APIهای C که توسط کتابخانه‌های C++ ارائه می‌شوند) مسیر توصیه‌شده است.

اگر شما در حال ساخت ابزارهایی برای پلتفرم‌های مختلف هستید یا با کدهای تولید شده توسط AI آزمایش می‌کنید، اکنون می‌توانید این باینری‌ها را در گیت‌هاب تست کرده یا ادغام miniz را در پروژه‌های Red خود بررسی کنید.

گام بعدی شما

  • اگر ابزار متقاطع می‌سازید، قابلیت -t RPi -s را برای تولید باینری‌های بدون پیش‌نیاز در رزبری‌پای تست کنید.
  • برای کاهش حجم توزیع نرم‌افزار، کتابخانه‌های کمکی را به حالت -s ببرید و فقط APIهای سیستمی را پویا نگه دارید.
  • بررسی کنید آیا پروژه‌های فعلی شما با استفاده از miniz می‌توانند بدون نیاز به نصب zlib توزیع شوند؟

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

با تکیه بر تخصص در مدیریت حافظه و لینکرهای بومی، Red هزینه توزیع نرم‌افزار را به شدت کاهش داد. این تغییر باعث می‌شود ابزارهای کوچک سیستمی بدون وابستگی به محیط‌های پیچیده اجرا شوند و اعتماد کاربر به پایداری ابزار افزایش یابد.

تأثیر برای ایران

برنامه‌نویسان ایرانی که در حوزه‌ی سیستم‌های نهفته (Embedded) یا ابزارهای سبک برای لینوکس و رزبری‌پای فعالیت می‌کنند، اکنون مسیری ساده‌تر برای توزیع نرم‌افزار بدون نیاز به نصب پیش‌نیازهای دشوار دارند.

·نگاه ما
تحریریه دات‌هوش

این تحول در Red نشان می‌دهد که پیچیدگی‌های سطح پایین سیستم (مثل نوشتن Linker) دیگر سدی برای زبان‌های کوچک نیستند وقتی عامل‌های AI نقش معمار را ایفا کنند. در واقع، ما شاهد گذار از «زبان‌های جامع» به «زبان‌های چابک» هستیم که تخصصشان در توزیع سریع و بدون دردسر است. این رویکرد می‌تواند استانداردهای توزیع نرم‌افزارهای تخصصی را به سمت فایل‌های تک-مراحل (Single-binary) ببرد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.