Utilia

مفكك WebAssembly (تحويل WASM إلى WAT)

حوّل ملف ‎.wasm الثنائي إلى نص WAT مقروء، وتحقق من صلاحيته واعرض أقسامه واستيراداته وتصديراته ودواله، في متصفحك دون تشغيل الوحدة.

تُقرأ الوحدة وتُحوَّل إلى نص فقط: لا تُترجم ولا تُنشأ منها نسخة ولا تُشغَّل أبدًا.

كيف تحوّل WASM إلى WAT؟

  1. أفلت ملف .wasm في منطقة الإفلات، أو انقرها لاختيار ملف (حتى 20 MB). ويمكنك أيضًا الضغط على تحميل وحدة مثال لرؤية عرض توضيحي صغير.
  2. تفحص الأداة الملف الثنائي وتتحقق من صلاحيته وتعرض النتيجة: ✓ الوحدة صالحة. أو سبب عدم صلاحيتها.
  3. اقرأ العدّادات: الدوال (المستوردة والمعرّفة)، والاستيرادات، والتصديرات، والأنواع، والذواكر، والجداول، والمتغيرات العامة.
  4. اقرأ نتيجة التفكيك في صيغة WebAssembly النصية (WAT)، ثم انسخها أو اضغط تنزيل ‎.wat.
  5. عدّل المخرجات بالخيارات: استخدام الأسماء من قسم name، وتعابير مطوية (S-expressions)، وتضمين التصديرات داخل الدوال.
  6. افتح جداول الأقسام والاستيرادات والتصديرات لمعرفة بنية الملف: كل قسم مع إزاحته بالبايت وحجمه وعدد مدخلاته.

لا تُترجم الوحدة ولا تُنشأ منها نسخة ولا تُشغَّل أبدًا. تكتفي الأداة بقراءة بايتاتها وتحويلها إلى نص، لذا يمكنك فحص ملف لا تثق به بأمان.

ماذا تُظهر مخرجات WAT؟

لـ WebAssembly صيغتان متكافئتان: الصيغة الثنائية المدمجة .wasm التي تحمّلها المتصفحات وبيئات التشغيل، والصيغة النصية .wat المخصصة للبشر. يطبع المفكك كل أجزاء الوحدة على شكل نص: أنواع الدوال، والاستيرادات، وأجسام الدوال، والجداول، والذواكر، والمتغيرات العامة، والتصديرات، ودالة البدء، ومقاطع العناصر، ومقاطع البيانات.

افتراضيًا تُسرد التعليمات تعليمةً في كل سطر بترتيب المكدس، كما هي مخزّنة:

(func $add (param $a i32) (param $b i32) (result i32)
  local.get $a
  local.get $b
  i32.add)

ومع تعابير مطوية (S-expressions) تتداخل المعاملات داخل التعليمة التي تستخدمها، مثل (i32.add (local.get $a) (local.get $b))، وهو ما يكون غالبًا أسهل في المتابعة. أما تضمين التصديرات داخل الدوال فيكتب (export "add") داخل الدالة بدلًا من قائمة منفصلة.

الأسماء ومعلومات التصحيح والتحقق من الصلاحية

يشير ملف .wasm إلى كل شيء بالفهرس. فإذا احتفظ المترجم بالقسم المخصص name (وهو شائع في نسخ التصحيح)، يُظهر خيار استخدام الأسماء من قسم name الأسماء الأصلية مثل $factorial. وإلا تولّد wabt أسماء مثل $f2 أو $t0 كي يبقى النص مقروءًا. وكثيرًا ما تُجرَّد نسخ الإنتاج من الأسماء، لذا لن تُظهر الوحدة المصغّرة إلا أسماء مولّدة.

يتبع التحقق من الصلاحية مواصفة WebAssembly: يجب أن تتطابق الأنواع على مكدس المعاملات، وأن تكون الفهارس موجودة، وغير ذلك. والوحدة غير الصالحة تُفكَّك رغم ذلك ما دامت بنيتها قابلة للقراءة، مع عرض خطأ التحقق بجانبها، وهو ما يساعد عند تصحيح مترجم أو ملف ثنائي مكتوب يدويًا. وميزات ما بعد MVP مثل SIMD والخيوط (threads) والذاكرة المجمّعة (bulk memory) وأنواع المراجع والقيم المتعددة (multi-value) والاستدعاءات الذيلية ومعالجة الاستثناءات وmemory64 وجمع النفايات (GC) مفعّلة للقراءة.

تستخدم هذه الأداة wabt.js، وهي نسخة JavaScript من مجموعة WebAssembly Binary Toolkit ‏(wasm2wat)، ولا تُحمَّل إلا عندما تفتح ملفًا.

الأسئلة الشائعة

هل يمكنني استعادة الشيفرة المصدرية الأصلية بلغة C أو C++ أو Rust؟

لا. WAT صيغة مقروءة للملف الثنائي المترجَم، وليست أداة لإعادة الترجمة العكسية: فالشيفرة المصدرية والتعليقات ومعظم معلومات الأنواع تضيع بعد الترجمة. ولا تبقى أسماء الدوال إلا إذا حُفظ قسم name.

هل يُرفع ملفي؟

لا. يُقرأ الملف ويُفكَّك في متصفحك، ولا يُرسل أي شيء إلى خادم.

لماذا تقول الأداة إن الملف ليس ملف WebAssembly ثنائيًا؟

تبدأ كل وحدة بالبايتات الأربعة \0asm يليها الإصدار 1. أي ملف بمحتوى مختلف، أو مضغوط بـ gzip أو Brotli، أو مكوّن WebAssembly (نموذج المكونات الأحدث) سيُرفض.

لماذا يظهر مربع النص مقطوعًا؟

قد تنتج الوحدات الكبيرة جدًا ملايين الأسطر. يعرض مربع النص الجزء الأول فقط كي تبقى الصفحة سريعة الاستجابة، بينما يحفظ تنزيل ‎.wat النص كاملًا.

هل يمكنني تشغيل الوحدة أو اختبارها هنا؟

لا. الوحدة لا تُنشأ منها نسخة عمدًا، فلا يمكن لشيفرتها أن تعمل في الصفحة. لاختبارها، حمّلها في مشروعك الخاص أو في بيئة تشغيل مثل wasmtime أو Node.js.