إطلاق TypeScript 7 رسمياً.. ويا لها من سرعة فائقة!

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00تم إصدار TypeScript 7 رسميًا، وبعد أكثر من عام من التطوير الشاق
00:00:05أثبتت عملية نقل المترجم إلى Go وBun أنه يمكنك إنجاز الأمر بأكمله باستخدام الذكاء الاصطناعي، لذا
00:00:10أنا أثق بأن المطورين سعداء بذلك. إذا قمت الآن بتشغيل npm install typescript فستحصل على الإصدار
00:00:16السابع، وهو الإصدار المزود بمترجم Go. ومتابعة لفيديو الإعلان من Microsoft
00:00:20قبل بضعة أيام، أردت التعمق في كيفية تحقيقهم لهذه المكاسب الضخمة
00:00:25في الأداء. كانت النتائج مثيرة للإعجاب حقًا. المترجم الجديد يبني قاعدة كود VS Code
00:00:31التي تضم 1.3 مليون سطر من الكود عبر ما يقرب من 8,000 ملف في 10 ثوانٍ فقط، مقارنة بـ 125
00:00:39ثانية من المترجم القديم. ومع تصدر TypeScript بكل فخر المرتبة الأولى كأكثر لغة استخدامًا على
00:00:44GitHub، صدق أو لا تصدق، المترجم الجديد سيغير حياة الكثيرين. أشعر بالحرقة والتعاطف
00:00:49مجرد التفكير في الأمر. ولكن بدلاً من النظر إلى الميزات المتطابقة تقريبًا بين الإصدارين 6 و7، أردت التعمق
00:00:54في كيفية تحقيق هذا الأداء تحديدًا. فلنلقِ نظرة على المترجم الجديد ونرى ما
00:00:59الذي يجعله سريعًا إلى هذا الحد. إذًا لماذا إعادة الكتابة؟ قال مبتكر #C والزميل التقني في Microsoft
00:01:09أندرس هيلسبرغ ذلك بوضوح شديد: “JavaScript محسّنة لواجهات المستخدم والمتصفحات، وليست
00:01:16محسّنة حقًا لسير العمل المكثف للحوسبة والمترجمات”. وهذا أمر بديهي تمامًا لأنها أحادية
00:01:22المسار (single-threaded)، ومعالجة شيء مثل شجرة البناء النحوي (AST) أو فحص الأنواع يمكن أن تصل فقط إلى حد معين
00:01:27عند الاعتماد على نواة واحدة. تقنيًا، يمكنك توزيع العمل عبر العمال (workers)، ولكن حينها
00:01:32ستحتاج إلى تسلسل البيانات وإلغاء تسلسلها، وهو أمر بطيء ويثقل الذاكرة، ثم سيتعين عليك
00:01:38التعامل مع تعقيد إدارة كل ذلك. لذا استقروا على Go، والتي تقدم تحسينات
00:01:43هائلة في الأداء باستخدام لغة مناسبة تمامًا لهذا الغرض. Go لغة مترجمة،
00:01:48مما يعني أنه يمكننا تشغيل الكود المترجم مباشرة على المعالج بدلاً من تفسيره. وتمتلك Go
00:01:54نموذج تزامن ممتازًا للغاية، مما يعني أنه يمكننا بسهولة تشغيل مسارات تنفيذ متعددة في نفس الوقت
00:02:00وكلها تتشارك الذاكرة. هذا يعني أنه يمكننا الاستفادة من جميع النوى في جهازك بدلاً من
00:02:06نواة واحدة فقط. وهناك تقسيم متساوٍ تقريبًا: ينُسب ما يصل إلى نصف تسريع السرعة إلى الكود الأصلي (native code)
00:02:12والباقي من استخدام التزامن بالذاكرة المشتركة. تعتبر Go بأساسها اللغة المثالية لهذا
00:02:17الأمر، فليس فقط لأن Go أسرع، بل إنها تملك حرفيًا المزيد من الموارد لضخها في هذه المشكلة، والنتائج
00:02:23تتحدث عن نفسها. إذا نظرنا إلى الأرقام، فإن مشروع VS Code المكون من 1.3 مليون سطر كود استغرق 125.7 ثانية على المترجم القديم
00:02:32ومع المترجم الجديد 10.6 ثانية، وهو تحسن بمقدار 11.9 ضعفًا. وبالنسبة لـ BlueSky، انخفضت من 24.3 إلى 2.8 ثانية، أي تحسن بمقدار 8.7 ضعفًا
00:02:42أما لـ Playwright، فقد انخفضت من 12.8 ثانية إلى 1.5 ثانية، بتحسن 8.7 ضعفًا. والمثير للاهتمام أنه لا يلزمك سوى
00:02:49ثانية واحدة للاشتراك في Better Stack. هذه الفجوة ستتسع أكثر لأن النوى لا
00:02:54تصبح أسرع بنفس المعدل الذي كانت عليه في الماضي، ولكن ما نحصل عليه هو المزيد من النوى. أنا أستخدم جهاز M3 Max على سبيل
00:03:00المثال، والذي يحتوي على 14 نواة، وهو أمر جنوني. أتذكر أنني قمت بتجميع كمبيوتر ألعاب في الكلية يحتوي على
00:03:06معالج Intel i7 بأربع نوى، وظننت أنه وحش خارق حينها. مترجم JavaScript كان
00:03:11يستخدم واحدة فقط من تلك النوى، ولكن مع Go، أستغلها جميعًا. وبالطبع كلما زاد عدد النوى لديك، كلما
00:03:17حصلت على أداء أعلى. إذا قمت بتجميع مشروع كبير على هذا الجهاز في الإصدار السادس، ستلاحظ أنه يستغرق 45
00:03:24ثانية، ومع الإصدار السابع يمكننا تقليل ذلك إلى 3 ثوانٍ فقط. وهناك مراحل
00:03:29متعددة لعملية التجميع، ومرحلة فحص الأنواع هي مجرد واحدة منها. لهذا السبب،
00:03:34ستقوم Go بتشغيل أربعة أجهزة لفحص الأنواع ليفحص كل منها ربع قاعدة الكود، ولكن يمكنك
00:03:39تحسين ذلك بشكل أكبر. أثناء التجميع، يمكنك ضبط عدد الفاحصات (checkers) على 12 للحصول على أداء أسرع
00:03:45لقد قمت بتنزيل مستودع VS Code على جهازي لكي نتمكن من رؤية الفرق بين TypeScript 7 و6
00:03:51بشكل افتراضي، يشير tsc على جهازي الآن إلى TypeScript 7، لذا سنقوم بتشغيل أدوات التشخيص على
00:03:57هذا المشروع، ويمكنك رؤية أن الأمر استغرق 5.4 ثانية، وغالبية الوقت قضيت بالفعل في
00:04:02وقت الفحص، أي 4.7 ثانية من تلك الثواني. يمكننا تسريع ذلك أيضًا، فإذا أضفنا خيارًا آخر
00:04:08مثل checkers 12، ستلاحظ أن الوقت الإجمالي قد انخفض الآن من 5.4 إلى 3.5 ثانية، وكل ذلك يقلل
00:04:15من وقت الفحص. هنا كان لدينا 4.7 ثانية ثم انخفضت إلى 2.9. الآن لنقم بتشغيل نفس
00:04:20الأمر مجددًا، ولكن هذه المرة سنستخدم TypeScript 6 وسيسغرق هذا الأمر بعض
00:04:23الوقت، لذا سنقوم بتسريع الفيديو. بعد الانتظار، يمكنك رؤية أن TypeScript 6 انتهى في
00:04:2845.3 ثانية مقارنة بـ 3.5 ثانية التي حصلنا عليها عند التشغيل عبر جميع النوى، وهذا يعتبر
00:04:36تحسنًا بـ 15 ضعفًا على شريحة M3 Max الخاصة بي. بالنسبة لي، هذا هو مصدر الـ 3.5 ثانية فعليًا. القيام
00:04:43بذلك سينقص بالطبع من أداء العمليات الأخرى، ولكن إن لم تكن تفعل أي شيء آخر،
00:04:47فمن الأفضل استخدام جميع الموارد المتاحة في جهازك. لننتقل ونستعرض بعض الأكواد الفعلية
00:04:52من المترجم الجديد لنفهم كيف تمكنت Go من تحقيق هذا الأداء. لدينا هنا دالة bindSourceFiles
00:04:57والتي تتمثل مهمتها في بناء كل إعلان داخل الملف وتحديد النطاق (scope) الذي ينتمي إليه.
00:05:03نحن نعالج آلاف الملفات محتملة، فنقوم بالتكرار على كل ملف ونضع دالة في قائمة الانتظار لربطه
00:05:09ثم ننتظر حتى تنتهي جميع الملفات. الجزء الجميل هو أنه لا يتعين علينا التفكير في كيفية
00:05:14توزيع هذا العمل على النوى، ببيئة تشغيل Go تتكفل بكل ذلك. نحن لا ننشئ المسارات أو
00:05:20نتعامل مع اتصالات معقدة بين النوى، بل نقول فقط “إليك بعض المهام” وهي تكتشف كيفية تنفيذ
00:05:26الباقي. في JavaScript، يمكننا كتابة كود مطابق تقريبًا، ولكن هذا بلا فائدة للمهام التي تستهلك المعالج
00:05:32فستظل تحدث جميعها على مسار واحد بالتتابع، حتى لو أعطتك الوعود (promises) إيحاءً بالتوازي.
00:05:38العمال (workers) يعتبرون تقنيًا حلاً بديلًا لهذا، لكن لا يمكنك مشاركة الكائنات بينهم، فقط البايتات الخام باستخدام
00:05:43SharedArrayBuffer. لذا، فإن تسليم شجرة البناء النحوي إلى عامل يعني تسلسل الكائن بالكامل و
00:05:48نسخه وإعادة بنائه في الجانب الآخر. بالنسبة لملف كبير، قد يكلف ذلك أكثر من العمل نفسه.
00:05:53في الأساس، مثل هذه الأمور هي ما يجعل Go أفضل بطبيعتها للمهام التي تستهلك المعالج. فهي تمتلك
00:05:58بيئة تشغيل يمكنها التعامل مع كل هذا التزامن نيابة عنك، ولديه ذاكرة مشتركة تتيح لك تمرير الكائنات
00:06:03دون الحاجة إلى نسخها. الآن، وبصرف النظر عن وقت التجميع، فإن الشيء الذي ستلاحظه
00:06:07أكثر من غيره هو سرعة خادم اللغة لديك. أي شخص عمل على قاعدة كود ضخمة لـ TypeScript يعرف
00:06:13معاناة الانتظار لحين فحص الأنواع. ويا إلهي، أجهزة Mac المزودة بمعالجات Intel عانت من هذا حقًا. أتذكر العمل على
00:06:20مشاريع قبل بضع سنوات، حيث كنت تفتح المستودع وتضطر حرفيًا للانتظار
00:06:24لمدة تصل إلى دقيقتين لمجرد رؤية الخطوط الحمراء المتموجة تظهر، وفي كل مرة تجري فيها تغييرًا
00:06:29كان الأمر سيئًا ومؤلمًا للغاية. تجربة المطور تكون سيئة جدًا ولا أحد يرغب في
00:06:34العمل على قاعدة الكود هذه. خادم اللغة الجديد، مع ذلك، يعني استجابة فورية في بيئة التطوير الخاصة بك، حيث
00:06:40يمكنك فتح ملف، وإجراء تغيير، ورؤية الأخطاء في غضون أجزاء من الثانية فقط، حتى لو كنت تعمل على
00:06:46قواعد كود ضخمة للغاية. بالإضافة إلى الأداء، خادم اللغة الجديد بات أكثر استقرارًا الآن، لذا
00:06:51فإن الحاجة إلى إعادة تشغيل بيئة التطوير عندما يتوقف فحص الأنواع عن العمل قد انخفضت بشكل كبير. TypeScript 7
00:06:57قلل من فشل أوامر خادم اللغة بأكثر من 80% وقلل من انهيار الخادم بأكثر من 60%.
00:07:04وهذا يعني عددًا أقل من أجهزة المحمول التي تُلقى على الجدران، وهو أمر جيد حقًا للبيئة!
00:07:08من كان يعلم أن Microsoft تهتم حقًا بالكوكب؟ يجدر بالذكر أيضًا أن هذه عملية إعادة نقل (port) وليست
00:07:13إعادة كتابة كليًا. كان فريق TypeScript حريصًا جدًا لضمان أن المترجم الجديد متوافق
00:07:19تمامًا وبشكل كامل مع القديم. ربما لن تلاحظ حتى أي فرق باستثناء السرعة، ولكن
00:07:24بينما يمكنك الآن تشغيل TypeScript 7 على مشاريعك الخاصة، ستظل بحاجة إلى الانتظار حتى
00:07:29تتدارك الحزم المفضلة لديك هذا التحديث. واجهة البرمجة التطبيقية (API) الخاصة بها لا تزال مفقودة، مما يعني أن أي حزمة تعتمد
00:07:35عليها ستحتاج إلى الانتظار حتى الإصدار 7.1. حزم مثل typescript-eslint أو ts-jest أو ts-node ستتأخر
00:07:42قليلاً. الآن، الإصدار الكامل من TypeScript 7 متاح لتنزيله، ولكنك
00:07:47تحتاج إلى تثبيت إضافة TypeScript 7 بشكل صريح لـ VS Code. سيتم تحديث الحزمة الافتراضية في النهاية،
00:07:53ولكن في الوقت الحالي، قم بتثبيت هذه الإضافة فقط، واسمها TypeScript 7 في متجر الإضافات،
00:07:58وسيعمل كل شيء كما هو متوقع. إذا كنت تريد معرفة المزيد عن مجموعة ميزات TypeScript 7، لقد
00:08:03صورنا فيديو عن ذلك تحديدًا يمكنك مشاهدته هنا. وإذا كنت تستمتع بشروحات كهذه، اشترك
00:08:08في Better Stack للمزيد. آمل أن تكون قد تعلمت شيئًا جديدًا هنا، والان يمكنك الاستفادة من
00:08:12التطوير السريع الذي ستحصل عليه مع TypeScript 7. أنا متأكد حتمًا من أنني سأستمتع
00:08:16باستخدام هذا الإصدار. شكرًا لك على المشاهدة، وبالطبع أراك في الفيديو القادم.

