Skip to content

Node.js مع WebAssembly

WebAssembly هي لغة تشبه لغة التجميع عالية الأداء يمكن تجميعها من لغات متنوعة، بما في ذلك C/C++ وRust وAssemblyScript. وتدعمها حاليًا Chrome وFirefox وSafari وEdge وNode.js!

يحدد مواصفة WebAssembly شكلين للملفات، وهما: صيغة ثنائية تسمى وحدة WebAssembly مع امتداد .wasm، وصيغة نصية مقابلة تسمى صيغة نص WebAssembly مع امتداد .wat.

المفاهيم الرئيسية

  • الوحدة (Module): ملف ثنائي مُجمَّع من WebAssembly، أي ملف .wasm.
  • الذاكرة (Memory): ArrayBuffer قابل لإعادة التغيير بالحجم.
  • الجدول (Table): مصفوفة مُنَسَّقة قابلة لإعادة التغيير بالحجم من المراجع التي لا تُخزَّن في الذاكرة.
  • المثيل (Instance): تمثيل لوحدة مع ذاكرتها وجدولها ومتغيراتها.

لاستخدام WebAssembly، ستحتاج إلى ملف ثنائي .wasm ومجموعة من واجهات برمجة التطبيقات للتواصل مع WebAssembly. يوفر Node.js واجهات برمجة التطبيقات اللازمة عبر الكائن العام WebAssembly.

javascript
console.log(WebAssembly)
/*
Object [WebAssembly] {
  compile: [Function: compile],
  validate: [Function: validate],
  instantiate: [Function: instantiate]
}
*/

توليد وحدات WebAssembly

تتوفر طرق متعددة لإنشاء ملفات WebAssembly الثنائية، بما في ذلك:

  • كتابة WebAssembly (.wat) يدويًا وتحويلها إلى صيغة ثنائية باستخدام أدوات مثل wabt.
  • استخدام emscripten مع تطبيق C/C++.
  • استخدام wasm-pack مع تطبيق Rust.
  • استخدام AssemblyScript إذا كنت تفضل تجربة مشابهة لـTypeScript.

TIP

بعض هذه الأدوات لا تولد فقط الملف الثنائي، بل أيضًا رمز "الربط" بلغة JavaScript وملفات HTML المقابلة لتشغيلها في المتصفح.

كيفية استخدامه

بمجرد حصولك على وحدة WebAssembly، يمكنك استخدام كائن WebAssembly في Node.js لإنشاء مثيل لها.

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // توجد الدالة المصدرة ضمن instance.exports
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // الإخراج: 11
})

التفاعل مع نظام التشغيل

لا تستطيع وحدات WebAssembly الوصول مباشرةً إلى وظائف نظام التشغيل بمفردها. يمكن استخدام أداة خارجية Wasmtime للوصول إلى هذه الوظائف. يستخدم Wasmtime واجهة برمجة التطبيقات WASI للوصول إلى وظائف نظام التشغيل.

الموارد