هذا الاختيار ليس تفضيلاً للواجهة. تقارن هذه المقالة بين وقتي التشغيل حول ما تم التحقق منه فعليًا، والحوكمة، والمترجمين، ومعيار WASI، ونموذج الأمان، ثم تقدم تفاصيل تنفيذ Wasmtime الذي تديره Aurabase في الإنتاج، وقياس الوقود، وانقطاع العصر، وحدود الذاكرة، دون توفير رقم بداية باردة غير مُقاس.
الأساسيات
- Wasmtime: مشروع Bytecode Alliance، مكتوب بلغة Rust، ومترجم إنتاج Cranelift، وترخيص Apache-2.0 مع استثناء LLVM.
- Wasmer: وقت التشغيل تم تطويره بواسطة Wasmer Inc.، وثلاثة مترجمات قابلة للتبديل (Singlepass، وCranelift، LLVM)، وترخيص MIT.
- تعلن Aurabase أن
wasmtime = { version = "43", features = ["async", "cranelift"] }هي تبعية إنتاج فعلية فيaura-functions، وتم التحقق منها فيCargo.toml. - يطبق وضع WASM الأصلي بشكل افتراضي حدًا أقصى للذاكرة يبلغ 64 ميجابايت، وميزانية وقود تبلغ مليار وحدة ومهلة مدتها 10 ثوانٍ، وكلها ثلاثة قابلة للتعديل حسب متغير البيئة.
- يتواجد وضع WASM هذا مع الوضع الافتراضي لوظائف Aurabase Edge (وقت تشغيل Deno): وهو مسار تنفيذ ثانٍ، وليس المسار الافتراضي.
وقتا تشغيل، نفس قاعدة WebAssembly
قام WebAssembly منذ فترة طويلة بتعيين تنسيق وقت التشغيل للمتصفح. لعدة سنوات، تم استخدامه أيضًا لتنفيذ تعليمات برمجية معزولة على جانب الخادم أو على الحافة: رمز ثانوي تم تجميعه مرة واحدة، ويمكن حمله على أي جهاز مضيف، معزولًا افتراضيًا بدون حاوية أو جهاز افتراضي كامل. يحمل Wasmtime وWasmer هذا الامتداد خارج المتصفح، وكلاهما مكتوب بلغة Rust، وكلاهما قادر على تنفيذ نفس الملف .wasm.
Wasmtime هو مشروع يستضيفه Bytecode Alliance، وهي المنظمة التي تدير العديد من مكونات النظام البيئي لخادم WebAssembly، بما في ذلك مترجم Cranelift. تم تطوير Wasmer بواسطة شركة Wasmer، وهي شركة تنشر وقت التشغيل كمصدر مفتوح بينما تقوم بتسويق الخدمات التكميلية من حوله (النشر على الحافة، والأدوات). نموذجان مختلفان للحوكمة، ولا يوجد حكم على جودة الكود الذي ينتجه أحدهما أو الآخر.
يقارن الجزء المتبقي من هذه المقالة أربعة مجالات يمكن التحقق منها، الترخيص والحوكمة، والمترجمين المتاحين، ومعيار WASI ونموذج المكون، ونموذج الأمان، ثم يشرح، مع التعليمات البرمجية الداعمة، سبب تشغيل نواة Rust الخاصة بـ Aurabase Wasmtime في محرك Edge Functions.
مؤسسة متعددة البائعين مقابل الناشر التجاري
تم إصدار Wasmtime بموجب ترخيص Apache-2.0 مع استثناء LLVM، وهو ترخيص متساهل شائع في النظام البيئي للمترجم. تتبع إدارتها نموذج Bytecode Alliance: حيث تساهم العديد من المنظمات في المشروع، ولا تمتلكه أي منها بمفردها.
يتم نشر Wasmer بموجب ترخيص معهد ماساتشوستس للتكنولوجيا (MIT)، وهو أكثر تساهلاً على الورق، لكن توجيهه الفني يظل مركزًا في ناشر واحد، شركة Wasmer Inc. وهذا ليس خطأ في حد ذاته: العديد من المشاريع الناجحة مفتوحة المصدر تتبع هذا النموذج. إنه ببساطة ملف تعريف مختلف للمخاطر إذا كانت مؤسستك تقدر الحوكمة الموزعة عبر كيانات متعددة.
واجهة خلفية واحدة مقابل ثلاثة: Cranelift، وSinglepass، وLLVM
يتم تجميع Wasmtime في الإنتاج عبر Cranelift، وهو منشئ الأكواد أيضًا من Bytecode Alliance. يوثق الصندوق أيضًا مترجمًا إضافيًا، Winch، مصمم لتقليل وقت الترجمة مقارنةً بـ Cranelift في الحالات الحساسة لبدء التشغيل. Cargo.toml لـوظائف الهالة تقوم فقط بتنشيط ميزة cranelift: هذا المترجم، وهو وحده، هو الذي يعالج كل وحدة WASM تم تحميلها في الإنتاج.
يأخذ واسمر المسار المعاكس: ثلاث واجهات خلفية قابلة للتبديل. يتم تجميع Singlepass في مسار واحد، على الفور تقريبًا، على حساب كود الآلة الأقل تحسينًا. تقدم Cranelift حلاً وسطًا متوازنًا. تهدف LLVM إلى تحقيق أفضل إنتاجية تنفيذ ممكنة، مع أطول وقت تجميع من بين الثلاثة. وقت تشغيل واحد، وثلاثة ملفات تعريف تسوية تم اختيارها أثناء التكوين.
معاينة WASI 2 ونموذج المكون
تعمل WASI، واجهة نظام WebAssembly، على توحيد الوصول إلى الملفات والساعات والشبكة من وحدة WASM، دون الاعتماد على المتصفح. أحدث إصدار لها، WASI Preview 2، يعتمد على نموذج المكون: آلية لتأليف وحدات مكتوبة بلغات مختلفة، مع واجهات مكتوبة مشتركة بدلاً من تنسيق ثنائي خاص بكل وقت تشغيل. يعمل كل من Wasmtime وWasmer على تنفيذ هذا المعيار، كل حسب سرعته الخاصة.
بالإضافة إلى ذلك، يقوم Wasmer بتوثيق WASIX، وهو امتداد يهدف إلى تغطية عناصر POSIX الأولية التي لا يغطيها معيار WASI الرسمي بعد، مثل الخيوط أو مآخذ الشبكة الأكثر شمولاً. هذا ليس معيارًا مدعومًا من قبل مجموعة عمل WebAssembly، ولكنه امتداد خاص بنظام Wasmer البيئي.
وضع wasm الأصلي لـ Aurabase، والذي تم التحقق منه في wasm/mod.rs، لا يستخدم حاليًا WASI Preview 2 ولا نموذج المكون. هذا هو الحد الأدنى من ABI للمضيف المحلي، وأربع وظائف مكشوفة لوحدة الضيف، وليس المعيار الكامل. لا يقوم Cargo.toml أيضًا بتنشيط ميزة wasi على الصندوق wasmtime.
عزل الذاكرة وتوقيتها: الوقود، العصر، الحدود
يعمل كلا وقتي التشغيل على عزل كل وحدة في ذاكرتها الخطية الخاصة، مع عدم وجود وصول مباشر إلى النظام المضيف خارج الوظائف المستوردة بشكل صريح. هذا هو أساس نموذج الأمان WebAssembly، المشترك بين كلا المشروعين.
يكشف Wasmtime أيضًا عن واجهة برمجة تطبيقات لقطات التنفيذ الأصلية، fuel: تستهلك كل تعليمات ميزانية محددة مسبقًا، ويتوقف التنفيذ بشكل صحيح بمجرد استنفاد هذه الميزانية. تسمح لك واجهة برمجة التطبيقات الثانية، وهي مقاطعة epoch، بفرض مهلة دون حظر المحرك أثناء الانتظار. يوثق واسمر آليات القياس الخاصة به وحدود الذاكرة لكل حالة؛ لم تقم هذه المقالة بالتحقق منها في مستودع جهة خارجية، لذلك لا تقوم بتقسيمها رقمًا تلو الآخر.
هذا هو بالضبط ما تتيحه خدمة aura-functions الخاصة بـ Aurabase، وهو ما سيتم تفصيله في القسم التالي مع كود المصدر الفعلي.
تم التحقق من رمز Wasmtime، وليس تفضيلًا معلنًا
تعلن خدمة aura-functions عن wasmtime باعتبارها تبعية إنتاج، بدون تعليقات إلغاء التنشيط أو تكوين تبعية التطوير. لا يوجد ملف في المستودع، لا ملف Cargo.toml ولا ملف .rs، يذكر Wasmer.
يقوم رمز التهيئة بشكل صريح بتنشيط الوقود والمقاطعة حسب العصر، ثم يحد الذاكرة عن طريق الاستدعاء باستخدام StoreLimits:
جميع الحدود الثلاثة قابلة للتكوين لكل متغير بيئة، مع تحديد القيم الافتراضية في config/mod.rs: WASM_MAX_MEMORY_MB عند 64، WASM_TIMEOUT_SECS عند 10، WASM_MAX_FUEL عند مليار وحدة. يتم تشغيل المهلة في الخلفية: ينتظر tokio::spawn المدة التي تم تكوينها ثم يزيد عصر المحرك، دون حظر التنفيذ الحالي أثناء الانتظار.
تظل واجهة ABI المعرضة لوحدات الضيف في حدها الأدنى عمدًا: أربع وظائف مضيفة، aura.logو aura.get_inputو aura.set_output و aura.get_env، مسجلة عبر linker.func_wrap. إنه ليس نموذج المكون، ولا WASI Preview 2: إنه عقد داخلي، أضيق، مصمم للاستخدام الفردي، تنفيذ وظيفة حافة HTTP واستعادة استجابة JSON الخاصة به.
يعد وضع wasm هذا اختيارًا لكل وظيفة، وليس تبديلًا عامًا. نظرة عامة على بنية Aurabase توضح تفاصيل المسار الآخر، الوضع الافتراضي deno، الذي ينفذ JavaScript/TypeScript في خدمة منفصلة. كلاهما يتواجدان في نفس خدمة aura-functions.
ما تم التحقق منه هنا هو تطبيق Wasmtime الفعلي وحدود موارده الافتراضية. لم يتم ذكر أرقام البداية الباردة: راجع تحليلنا المخصص للبداية الباردة لـ WebAssembly للتعرف على ما يمكن قياسه وما لم يتم قياسه بعد.
واسمتايم وفاسمر، جنبًا إلى جنب
| الحكم | تحالف Bytecode، متعدد المنظمات | شركة Wasmer، ناشر تجاري |
|---|---|---|
| الترخيص | أباتشي-2.0 مع استثناء LLVM | معهد ماساتشوستس للتكنولوجيا |
| لغة التنفيذ | الصدأ | الصدأ |
| المجمعين | رافعة الرافعة (الرافعة اختيارية، غير مفعلة في Aurabase) | Singlepass، Cranelift، LLVM من اختيارك |
| معيار واسي | WASI Preview 2 + نموذج المكون | WASI Preview 2 + WASIX (امتداد خاص بـ Wasmer) |
| لقطات الجري | الوقود + المقاطعة حسب العصر (واجهة برمجة التطبيقات الأصلية التي تم التحقق منها) | الآليات الخاصة بـ Wasmer، لم يتم التحقق منها هنا |
| تستخدم من قبل Aurabase | نعم، وظائف الهالة، الإصدار 43 مثبت | لا، لا تبعية، مباشرة أو متعدية |
المصادر: Cargo.toml وwasm/mod.rs من مستودع Aurabase، تم التحقق منها مباشرة في 24 أغسطس 2026. خصائص Wasmtime وWasmer العامة مأخوذة من الوثائق العامة لكل مشروع؛ لا يتم إعادة نشر أي أرقام مرجعية لطرف ثالث في هذا الجدول.
من يجب أن يختار ماذا
تبدأ فترة تشغيل جديدة، بدون أي تبعيات موجودة. Wasmtime، بدعم من مؤسسة متعددة البائعين، يقلل من مخاطر الاعتماد على ناشر واحد لمستقبل المشروع.
لديك نوبات برد متكررة جدًا وقصيرة الأمد. تستجيب الواجهة الخلفية Singlepass الخاصة بـ Wasmer بشكل مباشر لهذه الحاجة، وتجميع فوري تقريبًا، على حساب كود الآلة الأقل تحسينًا.
أنت بحاجة إلى عناصر POSIX الأولية التي تتجاوز معيار WASI الحالي. WASIX، امتداد Wasmer، يغطي الخيوط والمآخذ الممتدة التي لم تغطيها WASI Preview 2 وحدها بعد.
أنت تريد واجهة برمجة تطبيقات أصلية للقطات والمهلة، بدون برامج وسيطة تابعة لجهات خارجية. يكشف Wasmtime fuel وepoch مباشرة في الصندوق، وهو بالضبط ما يتيحه aura-functions في Aurabase.