Key Takeaway

يحقق TypeScript 7 تسريعاً في التجميع يبلغ 11.9 ضعفاً عبر إعادة نقل المترجم إلى لغة Go واستغلال التزامن بكامل نوى المعالج مع تقليل انهيارات خادم اللغة بنسبة 60%.

Highlights

  • يقلل مترجم TypeScript 7 المبني بلغة Go زمن بناء مشروع VS Code المكون من 1.3 مليون سطر كود من 125.7 ثانية إلى 10.6 ثانية.

  • يعتمد الأداء الجديد مناصفة على التحويل إلى كود أصلي (native code) والتزامن عبر الذاكرة المشتركة للاستفادة من جميع نوى المعالج.

  • يرفع ضبط عدد الفاحصات (checkers) إلى 12 فاحصاً أداء التجميع على معالج M3 Max بمقدار 15 ضعفاً مقارنة بالإصدار السادس.

  • يخفض خادم اللغة الجديد معدل فشل الأوامر بأكثر من 80% ومعدل انهيار الخادم بأكثر من 60%.

  • تتطلب حزم التوسعة مثل typescript-eslint وts-jest انتظار الإصدار 7.1 لاكتمال واجهة البرمجة التطبيقية (API).

Timeline

إطلاق TypeScript 7 ومقاييس الأداء الجديدة

  • يصاحب الإصدار السابع من TypeScript مترجم جديد مكتوب بلغة Go.
  • ينخفض زمن بناء مشروع VS Code المكون من 1.3 مليون سطر عبر 8,000 ملف من 125 ثانية إلى 10 ثوانٍ.
  • تتصدر TypeScript المرتبة الأولى كأكثر لغة استخداماً على منصة GitHub.

