- Zig भाषा ने async I/O के पुराने डिज़ाइन की जटिलता कम करने के लिए नए
Io इंटरफेस-आधारित मॉडल को अपनाया है
- यह मॉडल सिंक्रोनस और असिंक्रोनस कोड को अलग किए बिना समान फंक्शन स्ट्रक्चर बनाए रखता है, और
Io.Threaded तथा Io.Evented दो implementations प्रदान करता है
Io.Threaded डिफ़ॉल्ट रूप से सिंक्रोनस रन करता है, जबकि Io.Evented इवेंट-लूप आधारित असिंक्रोनस रन करता है
- डेवलपर
async() और concurrent() फंक्शनों के ज़रिए पैरलल रन नियंत्रण कर सकते हैं और बिना कोड बदले performance ऑप्टिमाइज़ कर सकते हैं
- यह approach function coloring समस्या को सुलझाते हुए Zig की सादगी और नियंत्रण बनाए रखते हुए async performance सुरक्षित करने की दिशा में है
Zig की async डिजाइन में बदलाव
- Zig ने पाया कि पहले का async डिजाइन भाषा के minimalism philosophy के साथ सही मेल नहीं खाता था, इसलिए एक नया approach खोजा
- पुराने डिजाइन की अन्य फीचर्स के साथ एकीकरण क्षमता कम थी
- नया मॉडल सिंक्रोनस और असिंक्रोनस I/O को एक जैसी code structure से हैंडल करने में सक्षम है
- नया डिजाइन
Io generic interface के आसपास काम करता है
- सभी I/O फंक्शन
Io instance को parameter के रूप में लेकर रन होते हैं
Allocator इंटरफेस जैसा ढांचा, यानी memory allocation की तरह I/O control करना संभव है
Io इंटरफेस की संरचना
- स्टैंडर्ड लाइब्रेरी में दो बुनियादी implementations शामिल हैं
Io.Threaded: डिफ़ॉल्ट रूप से सिंक्रोनस रन, ज़रूरत पड़ने पर thread-based parallel handling
Io.Evented: इवेंट-लूप आधारित असिंक्रोनस रन (io_uring, kqueue आदि का उपयोग)
- यूज़र्स सीधे नया
Io implementation लिख सकते हैं, जिससे execution mode पर fine-grained control मिलता है
कोड उदाहरण और काम करने का तरीका
- उदाहरण फ़ंक्शन
saveFile() फ़ाइल बनाता, लिखता और बंद करता है
Io.Threaded के साथ सामान्य system calls की तरह रन होता है
Io.Evented के साथ असिंक्रोनस backend पर रन होता है
- दोनों मामलों में
writeAll() कॉल करने पर ऑपरेशन पूरा होने की गारंटी रहती है
- वही कोड सिंक्रोनस/असिंक्रोनस दोनों environments में बिना बदलाव काम करता है
- लाइब्रेरी लेखक को execution mode के बारे में अलग से सोचना नहीं पड़ता
async() / concurrent() के साथ पैरलल रनिंग
async() फंक्शन असिंक्रोनस रन की request करता है, लेकिन Io.Threaded में तुरंत रन भी हो सकता है
Io.Evented में यह वास्तविक असिंक्रोनस रन बन जाता है और दो files एक साथ save की जा सकती हैं
concurrent() फंक्शन तब इस्तेमाल होता है जब real parallel execution की ज़रूरत हो
Io.Threaded में thread pool इस्तेमाल होता है
Io.Evented में यह async() की तरह ही हेंडल होता है
- गलत फंक्शन चुनना (
async की जगह concurrent) bug माना जाता है और भाषा स्तर पर इसे prevent नहीं किया जा सकता
कोड शैली और भाषा एकीकरण
- बिना किसी async-only सिंटैक्स के सामान्य Zig कोड शैली बरकरार रहती है
try, defer जैसी मौजूदा control-flow syntax वैसे की वैसे ही रहती है
- Andrew Kelley ने कहा, “यह standard Zig code की तरह पढ़ता है”
- उदाहरण के रूप में असिंक्रोनस DNS lookup implementation दिखाया गया
getaddrinfo() के विपरीत यह केवल पहला successful response लौटाता है और बाकी requests cancel कर देता है
आगे की योजना और वर्तमान स्थिति
Io.Evented अभी भी experimental phase में है और कुछ OS पर उपलब्ध नहीं है
- WebAssembly-compatible
Io implementation की planning है, और इससे जुड़ा फीचर development अभी बाकी है
Io से संबंधित 24 follow-up tasks मौजूद हैं और अधिकांश अभी अधूरे हैं
- Zig अभी 1.0 से पहले के चरण में है; मुख्य बचे हुए मुद्दों में async I/O और native code generation शामिल हैं
- इस डिजाइन से अपेक्षा है कि
I/O interface बदलने पर होने वाले code rewrite की frequency कम होगी
समुदाय चर्चा का सार
- कई टिप्पणियों में Zig का approach Rust के async/await मॉडल से सरल और अधिक flexible बताया गया
- Rust में कई executor मिलाकर इस्तेमाल करने पर complexity बढ़ती है
- Zig का
Io interface एकाधिक executor के coexist करने की संभावना देता है
- कुछ लोगों ने कहा कि कोड थोड़ा verbose हो सकता है
- लेकिन स्पष्ट API design से security, performance और testability पर बेहतर control मिलता है
- async execution और thread execution के अंतर, तथा stackful vs stackless coroutine implementation जैसे तकनीकी मुद्दों पर चर्चा जारी रही
- Zig का
Io बिना किसी language-level special handling के standard library extension के रूप में implement किया गया है
- भविष्य में stackless coroutine फीचर जोड़ा जाना है
निष्कर्ष
- Zig का नया async मॉडल language simplicity और high-performance I/O को साथ लेकर चलने का लक्ष्य रखता है
- function coloring समस्या का समाधान, सिंक्रोनस-असिंक्रोनस कोड का एकीकरण, और explicit control structure के जरिए इसे Zig 1.0 stabilization का एक महत्वपूर्ण चरण माना जा रहा है
अभी कोई टिप्पणी नहीं है.