- Zig 0.15 वर्ज़न में नया IO इंटरफ़ेस(std.Io.Reader, std.Io.Writer) पेश किया गया
- पुराने IO तरीके की जटिलता और performance issues को सुधारना इसका उद्देश्य था, लेकिन वास्तविक उपयोग को लेकर भ्रम पैदा हुआ
- tls.Client और buffer के उपयोग से जुड़ा असंगत parameter passing तरीका भ्रम को और बढ़ाता है
- बुनियादी usage example लागू करते समय भी कई buffer sizes, option fields तय करने जैसी जटिल आवश्यकताएँ मौजूद हैं
- आधिकारिक दस्तावेज़, code examples और convenience functions की कमी के कारण यह शुरुआती उपयोगकर्ताओं के लिए सहज नहीं है
Zig 0.15 में पेश किया गया नया IO इंटरफ़ेस और उसकी पृष्ठभूमि
- Zig 0.15 वर्ज़न में std.Io.Reader और std.Io.Writer नाम के नए IO types पेश किए गए
- पिछला IO इंटरफ़ेस performance problems, type mixing, और
anytype के अत्यधिक उपयोग के कारण जटिल हो गया था
- नए IO structure में interfaces के बीच स्पष्ट type separation और बेहतर performance प्रमुख लक्ष्य हैं
tls.Client और IO इंटरफ़ेस के उपयोग में वास्तविक समस्याएँ
- मौजूदा smtp library को अपडेट करते समय tls.Client.init फ़ंक्शन के उपयोग को लेकर भ्रम पैदा हुआ
- दस्तावेज़ों के अनुसार init फ़ंक्शन Reader और Writer pointers, तथा options set को arguments के रूप में लेता है
- Zig का net.Stream क्रमशः reader() और writer() methods के माध्यम से Stream.Reader/Writer लौटाता है
- लेकिन Stream.Reader/Writer और std.Io.Reader/Writer बिल्कुल एक जैसे types नहीं हैं, इसलिए conversion की ज़रूरत पड़ती है
- Reader के लिए
interface() method call करना पड़ता है, जबकि Writer के लिए &interface field का उपयोग करना होता है, इसलिए consistency की कमी महसूस होती है
buffer और option fields सेट करने की समस्या
stream.writer, stream.reader दोनों buffer को argument के रूप में लेते हैं
- Buffer को नए IO इंटरफ़ेस में एक अनिवार्य तत्व के रूप में उभारा गया है
tls.Client.init कॉल करते समय ca_bundle, host, write_buffer, read_buffer जैसी चार option fields अनिवार्य रूप से चाहिए होती हैं
- options parameter में दिए जाने वाले मानों और सीधे arguments के रूप में दिए जाने वाले मानों के बीच विभाजन का नियम अस्पष्ट लगता है
var tls_client = try std.crypto.tls.Client.init(
reader.interface(),
&writer.interface,
.{
.ca = .{.bundle = bundle},
.host = .{ .explicit = "www.openmymind.net" } ,
.read_buffer = &read_buf2,
.write_buffer = &write_buf2,
},
)
- वास्तव में यदि buffer pointers ठीक से न दिए जाएँ, तो program सही तरह से काम नहीं करता, hang हो सकता है, crash हो सकता है, या अन्य समस्याएँ आ सकती हैं
Reader उपयोग के समय सहजता की समस्या
tls.Client का reader field अपने आप में एक "decrypt किया गया stream" है, फिर भी वास्तव में std.Io.Reader में सामान्य read method मौजूद नहीं है
- इसके बजाय
peek, takeByteSigned, readSliceShort जैसे कम सहज methods ही उपलब्ध हैं
- उपयोग के सबसे क़रीब API वह है जिसमें stream method के ज़रिए buffer में data पढ़ा जाता है
var buf: [1024]u8 = undefined;
var w: std.Io.Writer = .fixed(&buf);
const n = try tls_client.reader.stream(&w, .limited(buf.len));
पूरा code example और व्यावहारिक समस्याएँ
- पूरी तरह काम करने वाला न्यूनतम example बनाना हो, तब भी options, buffer size, type conversion जैसी कई बातों पर ध्यान देना पड़ता है
- tests, documents, और examples की कमी के कारण सीखना कठिन हो जाता है और entry barrier बढ़ता है
- Zig भाषा के भीतर consistency या underlying design की समझ कम हो, तो कई बिंदु अजीब लगते हैं
- standard library के भीतर भी यह तरीका बहुत अधिक इस्तेमाल नहीं होता, इसलिए व्यावहारिक reference materials कम हैं
अनुभव और निष्कर्ष
std.fmt.printInt जैसी naming changes और API design में बदलाव के कारण migration प्रक्रिया खुद आसान नहीं है
reader.interface(), &writer.interface का तरीका, options pass करने का ढंग, और कई buffers की आवश्यकता जैसी बार-बार आने वाली कठिनाइयाँ महसूस हुईं
- TLS जैसे network/security protocols से परिचित न होने पर आवश्यकताओं को समझना और भी कठिन लगता है
- कुल मिलाकर, पुराने तरीके की तुलना में clarity, documentation, और convenience में सुधार के लिहाज़ से अभी भी कई कमियाँ मौजूद हैं
अभी कोई टिप्पणी नहीं है.