منفذ TypeScript للغة Go: لماذا تتفوق Go على Rust في هذه المهمة؟

آخر تحديث: 09/01/2026
نبذة عن الكاتب: ج مصدر تريل
  • اختار فريق TypeScript نقل الكود إلى Go بدلاً من إعادة كتابته بالكامل للحفاظ على رسائل الخطأ والدلالات متطابقة.
  • كانت خاصية جمع البيانات المهملة في لغة Go والإغلاقات من الدرجة الأولى ضرورية للتعامل مع هياكل البيانات المعقدة للمترجم.
  • كان مدقق الاستعارة في لغة Rust سيفرض حلولاً يدوية للمراجع الدائرية، مما يضيف تعقيداً غير ضروري.
  • وفرت لغة Go توليدًا ناضجًا للتعليمات البرمجية الأصلية والتزامن في الذاكرة المشتركة دون أي جهد إضافي.

لغة البرمجة TypeScript

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

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

TypeScript 7.0 تحديث
مقالة ذات صلة:
يأتي TypeScript 7.0 مزودًا بمترجم مدعوم بتقنية Go، مما يوفر زيادة في السرعة تصل إلى 12 ضعفًا

لماذا نتجاوز الصدأ من أجل الميناء

أوضح هيلسبرغ أن المُصرّف مليء بمؤشرات الأصل، والأنواع المتكررة، والرموز التي تُشير إلى بعضها البعض. تُنشئ هذه العناصر مراجع دائرية طبيعية في لغة ذات خاصية جمع البيانات المهملة. يتعامل وقت تشغيل Go مع هذا الأمر بسلاسة، مما يسمح للفريق بالتركيز على عملية النقل بدلاً من مواجهة صعوبات اللغة. أما مدقق الاستعارة في Rust، فرغم قوته في ضمان سلامة الذاكرة، إلا أنه لا يسمح بهذا الشكل دون اللجوء إلى تعليمات برمجية غير آمنة أو حيل عدّ المراجع. وهذا من شأنه أن يُضيف تعقيدًا ومخاطرة، دون أي فائدة واضحة.

عند مقارنة اللغتين، لم يجد الفريق أي ميزة جوهرية للغة Rust في توليد الكود أو التزامن. فتقنية توليد الكود الأصلية في Go ناضجة بالفعل، وتوفر إجراءاتها الفرعية (goroutines) نموذجًا بسيطًا وفعالًا للتنفيذ المتزامن. قد يكون أداء Rust أفضل قليلًا في بعض الحالات الاستثنائية، لكن الجهد الإضافي المطلوب لجعل المُصرّف متوافقًا مع قواعد الملكية الخاصة به لم يكن مُبررًا. كان من الضروري أن يكون النقل عمليًا، لا مجرد استعراض لميزات اللغة.

TypeScript 6.0 يعتمد على المستقبل
مقالة ذات صلة:
TypeScript 6.0 ومستقبله القائم على لغة Go

التوافق والدلالات: الأولوية القصوى

كان الدافع الرئيسي وراء عملية النقل هو الحفاظ على السلوك الأصلي للبرنامج. يعتمد المطورون على رسائل الخطأ في TypeScript لتصحيح أخطاء برامجهم، وأي تغيير قد يُعطّل سير عملهم. من خلال النقل إلى Go، تمكّن الفريق من إعادة استخدام المنطق وهياكل البيانات الحالية، مما يضمن بقاء المخرجات متوافقة تمامًا. كما يقلل هذا النهج من خطر ظهور أخطاء دقيقة قد تنتج عن إعادة كتابة البرنامج.

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

مقالة ذات صلة:
تم الحل: قالب الآلة الكاتبة التالي

مدقق الاقتراض في لعبة Rust: عيب جوهري

صُمم مدقق الاستعارة في لغة Rust لمنع تضارب البيانات وأخطاء الذاكرة أثناء الترجمة، ولكنه يخضع لقواعد صارمة. أما هياكل بيانات مُترجم TypeScript، فهي مليئة بالحلقات والمراجع المشتركة، والتي يرفضها مدقق الاستعارة إلا في حال استخدام كتل غير آمنة أو Rc/RefCell. وأشار هيلسبرغ إلى أن هذا سيُجبر على إيجاد حلول يدوية لكل بنية بيانات دائرية، مما يُضيف شيفرة نمطية ويجعل صيانة الكود أكثر صعوبة. ولم تكن هناك أي ميزة في توليد الشيفرة أو التزامن تُبرر هذا الجهد الإضافي.

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

بعد دراسة جميع الجوانب، يُعزى اختيار لغة Go بدلاً من Rust لنقل TypeScript إلى هندسة عملية. فالحاجة إلى جمع البيانات المهملة، والإغلاقات من الدرجة الأولى، والتعامل السلس مع المراجع الدائرية، جعلت من Go الخيار الأمثل. صحيح أن ضمانات الأمان في Rust مثيرة للإعجاب، لكنها تأتي بتكلفة لم يكن فريق TypeScript مستعدًا لتحملها. والنتيجة هي نقل يحافظ على كل ما يُحبّه المطورون في TypeScript، مع وضع الأساس لتحسينات مستقبلية.

نسخة مطبوعة على الآلة الكاتبة
مقالة ذات صلة:
TypeScript 5.9: تجربة مطور مُحسّنة ونظرة سريعة على المستقبل
الوظائف ذات الصلة: