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
.
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 لإنشاء مثيل لها.
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 للوصول إلى وظائف نظام التشغيل.