هل تكون لغة البرمجة Rust هي مستقبل البنية التحتية لجافا سكريبت ؟

لغة البرمجة راست Rust سريعة، موثوقة وتعالج الذاكرة بفعالية كبيرة. تصدرت لستة أعوام متتالية استبيان StackOverflow لأكثر لغات البرمجة المحبوبة حول العالم.

تم بناؤها من طرف شركة موزيلا Mozilla، وهي الآن تستخدم من قِبل عمالقة التكنولوجيا أمثال فيسبوك، آبل، مايكروسوفت، أمازون وبطبيعة الحال جوجل لأجل مهام وأدوار تبدأ بالبنية التحتية لأنظمة تلك الشركات، التشفير، المحاكاة الإفتراضية (Virtualization) لتشمل أوجها ومناحي عديدة حيث البرمجة منخفضة المستوى تكون مطلوبة.

هذه التدوينة ترجمة إلى العربية للتدوينة الأصلية لصاحبها لي روبنسون الذي أخذت منه تصريحا لترجمتها ونشرها على مدونة توتومينا مع تصرف لا بأس به مني 😅

منذ مدة ظهرت عدد من الأدوات المبنية على Rust والتي تتولى القيام بعدد من المهام التي يحتاجها المطورون في كل مشاريع الويب مثل التصغير (Minification)، التجميع (Bundling)، التنسيق (Formatting)، الفحص (Linting) إلخ...

أهم تلك الأدوات نجدها منضوية تحت لواء المنصة SWC التي تعتمد عليها اليوم عدد من التقنيات المعروفة مثل Next.js، بيئة التشغيل Deno ومحزم الوحدات Parcel. كل ذلك لتستفيد من طفرة الأداء والسرعة الكبيرة التي توفرها Rust بالمقارنة مع جافاسكريبت الذي بنيت عليه الأدوات الأقدم مثل Babel ،Webpack ،Terser وغيرها.

على سبيل المثال، استطاع القائمون على إطار العمل Next.js مضاعفة سرعة تحزيم وتجميع الكود من 3 إلى 5 مرات بعد الإنتقال إلى الإعتماد على Rust Compiler بداية من الإصدار 12 الذي أعلن عنه قبل أسابيع قليلة.

ما هو Rust ؟

تساعد لغة البرمجة Rust المبرمجين في بناء برامج سريعة مع معالجة فعالة للذاكرة. يمكن اعتبارها بديلا عصريا للغات قديمة مثل C و C++ يركز على توفير شفرة برمجية مختصرة وآمنة.

لغة Rust مختلفة تماما عن لغة جافا سكريبت، فالأخيرة مثلا تعالج الذاكرة بطريقة مختلفة كليا معروفة بمصطلح جمع القمامة أو Garbage Collection. فكرة هذه الطريقة تقوم على البحث الآلي عن المتغيرات والكائنات الغيرة مستخدمة في البرنامج ليتم حذفها وإزالتها من الذاكرة. كل ذلك من أجل توفير درجة عالية من التجريد (Abstraction) تغني المطور عن التفكير في تعقيدات الذاكرة وإدارتها.

عندما لا توفر اللغة جامعا للقمامة، أو Garbage Collector، فإن المبرمج يصبح مطالبا بفعل ذلك بنفسه وذلك بتخصيص الذاكرة (Memory allocation) وإفراغها بحسب الحاجة. هذه المهمة تصبح صعبة وغير مريحة كلما زاد حجم المشروع أو البرنامج.

هذه سنة الحياة، كلما مُنِحْت تحكما وسلطات أكبر ووصولا للتفاصيل، زادت المسؤوليات والمتاعب 😄

مع Rust، يصبح المطور قادرا على التحكم أكثر في الذاكرة وتخصيصها بدون أن يكون ثمن الموضوع باهضا من ناحية تجربة المطور (Developer Experience) كما هو عليه الحال في لغة C على سبيل الذكر لا الحصر.

توفر لغة "راست" هذا الحل الوسط بالإعتماد على ميزة مركزية هي الأهم على الإطلاق لديها وتعرف بنظام المِلكية أو Ownership.

نظام المِلكية يتلخص في إدارة الذاكرة بناءًا على عدد من القواعد (Rules) التي يتحقق منها المترجم (Compiler) في مرحلة الترجمة، بدون أن يؤثر ذلك على أداء وفعالية البرنامج.

ميزة "المِلكية" جديدة على معظم المبرمجين، ولذلك قد يتطلب الأمر بعض الوقت لاستيعابها وهضمها جيدا. بعد ذلك، ومع مزيد من الخبرة، ستكون تلك الميزة أقوى سلاح لدى مستعلمي هذه اللغة لبناء برامج قوية، آمنة وسريعة.

للمزيد من التفاصيل: What Is Ownership?

من جافا سكريبت إلى راست

