دعم WebAssembly تجريبي في الإصدار 1.6.0.
| ما لديك | ما تستخدمه | النتيجة |
|---|---|---|
| أمر WASI | elide run app.wasm | يشغّل الوحدة مع استيرادات WASI Preview 1. |
| مكتبة WASM | واجهة WebAssembly أو استيراد وحدة ES من JS/TS | يكشف صادرات الوحدة. |
لتصريف 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
مُعطّلة افتراضيًا:
| المقترح | الخيار | ملاحظات |
|---|---|---|
| Memory64 | wasm.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) من الوحدة.