HeadlinesBriefing HeadlinesBriefing.com

السمات في Zig: تجريد وقت الترجمة

Hacker News •
×

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

لقد كُتب الكثير عن واجهات Zig، وهذا أمر مبرر. فرغم أن الواجهات ليست ميزة لغوية، فهي الطريقة الفعلية لتطبيق تعدد الأشكال وقت التشغيل في Zig. كما قيل الكثير عن comptime في Zig وكيف يمكن الاستفادة منه لتجنب مشكلات الأداء في الإرسال الديناميكي، وكتابة شيفرة أنيقة موجهة نحو البيانات.

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

قد يجد المطورون القادمون من سمات Rust أو فئات الأنواع في Haskell هذا الترتيب بسيطًا، وتسعى Zig فعلًا إلى البساطة. يرى الكاتب أنه مع قليل من التكييف يمكن تحقيق تجريدات مماثلة على الأنواع داخل فضاء المستخدم في Zig. والاقتراح هو اصطلاح جديد لتعريف عقود الأنواع وقت الترجمة بوصفها سمات، دون حاجة إلى مكتبات أو آليات إضافية. وهو مستوحى من البرمجة الوظيفية عمومًا ومن OCaml بشكل خاص.

تُعرَّف السمة بوصفها بنية وقت الترجمة تحتوي على دوال متصلة بنوع معين. ويوضح المقال ذلك بسمة Reducer للطي، حيث يشكّل النوع مُخفِّضًا تحت قيمة فارغة وعملية دمج. وتبيّن سمتا sum وproduct المنفصلتان لنوع i32 كيف يمكن إعادة استخدام منطق reduce العام نفسه، مع قدرة المترجم على تضمين الحلقة وفكّها. ويخلص الكاتب إلى أن السمات ليست سوى حقيبة مليئة بالمتعة.

المصدر: Hacker News · لخّصه HeadlinesBriefing