Binaryen - مجموعة أدوات المترجم والمُحسِّن WebAssembly
Binaryen - مجموعة أدوات المترجم والمُحسِّن WebAssembly
Binaryen هي مكتبة بنية تحتية لمترجم وأداة لـ WebAssembly، مكتوبة بـ C++. أداتها الرئيسية، wasm-opt، تحمل وحدة wasm إلى تمثيل وسيط وتشغل تمريرات التحسين والتحويل — نفس الآلية التي تستخدمها سلاسل الأدوات مثل Emscripten لتقليل واستقرار wasm. بالنسبة لمهندسي الهندسة العكسية، مفكك شيفرة Binaryen (wasm-dis) وتمريرات التحليل/التحويل الخاصة به (بما في ذلك التبسيطات المساعدة في إلغاء الإخفاء) تجعلها ملحق مفيد لـ WABT.
التثبيت
| النظام الأساسي | الأمر |
|---|---|
| macOS (Homebrew) | brew install binaryen |
| Debian/Ubuntu | sudo apt install binaryen |
| Arch Linux | sudo pacman -S binaryen |
| npm | npm install -g binaryen (ربط JS) |
| من المصدر | بناء مع CMake من مستودع WebAssembly/binaryen |
| التحقق | wasm-opt --version |
الأدوات الأساسية
| الأداة | يفعل |
|---|---|
wasm-opt | تحميل وتحسين/تحويل وإعادة إرسال وحدة |
wasm-dis | فك التجميع .wasm → نص |
wasm-as | تجميع النص → .wasm |
wasm-metadce | حذف الكود الميت عبر الوحدة + JS |
wasm-ctor-eval | تقييم المنشئات في وقت البناء |
wasm-reduce | تقليل الوحدة مع الحفاظ على السلوك (تكرار الخلل) |
wasm-shell | تشغيل قذيفة اختبار المواصفات |
تحسين الوحدة
# تحسين للحجم والسرعة
wasm-opt -O3 module.wasm -o module.opt.wasm
# تحسين عدواني للحجم
wasm-opt -Oz module.wasm -o module.small.wasm
| العلم | التأثير |
|---|---|
-O / -O1..-O4 | تحسين متزايد للسرعة |
-Os | تحسين للحجم |
-Oz | تحسين عدواني للحجم |
--enable-FEATURE | تفعيل اقتراح wasm (simd, threads, …) |
-o FILE | ملف الإخراج |
تشغيل التمريرات الفردية
تعرض wasm-opt العديد من التمريرات المسماة التي يمكنك تشغيلها بشكل انتقائي — مفيد لـ HR (تبسيط الكود المخفي) وكذلك الإنشاءات.
# قائمة جميع التمريرات المتاحة
wasm-opt --help | grep -A2 "passes:"
# تشغيل تمريرات محددة (على سبيل المثال تبسيط + إزالة غير المستخدم)
wasm-opt module.wasm --precompute --simplify-locals \
--remove-unused-names --vacuum -o clean.wasm
| التمرير (أمثلة) | الغرض |
|---|---|
--precompute | ثني التعبيرات الثابتة |
--simplify-locals | تقليل استخدام المتغيرات المحلية الزائدة |
--vacuum | إزالة الكود الميت بوضوح |
--remove-unused-module-elements | تجريد الوظائف/العالمية غير المستخدمة |
--flatten / --rereloop | إعادة هيكلة تدفق التحكم |
فك التجميع / التجميع
# فك التجميع إلى نموذج نص Binaryen
wasm-dis module.wasm -o module.wat
# تجميع مرة أخرى
wasm-as module.wat -o module.wasm
استخدام HR: تبسيط ثم قراءة
خدعة عملية للهندسة العكسية هي تشغيل تمريرات التبسيط من Binaryen لتنظيف ضوضاء المترجم/محجوب ثم قراءة النتيجة.
# تبسيط وحدة معقدة ثم فك تجميع مع WABT
wasm-opt target.wasm --precompute --simplify-locals --vacuum -o simpler.wasm
wasm-decompile simpler.wasm -o simpler.dcmp
تقليل نسخة (wasm-reduce)
# تقليل الوحدة بينما لا تزال السيناريو تبلغ عن السلوك المهم
wasm-reduce big.wasm --command "node check.js" -o small.wasm
رائع لعزل الحد الأدنى من wasm الذي يؤدي إلى خلل أو سلوك معين.
Binaryen مقابل الأدوات ذات الصلة
| الأداة | التركيز |
|---|---|
| Binaryen | تحسين/تحويل/تحليل wasm (درجة المترجم) |
| WABT | تحويل/فحص/تحقق/فك تجميع |
| diswasm | مفكك شيفرة رمز زائف |
| wasm-tools | معالجة Rust منخفضة المستوى |
بالنسبة لـ HR: استخدم Binaryen لتبسيط، WABT/diswasm للقراءة، و wasm-tools للتحقق/الطفرة.