جافا سكريبت هي لغة البرمجة الأكثر استخدامًا. تعمل على كل جهاز به متصفح ويب، وأصبحت منذ مدة طويلة تدعم الخوادم كذلك بفضل تقنية Node.js.

على مدى السنوات العشر الماضية ، تم بناء نظام بيئي ضخم حول جافاسكريبت.

  • Webpack: أداة تمكن المطورين من تحزيم وتجميع الوحدات والتبعيات في ملف جافا سكريبت واحد (في الغالب).
  • Babel: تمكننا من كتابة الجافاسكريبت العصري وفي نفس الوقت دعم المتصفحات القديمة.
  • Terser: بهدف توليد وإنتاج ملفات مصغرة قد الإمكان (Minification).
  • Prettier: تنسيق الشفرة البرمجية وفق قواعد وإعدادات محددة من طرف المطور.
  • Eslint: تساعد في كتابة الكود وفق نمط موحد مع إيجاد المشاكل وإصلاحها قبل نشر الكود.

الملايين من الأسطر البرمجية تمت كتابتها للوصول إلى نظام بيئي (Ecosystem) يستند عليه المطورون اليوم لبناء تطبيقات الويب. جميع تلك الأدوات تم تطويرها إما بواسطة JavaScript نفسها أو بالإعتماد على لغة TypeScript (التي تترجم في نهاية كل دورة برمجية إلى جافا سكريبت اعتيادي).

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

SWC

SWC هي منصة مفتوحة المصدر تم إنشاؤها عام 2017 بغرض توفير أدوات تساعد المطورين على بناء الويب بفعالية وأداء ممتازين.

تولت هذه المنصة، كما ذكرنا سابقا في أول التدوينة، إعادة كتابة وبناء الأدوات السالفة الذكر باستخدام لغة البرمجة Rust، وقد نالت إعجاب واستحسان عدد لا يستهان به من المشاريع المعروفة التي باتت تعتمد عليها مثل إطار العمل Next.js، مجمع الوحدات Parcel، بيئة التشغيل Deno وكذلك عدد من الشركات الكبرى مثل ByteDance ،Tencent ،Vercel، شوبيفاي والمزيد...

Deno

دينو، الذي تم بناؤه عام 2018، هو بيئة تشغيل عصرية وآمنة لجافا سكريبت وتايب سكريبت تعتمد على محرك V8 (مثل Node.js) ومبنية باستخدام Rust. هي محاولة لمنافسة Node.js وصنع بديل له من طرف نفس الأشخاص الذين بنوا من قبل Node.js وعلى رأسهم Ryan Dahl.

مشروع Deno يعتمد في توفير عدد من الأوات (Linting ،Code Formatting و Docs Generation) على مشروع SWC الذي تكلمنا عليه أعلاه.

Esbuild

تم بناء esbuild بداية عام 2020 ليكون بديلا أسرع لمجمعات الوحدات الجاري بها العمل مثل ويب باك، Rollup وأمثالهما. يدعي مطوره أن بإمكانه توفير كافة الإمكانيات بأداء أسرع من 10 إلى 100 مرة! والسبب الرئيسي أنه مبرمج بلغة Go منخفضة المستوى مقارنة بجافاسكريبت.

صاحب هذا المشروع، إيفان والاس، يقول في هذا الصدد:

أحاول إنشاء أداة بناء تعمل بشكل جيد لحالات مثل تجميع جافا سكريبت وتايب سكريبت (Bundling)، وربما CSS. كما أطمح لإعادة تعريف توقعات المجتمع لما يعنيه أن تكون أداة بناء جافاسكريب سريعة. الأدوات الحالية بطيئة للغاية في نظري.

بناء أدوات وحلول جافا سكريبت باستخدام لغات برمجة مثل Go و Rust. كان أمرا غير معتاد حتى ظهر esbuild. باعتقادي، لعب الأخير دورا هاما ومحوريا في لفت انتباه مجتمع جافاسكريبت إلى هذه الطريقة الجديدة لبناء أدوات سريعة.

وعن اختياره للغة Go على حساب Rust يقول إيفان:

ربما يمكن بناء نسخة "راست" بسرعة مكافئة وجهد مقبول. ولكن على مستوى آخر، كان Go أكثر إمتاعًا بالنسبة لي. هذا مشروع جانبي (Side project) ويجب أن يكون العمل عليه ممتعًا.

على الطرف الآخر، هناك من يرى بأن Rust يمكن أن تنتج برامج أسرع من Go! حيث يقول Jesse Howarth، أحد المهندسين بشركة Discord، في معرض حديثه عن قصة استغنائهم في الشركة عن Go لصالح Rust:

حتى مع بعض التحسينات الأساسيات، كانت Rust قادرةً على التفوق في الأداء على نسخة Go. هذا دليل ملموس على مدى سهولة كتابة برامج فعالة باستخدام Rust مقارنة بالغوص العميق الذي كان علينا القيام به مع Golang.

