سبب نقل تطبيق "جداول بيانات Google" عامل العمليات الحسابية من JavaScript إلى WasmGC

"جداول بيانات Google" هي أحد أوائل منتجات Google التي تستخدم WasmGC على Chrome. تم الإعلان عن هذه الخطوة في عام 2022، وتعاونت فِرق "جداول بيانات Google" وChrome في مجال التوحيد والهندسة والأدوات لتقديم ملاحظات في الوقت الفعلي حول التحسينات. وقد شكّلت هذه الشراكة سابقة لكيفية عمل فِرق المهندسين في Google بفعالية مع Chrome لتشغيل المزيد من تطبيقات Google على WasmGC.

التحدّي: JavaScript

تم إنشاء محرّك الحساب في "جداول بيانات Google" في الأصل باستخدام لغة Java وتم إطلاقه في عام 2006. في الأيام الأولى من إطلاق المنتج، كانت جميع العمليات الحسابية تتم على الخادم. ومع ذلك، منذ عام 2013، تم تشغيل المحرّك في المتصفّح باستخدام JavaScript. وقد تمّ ذلك في الأصل من خلال Google Web Toolkit ‏ (GWT)، ثمّ من خلال أداة تحويل Java إلى JavaScript من Closure ‏ (J2CL). يتم تشغيل محرّك العمليات الحسابية في JavaScript في Web Worker ويتواصل مع السلسلة الرئيسية باستخدام MessageChannel.

كان نقل بيانات المستخدمين من الخادم إلى إصدار JavaScript من محرّك الحساب (ومن GWT إلى J2CL لاحقًا) مهمة كبيرة تطلبت التحقّق بعناية من صحتها. لضمان أن ينتج محرّك العمليات الحسابية في JavaScript النتائج نفسها تمامًا مثل إصدار Java، طوّر فريق "جداول بيانات Google" آلية التحقّق الداخلية. يمكن لهذه الآلية معالجة مجموعة كبيرة من أوراق البيانات والتحقّق من تطابق النتائج بين إصدارات متعدّدة من محرّك الحساب. يستخدم فريق "جداول بيانات Google" هذه الأداة بانتظام للتحقّق من التغييرات في "جداول بيانات Google". ولم يقتصر عمل الفريق على مقارنة نتائج هذه العمليات الحسابية، بل قارَن أيضًا الأداء بين JavaScript على العميل وJava على الخادم. وتبيّن لهم أنّ إصدار JavaScript من محرّك الحساب كان أبطأ بأكثر من ثلاث مرات من إصدار Java.

لماذا تكون لغة JavaScript أبطأ من Java؟

إنّ لغة JavaScript سريعة بالنسبة إلى لغتها الديناميكية ذات الأنواع غير المحدّدة. أدّى الاستثمار الكبير في برامج الترجمة الفورية (JIT) (مثل Maglev وSparkplug وTurbofan) على مدار آخر 15 عامًا إلى تحسين أداء JavaScript. ومع ذلك، فإنّ أنواع JavaScript غير المحدّدة وسلوكها الديناميكي يجعلان من الصعب على برامج التجميع أثناء التشغيل إنشاء رمز مثالي. وهذا يعني أنّ JavaScript لا تزال متأخرة عن لغات مثل Java وC++ من حيث معدل نقل البيانات الخام. تضيف TypeScript أمانًا في النوع إلى JavaScript، ولكن تم تصميم معلومات النوع هذه لتسهيل عملية التطوير، وليس لتقديم أنواع الضمانات التي يحتاجها المُجمِّعون لإنشاء رمز برمجي مثالي. في حالات مثل "جداول بيانات Google"، حيث يمكن أن تستغرق جداول البيانات الكبيرة عشرات الثواني لاحتساب العمليات الحسابية، تكون JavaScript سريعة، ولكن ليس بالسرعة الكافية.

الحل: WasmGC

WasmGC هي إضافة إلى مواصفات WebAssembly الحالية التي تضيف العناصر الأساسية اللازمة لتجميع اللغات التي يتم جمع المهملات فيها (مثل Java). على سبيل المثال، يضيف WasmGC تعليمات لتحديد الأنواع وتخصيص هياكل البيانات التي يتم جمعها. من المخطّط أن تُجري WasmGC في لغات جمع المهملات ما فعلته Wasm في C++ (مثل Photoshop أو Google Earth)، أي إتاحتها على الويب بسرعة تقارب السرعة الأصلية. في Google، نعتقد أنّ WasmGC يمكن أن يكون أكثر تأثيرًا من Wasm بسبب رواج لغات جمع المهملات.

شركاء Google Workspace مع Chrome

