عن المشروع
هذا المستودع هو دليل شامل وعملي لتقليل حجم الملفات الثنائية في Rust. يعترف بأن التحسين الافتراضي في Rust يستهدف سرعة التنفيذ وراحة التصحيح، لكنه يوفر مسارًا واضحًا خطوة بخطوة للمطورين الذين يحتاجون إلى ملفات تنفيذية أصغر.
يبدأ الدليل بالتقنيات الأساسية التي لا تؤثر على سلوك البرنامج:
- البناء في وضع الإصدار (release mode)، الذي يمكن أن يقلل حجم الملف الثنائي بنسبة 30% أو أكثر مقارنة بإصدارات التصحيح.
- إزالة الرموز تلقائيًا من الملفات الثنائية باستخدام إعداد Cargo `strip = true` (متاح منذ Rust 1.59)، أو تشغيل `strip` يدويًا على ملف ELF للإصدارات الأقدم.
- تعيين `opt-level = "z"` في `Cargo.toml` للتحسين من أجل الحجم بدلاً من السرعة، مع ملاحظة أن `"s"` قد يعطي نتائج أصغر أحيانًا ويوصى بالتجربة.
- تمكين تحسين وقت الربط (LTO) للسماح للمربط بإزالة الكود الميت والتحسين عبر وحدات الترجمة.
- تقليل `codegen-units` إلى 1 لتمكين تحسينات أكثر عدوانية على حساب وقت الترجمة.
ثم ينتقل الدليل إلى تقنيات أكثر تقدمًا قد تغير سلوك البرنامج أو تتطلب Rust الليلي (nightly):
- استخدام `panic = "abort"` لإزالة كود التراجع (unwinding)، والأعلام غير المستقرة `-Zlocation-detail=none` و `-Zfmt-debug=none` لإزالة تفاصيل الموقع والتنسيق.
- بناء المكتبة القياسية من المصدر باستخدام `build-std`، مما يسمح بتحسين `libstd` من أجل الحجم وإزالة الأجزاء غير المستخدمة. يتضمن ذلك ميزة `optimize_for_size` والخيار غير المستقر `panic=immediate-abort` لإزالة سلاسل الذعر (panic strings).
- إزالة `libstd` بالكامل باستخدام `#![no_std]` و `#![no_main]`، مع نقطة دخول C وإدارة يدوية لـ stdio. يوصف هذا بأنه معقد وغير قابل للنقل، ويتطلب تحليلًا دقيقًا للتبعيات، لكنه يمكن أن ينتج ملفات ثنائية صغيرة مثل برامج C.
يغطي الدليل أيضًا:
- استخدام UPX لضغط الملف الثنائي النهائي، مع تحذير بشأن احتمالية نتائج إيجابية كاذبة من برامج مكافحة الفيروسات.
- أدوات لتحليل وتقليل حجم الملف الثنائي، مثل `cargo-bloat`، `momo`، و Twiggy لـ WebAssembly.
- تقنيات تقليل حجم صور الحاويات، بما في ذلك صورة `rust:alpine`، و `dive` لاستكشاف الصور، و `distroless` لصور أساسية minimale.
- روابط لموارد خارجية، بما في ذلك منشورات مدونة حول الملفات الثنائية الصغيرة في Rust، تقليل حجم WASM، ومجموعة عمل حجم الملفات الثنائية في Rust.
- ملاحظات تاريخية حول إزالة jemalloc في Rust 1.32 وكيفية التعامل مع الإصدارات الأقدم.
يتم توفير مشاريع مثال في مجلدي `build_std` و `no_std`، ويشير الدليل إلى دراسات حالة حقيقية مثل خادم ويب Rocket صغير وإضافة GStreamer. يؤكد أن التقنيات تراكمية، حيث توفر كل خطوة تقليلًا إضافيًا في الحجم على حساب التعقيد أو القابلية للنقل.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.