في النهاية، ورغم هذه الإختلافات، فإن استخدام مثل هذه اللغات في بيئة جافا سكريبت يصب في منحى تحقيق هدف Evan الأساسي المتمثل في التأثير على مجتمع الويب بشكل إيجابي.

Rome

لعلكم سمعتم في الأشهر القليلة الماضية عن أداة اسمها Rome تم إطلاقها على شكل نسخة Beta أواخر الربع الثالث من 2020.

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

مطور Rome هو نفسه سيباستيان ماكنزي صاحب مشروع Babel الذي يعرفه كل Frontend Developer.

Rome مبنية في الوقت الحالي على TypeScript، ولكنهم بصدد إعادة تنفيذ المشروع من الصفر بالإستعانة بلغة البرمجة Rust. ودائما بغية تحقيق نفس الأهداف التي سعى وراءها إيفان والاس: الأداء، الأداء، الأداء.

Node-API (NAPI)

من المعلوم أن Node.js يوفر بشكل افتراضي واجهة برمجية - معروفة ب Node-API - لتشغيل واستيراد وحدات أصلية (Native Modules) مكتوبة بلغة البرمجة C++. الهدف بطبيعة الحال هو تنفيذ بعض المهام المكلفة بإمكانيات كبيرة وبأداء عالي كما هو معروف عن C++. أو مثلا لبناء وحدات أصلية مع ميزة التوافق مع مختلف إصدارات (Node.js) مما يسهل ويقلل كلفة الصيانة على المشرفين على تلك الوحدات (Maintainers).

  • للمزيد من التفاصيل حول هذا الموضوع:

باتباع نفس المنطق والفكرة، ظهرت بعض المشاريع التي استهدفت توفير واجهات برمجية للغات برمجة مختلفة تمكن من تشغيل أكوادها الأصلية داخل Node.js. من بين تلك المبادرات نجد napi-rs الذي يخدم لغة Rust والذي بدأت في استخدامه مجموعة من المشاريع الكبيرة على رأسها Next.js و Prisma لتوفير أدوات مبنية بواسطة Rust وموجهة للتشغيل داخل Node.js.

Web Assembly

Web Assembly هو نوع جديد من التعليمات البرمجية منخفضة المستوى يمكن تنفيذها في المتصفحات الحديثة (إلى جانب جافا سكريبت) ويوفر وظائف جديدة بالإضافة إلى مكاسب كبيرة في الأداء مقاربة لتلك التي توفرها لغات مثل C++ في Native Applications.

ليس عليك كتابة تعليمات Web Assembly البرمجية بنفسك، فالأخير صمم منذ البداية ليكون من المخرجات التي تترجِم إليها عدد من لغات البرمجة منخفضة المستوى مثل C++ ،Go وبطبيعة الحال اللغة التي تهمنا اليوم في هذه التدوينة، Rust 🙂

الهدف من "ويب أسامبلي" هو توفير بيئة لتشغيل تطبيقات سريعة وفعالة في المتصفحات (وخارجها كذلك) كتلك الموجودة في تطبيقات أصلية مثل تطبيقات الألعاب وبرامج سطح المكتب التي تسعى لتوفير بدائل للمستخدمين في المتصفحات مثل أدوات تعديل الصور (تطبيق Figma على سبيل المثال يعتمد على Web Assembly) والفيديوهات، عرض البيانات المعقدة (Data Visualization) وغيرها...

إذن، بفضل Web Assembly، أصبح بإمكاننا كتابة برامج باستخدام لغات برمجة مثل C++ ،Go ،Rust وبايثون وتشغيلها في بيئة مثل المتصفح لا تدعم في الأصل تلك اللغات.

الخاتمة

لا شك أنه لا يمكن في الوقت الحالي مقارنة بيئة Rust مع بيئة جافا سكريبت فيما يخص أدوات تطوير وبناء الويب. ولكن مما لا شك فيه أنه تم قطع شوط مهم وبدأت الصورة تتشكل لما سيكون عليه مستقبل بناء وتوفير تلك الأدوات.

Rust وشبيهاته من لغات البرمجة منخفضة المستوى ليست ببساطة لغات عالية المستوى مثل جافا سكريبت، ومن الممكن أن يكون هذا عائقا ومثبطا لسرعة تغلغل هذه اللغات في النظام البيئي للويب وجافا سكريبت.

في ذات الوقت، ومن الناحية الأخرى، السرعة في الأداء والنتائج المبهرة التي حصل عليها أرباب كل تلك المشاريع التي أتينا على ذكرها في هذا المقال ستجعل الجميع يقدمون تلك "التضحيات" في سبيل جعل حياة مطوري الويب أسهل، أسرع وأكثر فعالية 🚀

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

ادعمنا على باتريون