سلاسل WebAssembly جاهزة للتجربة في Chrome 70

تم توفير التوافق مع سلاسل WebAssembly في Chrome 70 بموجب مرحلة التجربة والتقييم.

Alex Danilo

تتيح خدمة WebAssembly (Wasm) تجميع التعليمات البرمجية المكتوبة بلغة C++ وغيرها لغة واحدة لتشغيلها على الويب. من الميزات المفيدة جدًا للتطبيقات الأصلية هي إمكانية استخدام مؤشرات الترابط، وهي عنصر أساسي للحساب المتوازي. معظم C وسيكون مطورو C++ على دراية pthreads واجهة برمجة تطبيقات موحَّدة لإدارة سلاسل المحادثات في أحد التطبيقات.

عملت مجموعة WebAssembly المجتمعية على توفير سلاسل المحادثات على الويب لتفعيل التطبيقات المتعدّدة سلاسل المحادثات الحقيقية. وفي إطار هذه الجهود، نفذ V8 الدعم اللازم في محرك WebAssembly، وهي متاحة من خلال تجربة المصدر: مراحل التجربة والتقييم السماح للمطوّرين بتجربة ميزات الويب الجديدة قبل إطلاقها موحدة. يتيح لنا ذلك جمع ملاحظات من المطوّرين الذين يجرّبون الميزات الجديدة، ما يُعدّ أمرًا مهمًا للتحقّق من صحة الميزات الجديدة وتحسينها.

يتيح الإصدار 70 من Chrome استخدام سلاسل المهام لـ WebAssembly، ونشجّع المطوّرين المهتمين على بدء استخدامها وإرسال ملاحظاتهم إلينا.

سلاسل المحادثات؟ ماذا عن العمال؟

عملت المتصفّحات على دعم التوازي من خلال "مشغّلي الويب" منذ عام 2012 في الإصدار Chrome 4. بوصة في الواقع، من الطبيعي سماع عبارات مثل "في سلسلة المحادثات الرئيسية" وما إلى ذلك. ومع ذلك، لا يشارك العاملون البيانات القابلة للتغيير فيما بينهم، بل يعتمدون على تمرير الرسائل للاتصال. في الواقع، يخصّص Chrome محرك V8 جديدًا لكلّ منها (يُعرف باسم "الوحدات المنعزلة"). لا تشارك العناصر المعزولة أي تعليمات برمجية مجمعة أو لذا، لا يمكنها مشاركة البيانات القابلة للتغيّر مثل pthreads.

من ناحية أخرى، سلاسل WebAssembly هي سلاسل يمكنها مشاركة ذاكرة Wasm نفسها. يتم تنفيذ مساحة التخزين الأساسية للذاكرة المشتركة من خلال SharedArrayBuffer, قاعدة JavaScript أساسية تسمح بمشاركة محتوى ArrayBuffer واحد بالتزامن بين العاملين. يتم تشغيل كلّ سلسلة محادثات WebAssembly في Web Worker، ولكن تسمح لهم ذاكرة Wasm المشتركة بالعمل بشكلٍ مشابه لما يحدث على منصات الأصلية. وهذا يعني أنّ التطبيقات التي تستخدم سلاسل Wasm هي عن إدارة الوصول إلى الذكريات المشتركة كما هو الحال في أي تطبيق متسلسل. توجد العديد من مكتبات التعليمات البرمجية الموجودة مكتوبة بلغة C أو C++ التي تستخدم pthreads ويمكن تجميعها إلى Wasm وتنفيذها في true يتيح وضع سلاسل البيانات لمزيد من النوى العمل على البيانات نفسها في آنٍ واحد.

مثال بسيط

في ما يلي مثال على برنامج C بسيط يستخدم مؤشرات الترابط.

#include <pthread.h>
#include <stdio.h>