تم نشر مسودة مواصفات WasmGC MVP في عام 2019. في أواخر عام 2020، عقدت Google Workspace وChrome شراكة لتقييم WasmGC باستخدام محرّك الحساب في "جداول بيانات Google". يمتلك فريق الأنظمة المتعددة في Workspace خبرة كبيرة في إنشاء المُجمِّعات والمحوِّلات وتحسينها. تم تحديد "جداول بيانات Google"، وهي جزء من Workspace، كتطبيق مثالي لتقييم WasmGC: فهو حساس للأداء ويحتوي على آليات قوية للتحقّق من الأداء وصحة البيانات. يضمّ Chrome فريق V8 لإنشاء وقت تشغيل WasmGC وتحسينه، بالإضافة إلى المساهمين في Binaryen لإنشاء تحسينات مسبقة (AOT). بين Chrome وWorkspace، تتوفّر كل الخبرة اللازمة لإنشاء سلسلة أدوات WasmGC وتحسينها، مع استخدام "جداول بيانات Google" كأداة اختبار مثالية.

النموذج الأوّلي

بحلول منتصف عام 2021، تمكّنت الفِرق من استخدام مُجمِّع Java إلى WasmGC. وفي أواخر العام نفسه، كان لديهم نسخة نموذجية من "جداول بيانات Google" تعمل كتطبيق WasmGC وإجراء العمليات الحسابية. وواجهت هذه الشركات العديد من التحديات على طول الطريق. لم تكن هناك أدوات لإنشاء الملفات الشخصية وأخذ نُسخ من الذاكرة، وكان لا بد من إنشائها. كان التنفيذ الحالي يعتمد على العديد من مكتبات JavaScript التي كان يجب العثور على بدائل لها أو كتابتها لـ WasmGC. لقد استغرق التحقّق من صحة محرك حساب Wasm وقتًا طويلاً بسبب الطبيعة التجريبية للمواصفات والمجمِّع والمكتبات الجديدة. ولكن كانت آليات التحقّق في "جداول بيانات Google" مفيدة للغاية مرة أخرى. نجحت الفِرق في النهاية في حلّ جميع المشاكل، وبدأت بيانات الأداء في الظهور في أوائل عام 2022.

تحسينات إضافية

أظهر الإصدار الأول من Sheets Wasm أداءً أبطأ بمقدار مرتين تقريبًا من JavaScript في العمليات الحسابية. ومع ذلك، هذه نتيجة جيدة لمواصفة جديدة ومجمّع جديد والعديد من المكتبات الجديدة. من هذه النقطة، بدأ فريق "جداول بيانات Google" في إجراء التحسينات. من بين التحسينات التي عثر عليها الفريق، ظهرت بضع فئات:

  • تكرار التحسينات الأساسية التي كانت متوفّرة في Java Virtual Machine (JVM) وV8
  • استخدام واجهات برمجة تطبيقات المتصفّح المحسّنة للغاية
  • إزالة أنماط الترميز الخاصة بلغة JavaScript

أولاً، احتاج فريق "جداول بيانات Google" إلى تكرار التحسينات المتوفّرة حاليًا في سلاسل الأدوات الأخرى. وأفضل مثال على ذلك هو تحسين إرسال الطريقة الافتراضية، الذي تم تحسينه منذ فترة طويلة من خلال JVM وV8، ولكن لم يكن هناك أي تحسينات على WasmGC. أدّى تنفيذ الاستبدال التوقّعي وإلغاء المحاكاة، وهما عمليتان شائعتان جدًا لتحسين الأداء، إلى تسريع وقت الحساب بنسبة% 40 تقريبًا في Chrome.

ثانيًا، هناك حالات يتم فيها دعم واجهات برمجة تطبيقات المتصفّح من خلال عمليات تنفيذ أصلية محسّنة يصعب منافستها باستخدام Wasm. وسلسلة الأحرف والتعبيرات العادية مثالان جيدان على ذلك. وعلى وجه التحديد، باستخدام التعبيرات العادية، سجّل الفريق تسريعًا في عمليات التعبيرات العادية بمقدار 100 مرة تقريبًا عند التبديل من re2j (المجمَّعة إلى WasmGC) إلى واجهة برمجة التطبيقات RegExp للمتصفّح في Chrome، والتي يمكنها تجميع كل تعبير عادي إلى رمز الآلة الخاص به.

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

النتيجة النهائية

بعد كل هذه التحسينات، يحقّق الإصدار النهائي من WasmGC في "جداول بيانات Google" أداءً حسابيًا أسرع بمرتين تقريبًا من JavaScript، ما يمثّل تحسُّنًا بمقدار أربعة أضعاف مقارنةً بنقطة البداية في الإصدار الأول من WasmGC.

الخاتمة

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

الشكر والتقدير

نشكر كل من عمل على تنفيذ WasmGC وإعداد هذه الدراسة: ديواس أدهاكاري، وماتيو ألبرايت، كسينيا بوكينا، جوليان دراميكس، أسيم فازال، مايكل فريدريك، غوكتوغ غوكدوغان، جانيس غو، آدم كلاين، مانوس كوكوتوس، جاكوب كوميروو، ماتياس ليدتك، توماس لايفلي، روبرتو لوبلنرمان، فيشروت ميهتا، توماس ناتيستاد، جوش بيرلشتاين، جواكيم بيروتي، كريس روينيز، ستيفن سافيانو، ديريك شوف، تيم سيرز، مايكل توماس، يوان تيان، فيليب وايس، ميسون وو، ألون زاكي، إيمانويل زيغلر.