ويب أسمبلي

في الفترة الأخيرة، سمعنا كثيرًا عن ويب أسمبلي -أو (تجميع الويب) لو كنت تُحب التعريب- ولكن العديد من الأشخاص لا يعرف أي تفاصيل الموضوع عنها ما عدا الاسم وأنها تمكنك من تشغيل برمجيات غير مكتوبة بجافاسكربت على المتصفح، سأُحاول في هذا المقال تبسيط الموضوع ليتمكن أي شخص من مواكبة هذا التقدم الذي حصل في عالم الويب، وفي العالم البرمجي عمومًا.

ماهي ويب أسمبلي؟

نستطيع تعريف ويب أسمبلي بكل بساطة أنها شفرة بايت (byteCode)، وشفرة البايت تعني تعليمات مكتوبة بصيغة binary (شفرة ثنائية)، طبعًا معايير هذه الشفرة متاحة ومفتوحة المصدر لأي شخص.

رسم توضيحي لآلية عمل WebAssembly
رسم توضيحي لآلية عمل WebAssembly

وبشكل مبسط لتشغيل برمجيات ويب أسمبلي، فقط علينا فك تلك الشفرة ومن ثم تنفيذها، ويحدث ذلك عبر آلة أفتراضية تأخذ تعليمات ويب أسمبلي -والتي هي عبارة عن تعليمات مُكدسة stack-based- وتُفك شفرتها، ومن ثم تُحول إلى تعليمات يفهمها المعالج ويُنفذها...

كيف وصلنا إلى ويب أسمبلي؟

قبل ظهور ويب أسمبلي كانت هناك أفكار مُشابهة، لتمكين تنفيذ برمجيات مُعقدة أو غير مكتوبة بجافاسكربت، على المتصفحات.

كل من قوقل وموزيلا كانا يعملان على طرق لتمكين تشغيل أكواد لغات أخرى على المتصفح.

NaCl:

في 2011 قامت قوقل بالعمل على مشروع سمته Google Native Client اختصارًا NaCl، ويهدف المشروع إلى تمكين المُتصفح من تنفيذ أكواد أصلية Native Code في بيئة معزولة بشكل آمن، والهدف من ذلك الحصول على تطبيقات ويب مع أداء عالي، وتم إدراجه في متصفح قوقل كروم ومشروع كروميوم مفتوح المصدر، والهدف هو تحسين تجربة التطبيقات في نظام Chrome OS.

asm.js:

في 2013 قامت موزيلا، بالعمل على فكرة سمتها asm.js وهي جافاسكربت فعليًا، لكنها مُصممة لأن تكون مُولدة من لغات أخرى، أي أنك تقوم بكتابة كود بلغة C مثلًا، ومن ثم تقوم بترجمته إلى asm.js ملف جافاسكربت.

مثال كود مكتوب بلغة C:

int f(int i) {
  return i + 1;
}

عند ترجمته عبر asm.js سوف تحصل على كود جافاسكربت الآتي:

function f(i) {
  i = i | 0;
  return (i + 1) | 0;
}

لاحظ كود جافاسكربت المولد، يبدو شكله غريبًا؟ هناك |0، ماذا يعني هذا؟

حسنًا ببساطة جافاسكربت لا تحوي أنواع للأرقام، كل الأرقام في جافاسكربت تعامل على أنها تقريبًا من النوع float ولكن! لو قمت بعمل 5|0 مثلًا، هذا سيعطي تلميحًا لمُترجم جافاسكربت أن هذا العدد هو من نوع integer، وهذا يجعل الكود يعمل بشكل أسرع ربما ليس أسرع بفارق كبير وملحوظ، لكن يبقى أسرع.

كان يهدف مشروع asm.js إلى تمكين برمجيات المكتوبة عبر C و C++ أو أي لغة تستخدم LLVM IR بأن يتم ترجمتها إلى كود جافاسكربت asm.js، الذي يولد أكواد جافاسكربت مُحسنة ومُراعية للأداء والسرعة.

كل من المشروعين NaCl و asm.js توقفا، وبدأ العمل على مشروع جديد يدعى WebAssembly في بدايات 2017.

ويب أسمبلي، المستقبل!

مؤخرًا ضجت مواقع التواصل الاجتماعي عند الإعلان عن py-script وهو مشروع يهدف إلى تمكين تشغيل أكواد بايثون على المتصفح.

كيف فعلوا ذلك؟ الجواب، WebAssembly.

يُمكنك أعتبار أن ويب أسمبلي عبارة عن حاسوب صغير يجري عمليات حاسوبية، لذلك فعليًا تستطيع فعل أي شيء باستخدامه.

وما فعله الفريق القائم خلف py-script أنهم ببساطة أخذوا نسخة من مُترجم بايثون يدعى Pyodide يعمل عبر ويب أسمبلي.

أجروا تحسينات عليه، ليصبح مجرد Tag <py-script> قابل للاستخدام بسهولة.

فكرة ويب أسمبلي مشابهة لفكرة JVM (Java Virtual Machine) إلى حد ما، وما يفعله فريق WebAssembly الآن هو التركيز على تحسين هذه الفكرة، وجعلها آمنة، محمولة، وسريعة، وهنا تأتي قصة WASI.

ماهو WASI؟

يبدو من الوهلة الأولى أن "ويب أسمبلي" سوف تعمل فقط على المتصفح... لكن لماذا لا نشغل ويب أسمبلي على الأجهزة أيضًا بدون الحاجة للمتصفح؟

فعليًا هذا ما يعمل عليه مشروع WebAssembly System Interface وذلك بجعل WebAssembly تعمل خارج المتصفح، على الأجهزة، مراكز البيانات، السيرفرات، أجهزة أنترنت الأشياء، وأكثر!

تغريدة مُبتكر دوكر
تغريدة مُبتكر دوكر

وفي تغريدة لمبتكر دوكر "سولومون هيكس" غرد فيها قائلًا: "لو أن ويب أسمبلي و واجهة نظام ويب أسمبلي كانتا موجدتين في 2008، ما كُنا بحاجة إلى ابتكار دوكر، لهذا هي مُهمة، ويب أسمبلي على السيرفرات سيكون هو المستقبل للحوسبة، نظام مُعايرة لواجهة النظام هو الشيء الذي كنا نفتقده، آمل أن WASI سيقوم بالمهمة!"

حتى الآن عشرات اللغات تدعم أن تُترجم إلى ويب أسمبلي، وأبرز هذه اللغات هي Rust و C/ C++ و Go وغيرها الكثير التي تدعم أن تُترجم إلى ويب أسمبلي.

وهناك حاليًا عشارات الجهات التي تستخدم ويب أسمبلي في جهة السرفر، أبرزها شركة Fastly و Cloudflare ومؤخرًا Shopify.

يقودنا هذا إلى مشروع WASM Component Model.

ماهي فكرة WebAssembly Component Model؟

تهدف فكرة "نموذج مُكونات ويب أسمبلي" إلى مُعايرة طرق لإنشاء ملفات ويب أسمبلي قابلة لإعادة الاستخدام.

تخيل أن هناك مكتبة مُعينة تقوم بوظيفة ما... وأردت استخدامها، لكنك لا تستطيع لأنها مكتوبة بلغة برمجية مختلفة عن اللغة التي تعمل أنت بها... مع فكرة "مكونات ويب أسمبلي" تستطيع أخذ تلك المكتبة واستخدامها مع أي لغة برمجة وتستطيع حتى دمج عدة مكتبات أخرى معها... وهنا تكن أهمية الفكرة.

webassembly