// Calculate Fibonacci numbers shared function
int fibonacci(int iterations) {
    int     val = 1;
    int     last = 0;

    if (iterations == 0) {
        return 0;
    }
    for (int i = 1; i < iterations; i++) {
        int     seq;

        seq = val + last;
        last = val;
        val = seq;
    }
    return val;
}
// Start function for the background thread
void *bg_func(void *arg) {
    int     *iter = (void *)arg;

    *iter = fibonacci(*iter);
    return arg;
}
// Foreground thread and main entry point
int main(int argc, char *argv[]) {
    int         fg_val = 54;
    int         bg_val = 42;
    pthread_t   bg_thread;

    // Create the background thread
    if (pthread_create(&bg_thread, NULL, bg_func, &bg_val)) {
        perror("Thread create failed");
        return 1;
    }
    // Calculate on the foreground thread
    fg_val = fibonacci(fg_val);
    // Wait for background thread to finish
    if (pthread_join(bg_thread, NULL)) {
        perror("Thread join failed");
        return 2;
    }
    // Show the result from background and foreground threads
    printf("Fib(42) is %d, Fib(6 * 9) is %d\n", bg_val, fg_val);

    return 0;
}

يبدأ هذا الرمز بالدالة main() التي تشير إلى الرقم 2. المتغيرين fg_val bg_val هناك أيضًا دالة تُسمى fibonacci()، والتي سيتم استدعاؤها من خلال كل من المهام في هذا المثال. تنشئ دالة main() سلسلة مهام في الخلفية باستخدام pthread_create() مهمتها هي احتساب قيمة تسلسل أرقام فيبوناتشي المقابلة لقيمة المتغيّر bg_val. في غضون ذلك، دالة main() قيد التشغيل في سلسلة المحادثات التي تعمل في المقدّمة تحسبه للمتغير fg_val. بمجرد اكتملت عملية إعداد سلسلة محادثات الخلفية، تمت طباعة النتائج.

تجميع التطبيق لتضمين ميزة سلاسل المحادثات

أولاً، يجب تثبيت حزمة emscripten SDK ، ويُفضّل استخدام الإصدار 1.38.11 أو إصدار أحدث. لإنشاء مثال التعليمة البرمجية باستخدام تم تفعيل سلاسل المحادثات لتشغيله في المتصفح، نحتاج إلى تمرير بضع علامات إضافية إلى المحول البرمجي لـ emscripten emcc. إنّ سطر الأوامر يبدو كما يلي:

emcc -O2 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -o test.js test.c

تعمل وسيطة سطر الأوامر "-s USE_PTHREADS=1" على تفعيل ميزة توفُّر مؤشرات الترابط ل وحدة WebAssembly المجمّعة، بينما تُطلِب وسيطة "-s PTHREAD_POOL_SIZE=2" من المُجمِّع إنشاء مجموعة من مؤشّرتي ترابط.

عندما يتم تشغيل البرنامج، يتم تحميل وحدة WebAssembly ضمن الخيارات المتقدمة. إنشاء Web Worker لكل سلسلة من سلاسل التعليمات في مجموعة سلاسل المحادثات، ومشاركة الوحدة النمطية مع كل عامل من العاملين، تكون في هذه الحالة 2، ويتم استخدام هذه القيم عند تم إجراء مكالمة إلى pthread_create(). ينشئ كل عامل مثيلًا لوحدة Wasm باستخدام الذاكرة نفسها، ما يسمح لهم بالتعاون. تشترك أحدث تغييرات V8 في الإصدار 7.0 مع الرمز الأصلي المجمّع لوحدات Wasm التي يتم تمريرها بين العوامل، ما يسمح حتى للتطبيقات الكبيرة جدًا بالتوسع إلى العديد من العوامل. يُرجى العلم أنّه من المنطقي التأكّد من أنّ حجم مجموعة مؤشرات الترابط يساوي الحد الأقصى لعدد مؤشرات الترابط التي يحتاجها تطبيقك، وإلا قد يتعذّر إنشاء مؤشر الترابط. في الوقت نفسه، إذا كان حجم مجموعة مؤشرات الترابط كبيرًا جدًا، سيتم إنشاء Web Workers غير ضرورية لن تؤدي أيّ مهمة سوى استخدام الذاكرة.