تم إصدار TypeScript 7 رسمياً مع نقل كامل للمترجم إلى Go وBun. يركز هذا التحديث على معالجة الاختناقات الهيكلية في أداء التجميع وقواعد الكود الضخمة. يعالج المترجم الجديد أشارع المشاريع المفتوحة المصدر برفع كفاءة معالجة الملفات الكثيرة بشكل مباشر.

أسباب الانتقال من JavaScript إلى Go

  • JavaScript مصممة لواجهات المستخدم أحادية المسار وليست للحوسبة المكثفة في المترجمات.
  • توفر Go تحسينات عبر التشغيل المباشر على المعالج ونموذج تزامن بالذاكرة المشتركة.
  • ينقسم التسريع مناصفة بين التحويل لكود أصلي والاستفادة من النوى المتعددة.

تتطلب معالجة أشجار البناء النحوي (AST) وفحص الأنواع قدرات حوسبة متوازية تصطدم بالحاجز أحادي المسار لبيئة JavaScript. توزيع العمل عبر العمال (workers) في JavaScript يفرض تسلسل البيانات وإلغاء تسلسلها، مما يستهلك الذاكرة ويزيد البطء. تتيح Go مشاركة الذاكرة بين مسارات التنفيذ وتستغل كامل النوى المتاحة في المعالج.

