हाल ही में मेरे पास Zig में कोड लिखने का अधिक समय रहा है, और इससे मन को बहुत सुकून मिला है। यह लेख Zig में एब्स्ट्रैक्शन पर अपनी अंतर्दृष्टि साझा करता है, जिसमें वे तकनीकें भी शामिल हैं जो लेखक को उपयोगी लगीं लेकिन जिन्हें व्यापक रूप से शायद ही कभी अपनाया जाता है।
Zig इंटरफ़ेस पर काफी कुछ लिखा जा चुका है, और यह उचित भी है। यद्यपि इंटरफ़ेस कोई भाषा फ़ीचर नहीं है, फिर भी Zig में रनटाइम पॉलीमॉर्फिज़्म लागू करने का यही वास्तविक तरीका है। Zig के comptime और उसका उपयोग करके डायनेमिक डिस्पैच की परफ़ॉर्मेंस समस्याओं से बचते हुए सुंदर, डेटा-ओरिएंटेड कोड लिखने के तरीकों पर भी काफी चर्चा हुई है।
Zig में पॉलीमॉर्फिज़्म आम तौर पर दो तरीकों से प्राप्त किया जाता है। डायनेमिक इंटरफ़ेस अपारदर्शी पॉइंटर, वर्चुअल टेबल और डायनेमिक डिस्पैच का उपयोग करके रनटाइम पॉलीमॉर्फिज़्म प्राप्त करते हैं। कंपाइल-टाइम डक टाइपिंग टाइप रिफ़्लेक्शन, switch स्टेटमेंट और कंपाइल टाइम पर मोनोमॉर्फिज़्म का उपयोग करके स्टैटिक पॉलीमॉर्फिज़्म प्राप्त करती है। यह व्यवस्था प्रभावी साबित हुई है, फिर भी इसमें कुछ समझौते हैं। इंटरफ़ेस अन्य भाषाओं से परिचित टाइप कॉन्ट्रैक्ट प्रदान करते हैं, लेकिन चूँकि वे रनटाइम पर मॉड्यूलर होते हैं, वे कंपाइलर के लिए एक कठोर बाधा बनाते हैं और इस प्रकार परफ़ॉर्मेंस ओवरहेड लाते हैं। परफ़ॉर्मेंस-क्रिटिकल कोड के लिए, Zig आम तौर पर कंपाइल-टाइम डक टाइपिंग पर निर्भर करता है, जो इंटरफ़ेस उल्लंघनों को कंपाइल टाइम पर पकड़ लेता है, फिर भी कॉन्ट्रैक्ट का सावधानीपूर्वक दस्तावेज़ीकरण आवश्यक होता है।
Rust के traits या Haskell के typeclasses से आने वाले डेवलपर्स को यह व्यवस्था सरल लग सकती है, और Zig वास्तव में सरल रहना चाहता है। लेखक का तर्क है कि थोड़े अनुकूलन के साथ Zig के userland में टाइप्स पर समान एब्स्ट्रैक्शन संभव हैं। प्रस्ताव कंपाइल-टाइम टाइप कॉन्ट्रैक्ट्स को Traits के रूप में परिभाषित करने की एक नई परंपरा है, जिसके लिए किसी लाइब्रेरी या अतिरिक्त तंत्र की आवश्यकता नहीं है। यह सामान्य रूप से functional programming और विशेष रूप से OCaml से प्रेरित है।
एक Trait को एक कंपाइल-टाइम स्ट्रक्ट के रूप में परिभाषित किया जाता है, जिसमें किसी दिए गए टाइप पर संबंधित फ़ंक्शन होते हैं। लेख इसे फ़ोल्डिंग के लिए एक Reducer trait से समझाता है, जहाँ एक टाइप एक खाली मान और एक combine ऑपरेशन के अंतर्गत reducer बनाता है। i32 के लिए अलग-अलग sum और product traits दिखाते हैं कि एक ही जेनेरिक reduce लॉजिक कैसे पुनः उपयोग किया जा सकता है, और कंपाइलर लूप को inline और unroll कर सकता है। लेखक निष्कर्ष निकालता है कि traits केवल मज़े का एक पिटारा हैं।
स्रोत: Hacker News · HeadlinesBriefing द्वारा सारांशित