كيفية تجربة الميزة

إنّ أسرع طريقة لاختبار وحدة WebAssembly هي تفعيل ميزة الإصدار التجريبي من خيوط WebAssembly في Chrome 70 والإصدارات الأحدث. انتقِل إلى عنوان URL about://flags في المتصفّح كما هو موضّح أدناه:

صفحة علامات Chrome

بعد ذلك، ابحث عن إعداد سلاسل مهام WebAssembly التجريبية التي تبدو على النحو التالي:

إعداد سلاسل محادثات WebAssembly

غيِّر الإعداد إلى مفعّل كما هو موضّح أدناه، ثم أعِد تشغيل المتصفح.

تم تفعيل إعداد سلاسل محادثات WebAssembly

بعد إعادة تشغيل المتصفّح، يمكننا محاولة تحميل ملف WebAssembly المكوّن من سلاسل محادثات باستخدام صفحة HTML بسيطة تحتوي على هذا المحتوى فقط:

<!DOCTYPE html>
<html>
  <title>Threads test</title>
  <body>
    <script src="test.js"></script>
  </body>
</html>

لتجربة هذه الصفحة، ستحتاج إلى تشغيل أحد أشكال خادم الويب وتحميله من المتصفح. سيؤدي ذلك إلى تحميل وحدة WebAssembly وتشغيلها. مقدّمة وتعرض لنا أدوات مطوري البرامج ناتجًا عن عملية التشغيل، ومن المفترض أن يظهر لك شيء مثل إخراج الصورة أدناه في وحدة التحكم:

نتائج وحدة التحكم من برنامج فيبوناتشي

تم تنفيذ برنامج WebAssembly الذي يتضمّن سلاسل المحادثات بنجاح. نحن نشجع لتجربة تطبيقك الذي يتضمّن سلاسل محادثات باتّباع الخطوات الموضّحة أعلاه.

إجراء الاختبارات على أرض الواقع من خلال مرحلة التجربة والتقييم

إنّ تجربة سلاسل المحادثات من خلال تفعيل علامات الإصدار التجريبي في المتصفّح أمر جيد لأغراض التطوير، ولكن إذا أردت اختبار تطبيقك في الميدان، يمكنك إجراء ذلك من خلال ما يُعرف باسم الإصدار التجريبي من المصدر.

تتيح لك تجارب الإصدارات العلنية الأولى تجربة الميزات التجريبية مع المستخدمين من خلال الحصول على رمز اختبار مرتبط بنطاقك. يمكنك بعد ذلك نشر تطبيقك والتوقع أن يعمل في متصفّح يمكنه إتاحة الميزة التي تختبرها (في هذا الحالة، الإصدار 70 من Chrome فصاعدًا). للحصول على رمزك المميّز لإجراء تجربة مستخدم أصيل، استخدِم نموذج الطلب المتاح هنا.

استضفنا المثال البسيط أعلاه باستخدام رمز مميز للإصدار التجريبي من المصدر، حتى تتمكّن من تجربته بنفسك بدون الحاجة إلى إنشاء أيّ محتوى.

إذا كنت تريد معرفة ما يمكن أن تُحقّقه 4 سلاسل محادثات تعمل بشكل موازٍ للفن ASCII، عليك أولاً التمعن في العرض التوضيحي هذا.

أرسل لنا تعليقاتك

خيوط WebAssembly هي عناصر أساسية جديدة ومفيدة للغاية لنقل التطبيقات إلى الويب. أصبح من الممكن الآن تشغيل تطبيقات C وC++ و المكتبات التي تتطلّب إتاحة pthreads في بيئة WebAssembly.

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