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

تم شحن دعم سلاسل محادثات WebAssembly إلى الإصدار 70 من Chrome ضِمن مرحلة التجربة والتقييم.

Alex Danilo

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

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

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

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

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

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

مثال بسيط

فيما يلي مثال على برنامج '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() التي تُعلن عن متغيرين fg_val وbg_val. هناك أيضًا دالة تُسمى fibonacci()، سيتم استدعاؤها من خلال كل من السلسلة في هذا المثال. تُنشئ الدالة main() سلسلة في الخلفية باستخدام دالة pthread_create() التي تكمن مهمتها في حساب قيمة تسلسل أرقام فيبوناتشي المقابلة لقيمة المتغيّر bg_val. في الوقت نفسه، تحتسب الدالة main() التي تعمل في سلسلة التعليمات التي تعمل في المقدّمة للمتغير fg_val. بمجرد اكتمال تشغيل سلسلة الخلفية، تتم طباعة النتائج.

التجميع للحصول على دعم سلاسل المحادثات

أولاً، يجب تثبيت حزمة تطوير البرامج (SDK) الخاصة بـ emscripten، ويُفضَّل أن تكون الإصدار 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' برنامج التجميع بإنشاء مجموعة من سلسلتين (2).

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

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

أسرع طريقة لاختبار وحدة 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.