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

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

التحدي: JavaScript

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

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

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

تعد لغة JavaScript سريعة بالنسبة إلى لغة ديناميكية غير مقيدة. أدى الاستثمار المكثّف في برامج التجميع الفوري (JIT) (على سبيل المثال، Maglev وSparkplug وTurbofan) على مدار آخر 15 عامًا إلى زيادة أداء JavaScript. مع ذلك، فإنّ الأنواع غير القابلة للتعديل والسلوك الديناميكي في JavaScript تجعل من الصعب على برامج تجميع JIT إنشاء رمز مثالي. ويعني هذا أن لغة 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 لإجراء تحسينات مسبقة. بين Chrome وWorkspace، تتوفّر لك كل الخبرة اللازمة لإنشاء سلسلة أدوات WasmGC وتحسينها باستخدام "جداول بيانات Google" كأداة اختبار مثالية.

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

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

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

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

  • سيتم تكرار التحسينات الأساسية التي كانت متوفّرة حاليًا في جهاز Java الافتراضي (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 في مشروعهم التالي عالي الأداء. انضم إلينا لجعل الإنترنت مكانًا أسرع وأكثر سلاسة معًا.

شكر وتقدير

شكرًا لكم،