
تصحيح تجريبي يلغي إعادة ترتيب البايتات عند تحويل IPv4 إلى IPv6 في Go's netip
إعادة كتابة المترجم التجريبي تحول نمط Go's netip.AddrFrom16(ip.As16()) إلى نسخ مباشر للحقل الداخلي وتنتج نفس التعليمات القصيرة التي ينتجها حل المكتبة القياسية بفارق 0,88 ns.
لماذا يكون نمط التحويل بطيئًا
يوفر Go's netip.Addr دالة Unmap() التي تُرجع عنوان IPv4 غير المُمَثَّل من عنوان IPv6 المُمَثَّل كـ IPv4. لا توجد دالة Map() أو To6() للعملية العكسية. رفض مشرفو Go إضافتها وأحالوا المستخدمين إلى netip.AddrFrom16(ip.As16())، على أمل أن يقوم المترجم بتحسينها.
داخليًا، يخزن netip.Addr عنوان IP كقيمة 128-بت ويستخدم حقلًا إضافيًا لتشفير عائلته ومنطقه. كان بإمكان تنفيذ المكتبة القياسية لـ To6() تعديل هذا الحقل لعناوين IPv4. أما الدالة المساعدة الخارجية، فيجب عليها تحويل العنوان إلى مصفوفة 16-بايت وإعادته.
نتائج المقارنة المعيارية
في مقارنات معيارية أُجريت على Go 1.27.1 بنظام Linux ومعالج AMD Ryzen 5 5600X سداسي النواة، استغرق حل المكتبة القياسية 0,8775 ns لكل عملية. استغرقت الدالة المساعدة الآمنة 7,137 ns، بينما استغرق التنفيذ غير الآمن الذي يصل إلى نفس الحالة الداخلية عبر البروكسي 0,8682 ns. لذلك كانت الدالة المساعدة أبطأ بحوالي ثماني مرات.
كانت التعليمات المجمعة للمكتبة القياسية والنسخ غير الآمنة متطابقة تقريبًا. كلاهما يتحقق من عائلة العنوان ويغير قيمة العائلة الداخلية عند معالجة IPv4. تولد الدالة المساعدة الآمنة تعليمات أكثر، لأنها تضع العنوان في مصفوفة 16-بايت وتنسخ المصفوفة ثم تفككها مجددًا. مع Go 1.26.8، لم يكن المترجم يتخلص من هذا التسلسل.
تجربة على مستوى المترجم
تعيد التجربة كتابة نمط netip.AddrFrom16(ip.As16()) أثناء مرحلة noding في المترجم. تستبدل الاستدعاءات ببنية netip.Addr التي تنسخ العنوان الأصلي وتمنحه قيمة عائلة IPv6. يجب أن تتم إعادة الكتابة أثناء noding، لأن مرحلة فحص الأنواع المبكرة تمنع الوصول إلى الحقول غير المصدَّرة في البنية.
البناء المُعاد كتابته أنتج نفس التعليمات القصيرة للتنفيذ المباشر، واجتازت الاختبارات بنجاح لـ net/netip والحزمة المساعدة. يقول التحليل إن مشرفي Go أقل احتمالًا للموافقة على هذا النهج، لأنه يعتمد على التخطيط الداخلي لـ netip.Addr ويُحمِّل noder مسؤولية أكبر في الترجمة الأمينة لشجرة الصيغة المُفحَصَة أنواعها.
تحسين SSA المقترح
نهج أكثر عمومية يستهدف مرحلة SSA العامة في المترجم، وتحديدًا تمريرة memcombine. قواعد إعادة الكتابة المقترحة تعيد توجيه التحميلات عبر نقلات الذاكرة، وتؤجل القيم المخزنة حتى التحميلات اللاحقة، وتلغي أزواج عمليات تبديل البايتات.
لكل نصف 64-بت من العنوان، تلغي هذه التحويلات المصفوفة المؤقتة ونسختها والوصول الزائد للذاكرة. النقل الأعلى للنصف ممكن أيضًا عبر عملية تخزين إلى عنوان مجاور متداخل. بعد التبسيط، يصبح كل نصف ناتج نسخة من النصف الداخل المقابل، مما يترك بيانات العنوان دون تغيير ويُعيِّن قيمة العائلة المطلوبة.
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.