انتقل إلى المحتوى

WebAssembly مع Elide

شغّل وحدات أوامر WASI باستخدام Elide، واربط مجلدات المضيف، وحمّل مكتبات WebAssembly من JavaScript و TypeScript، وتحقّق من المقترحات المدعومة.

في هذه الصفحة

دعم WebAssembly تجريبي في الإصدار 1.6.0.

ما لديكما تستخدمهالنتيجة
أمر WASIelide run app.wasmيشغّل الوحدة مع استيرادات WASI Preview 1.
مكتبة WASMواجهة WebAssembly أو استيراد وحدة ES من ⁦JS/TS⁩يكشف صادرات الوحدة.
0:11 / 0:11

لتصريف Java أو Kotlin إلى WebAssembly، راجع WebImage؛ يحتاج ناتجه إلى محمّل JavaScript الخاص به، لا إلى elide run. أدلة حسب البيئة المستهدفة: ⁦Browser WASM⁩ و ⁦Edge WASM⁩.

تشغيل ملف WASM

elide run app.wasm
elide app.wasm
elide run app.wasm -- first second   # program arguments
elide run --timeout=5s app.wasm      # exit 124 after 5 seconds

يستدعي Elide الدالة المُصدَّرة _start، أو _main إن لم تكن _start موجودة. حمّل من JavaScript الوحدة التي لا تحتوي على أيٍّ منهما.

السلوكالقيمة
الوسيط صفرالمسار المطلق للوحدة.
حالة الخروجتحددها proc_exit في WASI، لا القيمة التي تعيدها الدالة.
الأعطال (traps) والملفات الثنائية التالفةحالة خروج غير صفرية.
--timeoutيشمل إنشاء المثيل والتنفيذ؛ ويخرج بالرمز 124.

نقاط دخول المشروع

عيّن الوحدة نقطةَ دخول في elide.pkl، ثم شغّل elide run:

amends "elide:project.pkl"
name = "wasm-app"
entrypoint { "app.wasm" }

راجع إعداد المشروع.

WASI

تحصل الأوامر على استيرادات WASI Preview 1 ضمن wasi_snapshot_preview1: التدفقات القياسية، والوسائط، وحالة الخروج، وعمليات نظام الملفات. ولا تحصل المكتبات المحمّلة من JavaScript على WASI.

الوصول إلى المجلدات

لا ترى أوامر WASI أي مجلد على المضيف حتى تربط واحدًا:

elide -Xpolyglot.wasm.WasiMapDirs=work::./data run app.wasm

يربط هذا ./data بمجلد الضيف work. افصل بين عمليات الربط بفواصل: work::./data,output::./results.

يظل العزل مطبّقًا. يحتاج فتح الملفات عبر WASI إلى إذن القراءة والكتابة، حتى للقراءة:

elide -Xpolyglot.wasm.WasiMapDirs=work::./data run \
  --sandbox --allow-read=./data --allow-write=./data app.wasm

راجع العزل والحدود.

التشغيل البيني مع JavaScript و TypeScript

لا تحتاج واجهة WebAssembly العامة إلى أي خيار:

import { readFile } from "node:fs/promises";

const bytes = await readFile(new URL("./math.wasm", import.meta.url));
const { instance } = await WebAssembly.instantiate(bytes, {});
console.log(instance.exports.add(20, 22));

لا تشغّل الوحدات المحمّلة من JavaScript الدالة _start أو _main. يوفّر الوسيط الثاني استيرادات الوحدة:

const imports = { env: { log: (value) => console.log(value) } };
const { instance } = await WebAssembly.instantiate(bytes, imports);

تتضمن الواجهة validate و compile و Module و Instance و Memory و Table و Global، وفحص الاستيرادات والصادرات. ويمكن إنشاء أكثر من مثيل من Module مُصرَّف واحد. وتخضع قراءة الملفات للأذونات المعتادة.

استيراد وحدات ES

import { add } from "./math.wasm";
console.log(add(20, 22));
const math = await import("./math.wasm");
console.log(math.add(20, 22));

يمكن أن تكون المحددات مسارات، أو عناوين file:، أو صادرات حزم تُحَلّ إلى .wasm. ويعيد الاستيراد في مرحلة المصدر (source phase) الوحدةَ المُصرَّفة لتنشئ مثيلها بنفسك:

import source mathModule from "./math.wasm";
const math = await WebAssembly.instantiate(mathModule, {});
console.log(math.exports.add(20, 22));

مقترحات WebAssembly المدعومة

مفعّلة افتراضيًا، للأوامر وللتشغيل البيني مع ⁦JS/TS:⁩

  • المتغيرات العامة القابلة للتعديل وعمليات توسيع الإشارة
  • تحويل الأعداد العشرية إلى صحيحة دون أعطال
  • النتائج المتعددة للدوال والكتل
  • عمليات الذاكرة المجمّعة وأنواع المراجع
  • الذواكر المتعددة
  • التعابير الثابتة الموسّعة
  • معالجة الاستثناءات
  • مراجع الدوال المُنمَّطة
  • الأنواع المُدارة بجمع المهملات (WasmGC)
  • استدعاءات الذيل
  • تعليمات SIMD ذات العرض الثابت (v128) و relaxed SIMD، إلا عند تثبيت Python

مُعطّلة افتراضيًا:

المقترحالخيارملاحظات
Memory64wasm.Memory64يتطلب أيضًا wasm.UseUnsafeMemory.
الخيوط والعمليات الذريةwasm.Threadsلا تتوفر واجهة مضيف WASI لإنشاء الخيوط.
حساب الأعداد الصحيحة العريضةwasm.WideArithmeticمنفصل عن حساب i64 العادي.
معالجة الاستثناءات القديمةwasm.LegacyExceptionsمقترح معالجة الاستثناءات الأحدث مفعّل افتراضيًا.

فعّل أحدها باستخدام -Xpolyglot.<option>=true، مثل -Xpolyglot.wasm.WideArithmetic=true. ولا يوفّر هذا استيرادات المضيف التي تحتاجها الوحدة.

الحدود

  • الوحدات الثنائية فقط. لا .wat، ولا تصريف لشيفرة C أو Rust، ولا REPL لـ WASM.
  • لا يُدعم إلا WASI Preview 1. لا WASI Preview 2، ولا نموذج المكوّنات، ولا node:wasi؛ ولا وصول عام إلى الشبكة.
  • استيرادات المضيف. لا يوفّر elide run سوى WASI، دون واجهات المتصفح أو شيفرة الربط الخاصة بـ Emscripten.
  • تعليمات SIMD مع Python. عند تثبيت Python تُرفض وحدات SIMD. استخدم تثبيتًا دون Python أو نسخة عددية (scalar) من الوحدة.

أمثلة

هل كانت هذه الصفحة مفيدة؟