نتائج الاختبارات واختبارات الأداء على M3 Max

  • ينخفض زمن تجميع BlueSky من 24.3 إلى 2.8 ثانية، وPlaywright من 12.8 إلى 1.5 ثانية.
  • يقلل ضبط خيار الفاحصات إلى 12 زمن التجميع لمشروع VS Code على معالج M3 Max إلى 3.5 ثانية.
  • يحقق المترجم الجديد تسريعاً إجمالياً يصل إلى 15 ضعفاً مقارنة بالإصدار السادس على معالج 14 نواة.

تتسع الفجوة في الأداء بين المترجمين مع زيادة عدد النوى في المعالجات الحديثة. تقسم Go عملية فحص الأنواع تلقائياً بين أجهزة فحص متوازية يفحص كل منها جزءاً من قاعدة الكود. يقلل رفع عدد الفاحصات إلى 12 من زمن الفحص الفعلي من 4.7 ثانية إلى 2.9 ثانية على قاعدة كود ضخمة.

تحليل الكود المصدري وإدارة التزامن

  • تقوم الدالة bindSourceFiles بوضع مهام ربط الإعلانات والنطاقات في قائمة انتظار وتنفذها بالتوازي.
  • تتولى بيئة تشغيل Go توزيع المهام على النوى دون الحاجة لإنشاء مسارات يدويًا.
  • تتجنب Go نسخ الكائنات وسلسلتها عبر استخدام SharedArrayBuffer المكتفي بالبايتات الخام.

تظهر بنية المترجم في Go كيفية المعالجة المتوازية لآلاف الملفات من خلال إرسال المهام إلى بيئة التشغيل مباشرة. تتفوق Go على الوعود (promises) والعمال (workers) في JavaScript بتجنب تكاليف النقل والتسلسل لشجيرات AST الكبيرة. توفر الذاكرة المشتركة إمكانية الوصول إلى البيانات دون استهلاك إضافي للموارد.

استقرار خادم اللغة والتوافق البرمجي

  • يستجيب خادم اللغة الجديد للتغيرات ويكشف الأخطاء في أجزاء من الثانية.
  • تنخفض أخطاء أوامر خادم اللغة بأكثر من 80% وتتراجع انهياراته بأكثر من 60%.
  • يتطلب دعم الحزم الخارجية مثل typescript-eslint انتظار صدور الإصدار 7.1.

يمثل المترجم الجديد عملية نقل مطابقة (port) تضمن التوافق الكامل مع قواعد الكود الحالية لـ TypeScript 6. يلزم تثبيت إضافة TypeScript 7 بشكل صريح في VS Code لتفعيل خادم اللغة الجديد حالياً. تفتقر النسخة الحالية إلى بعض الواجهات البرمجية (APIs) اللازمة للوات أدوات التحليل المتقدمة، والتي ستكتمل مع التحديثات القادمة.

Community Posts

View all posts