- Zig compiler की type resolution logic को पूरी तरह से फिर से डिज़ाइन किया गया है, जिससे इसकी आंतरिक संरचना सरल हुई है और यूज़र को भी दिखने वाले सुधार मिले हैं
- नई डिज़ाइन type field analysis को lazy तरीके से संभालती है, इसलिए uninitialized type की विस्तृत संरचना को अनावश्यक रूप से जाँचा नहीं जाता
- dependency loop error message को अधिक ठोस बनाया गया है, ताकि लूप के कारण को स्पष्ट रूप से समझा जा सके
- incremental compilation फीचर में ज़रूरत से ज़्यादा analysis की समस्या और कई bugs को ठीक किया गया है, जिससे build speed में काफ़ी सुधार हुआ है
- इस बदलाव में दर्जनों bug fixes और छोटे language improvements शामिल हैं, जो कुल मिलाकर Zig compiler की performance और developer experience को मजबूत करते हैं
टाइप रिज़ॉल्यूशन लॉजिक का पुनःडिज़ाइन
- लगभग 30,000 lines वाले PR को merge किया गया है, जिसमें Zig compiler की type resolution logic को अधिक तार्किक और सहज संरचना में फिर से लिखा गया है
- इस प्रक्रिया में compiler की आंतरिक संरचना को व्यवस्थित किया गया, और इसका सीधा लाभ यूज़र को भी मिलता है
- compiler को type field analysis को lazy evaluation के साथ करने के लिए बदला गया है, इसलिए uninitialized type की विस्तृत संरचना को अनावश्यक रूप से नहीं खंगाला जाता
- उदाहरण कोड में, यदि
@compileError field वाला struct केवल namespace के रूप में इस्तेमाल हो, तो पहले compile error आता था, लेकिन अब यह सामान्य रूप से compile हो जाता है
- इससे
std.Io.Writer जैसे namespace-प्रकार के type का उपयोग करते समय अनावश्यक code dependency से बचाव होता है
dependency loop error message में सुधार
- पहले dependency loop error message अस्पष्ट हुआ करता था, लेकिन अब यह लूप के कारण और स्थान को स्पष्ट रूप से दिखाता है
- उदाहरण कोड में, जब
Foo और Bar struct एक-दूसरे को refer करते हैं, तो error message हर type की dependency location को विस्तार से दिखाता है
- message में loop length, हर field declaration की location, और alignment query की location शामिल होती है
- जटिल loops में भी यह पर्याप्त जानकारी देता है, जिससे समस्या की जड़ को आसानी से समझा जा सकता है
incremental compilation performance में सुधार
- इस बदलाव से incremental compilation फीचर के कई bugs ठीक किए गए हैं
- खास तौर पर “over-analysis” समस्या को हल किया गया है, ताकि केवल बदले हुए हिस्से को फिर से compile किया जाए
- नतीजतन, कई मामलों में compilation speed में बड़ा सुधार हुआ है
- डेवलपर्स Zig 0.15.1 या उससे ऊपर के version में incremental compilation को सक्षम करके बेहतर developer experience का लाभ ले सकते हैं
अन्य सुधार
- इस PR में दर्जनों bug fixes, छोटे language changes, और compiler performance improvements शामिल हैं
- इनमें से ज़्यादातर बारीक या विशेष मामलों से जुड़े हैं
- पूरे बदलाव की सूची Codeberg के PR #31403 में देखी जा सकती है
- नया bug मिलने पर issue report करने की सिफारिश की गई है
बदलाव का महत्व
- type resolution logic के सरलीकरण और incremental compilation optimization से Zig compiler की stability और efficiency मजबूत हुई है
- डेवलपर्स को अब तेज़ और अधिक स्पष्ट feedback मिलेगा, और बड़े codebase में भी productivity बढ़ने की उम्मीद की जा सकती है
1 टिप्पणियां
Hacker News की राय
मैं इस devlog का लेखक हूँ
भाषा बदलावों से होने वाले compatibility breakage को लेकर चिंता समझ में आती है, लेकिन मैं यह स्पष्ट करना चाहता हूँ कि इस बार compiler में हुआ बदलाव इतना व्यापक असर डालने वाला नहीं है
उदाहरण के लिए, ZLS को नई branch पर build करते समय सिर्फ
.{}को.emptyमें बदलने जैसा मामूली बदलाव करना पड़ा। यहstd.ArrayListके default value हटने की वजह से था, और यह पहले से ही 1 साल से deprecated थाAwebo प्रोजेक्ट में भी पूरे dependency tree में सिर्फ तीन जगह बदलाव करने पड़े —
.emptyबदलाव,comptimeजोड़ना, औरorelse @alignOf(T)जोड़नाऐसे बदलाव ज़्यादातर Zig developers के लिए लगभग स्वचालित रूप से किए जाने लायक सरल बदलाव हैं
इस PR का मुख्य बिंदु breakage नहीं, बल्कि bug fixes और incremental compilation improvements है
मुझे लगता है कि PR की quality और planning बहुत उच्च स्तर की है, और लेखक की मेहनत को कमतर दिखाने का मेरा बिल्कुल इरादा नहीं था
बस इससे यह सीख मिली कि आगे मुझे और ज़्यादा टिप्पणियाँ जोड़कर, और सावधानी से अपनी राय रखनी चाहिए
lib/std/multi_array_list.zigमें जो comment जोड़ा गया है, उसे देखकर एक सवाल उठासमझ नहीं आ रहा कि
@alignOf(T)कोMultiArrayList(T)की definition में इस्तेमाल करने से circular dependency क्यों बनती हैअगर
T,MultiArrayListखुद भी हो, तो क्या वह पूरी तरह अलग monomorphic type नहीं होगा? लगता है मैं कुछ मिस कर रहा हूँसंबंधित कोड: लिंक
मैं जानना चाहता हूँ कि production environment में Zig इस्तेमाल करने वालों का अनुभव कैसा है
भाषा में बार-बार बदलाव होते हैं, तो update cycle या rewrite cycle कैसी रहती है, और क्या dependency packages कभी language version से पीछे रह जाते हैं
Bun के Zig इस्तेमाल के बारे में तो पता है, लेकिन दूसरे उदाहरण भी सुनना चाहूँगा
पिछले 1–2 साल में भाषा और standard library के बदलाव बिना किसी बड़े मुद्दे के आगे बढ़े हैं
पहले upgrades झंझट वाले होते थे, लेकिन अब वे बस “थोड़ी असुविधा” जैसे लगते हैं
अगर कोई Zig इस्तेमाल का अनुभव पूछे, तो यह हिस्सा इतना स्थिर है कि लगभग इसका ज़िक्र भी नहीं करता
ऐसे बड़े प्रोजेक्ट tagged releases के आधार पर upgrade करते हैं, और आम तौर पर कुछ दिन से कुछ हफ्तों में migration पूरा कर लेते हैं
dependencies भी बहुत कम होती हैं, इसलिए upgrade का बोझ ज़्यादा नहीं होता
लेकिन कभी-कभी मामूली typo से SIGBUS compiler crash हो जाता है, जिससे debugging मुश्किल हो जाती है
.zig-cache173GB तक बढ़ गया था, जिससे ARM VPS पर समस्याएँ हुईंlightpandaको 0.14→0.15 पर ले जाना आसान रहा। 0.16 में भी शायद कोई बड़ा मुद्दा नहीं होगालेकिन library developer के रूप में 0.16 के तेज़ बदलावों की रफ़्तार पकड़ना मुश्किल है
अभी सिर्फ “dev” branch पर प्रयोगात्मक रूप से support कर रहा हूँ
मैंने Node.js/TypeScript module को Zig में rewrite किया, और वह 2 गुना तेज़ हो गया, जबकि memory usage 70% कम हो गया
Zig का
sqlite/JSONserialization support काफ़ी मज़बूत है, जो बड़ा फ़ायदा रहाकमी यह है कि closure या vtable syntax की अनुपस्थिति की वजह से code layering करना मुश्किल होता है
Arcsऔर bumper allocator का इस्तेमाल करके memory safety सुनिश्चित की, और DebugSafe mode में ही चलाते रहने का इरादा हैReleaseFast में बदलने पर 25% speedup मिला, लेकिन safety खोने जितना फ़ायदा नहीं लगा
भले ही code बदलना पड़े, लंबे समय में यह सही तरीका है
Zig टीम की उपलब्धियों से मैं प्रभावित हूँ
मैं Zig में बना ghostty terminal अक्सर इस्तेमाल करता हूँ, और वह बहुत स्थिर है
लेकिन निजी तौर पर मैं Rust को पसंद करता हूँ
Rust “closed world” model अपनाता है, जबकि Zig “open world” model चुनता है
Rust में trait को explicitly implement करना पड़ता है, लेकिन Zig में type का shape मेल खा जाए तो वह काम करता है
इससे Zig में शक्तिशाली metaprogramming संभव होती है, लेकिन type inference अस्पष्ट हो जाने से autocomplete, documentation, और LSP support मुश्किल हो जाते हैं
आपकी बात सुनकर यह Go के interface जैसा लग रहा है, लेकिन मेरी समझ से Zig में इसका सीधा समकक्ष concept नहीं है
kernel32सेNtdllमें बदलाव दिलचस्प लगायह Linux user-space API पर भी लागू होने वाला विचार है
खासकर kernel-user boundary पर error handling का तरीका मिलता-जुलता है
लेकिन Linux में libc और kernel काफ़ी गहराई से जुड़े हुए हैं, इसलिए
errnoका इस्तेमाल ज़रूरी हो जाता हैWindows में भी यह pattern क्यों बना, यह जानने की उत्सुकता है
errnoयाGetLastError()pattern thread से पहले के युग की विरासत हैंपहले cooperative scheduling होती थी, इसलिए global variable सुरक्षित माने जाते थे, लेकिन multi-core और threads आने के बाद यह ख़तरनाक हो गया
इसलिए thread local उसका विकल्प बनकर आया
types को namespace की तरह इस्तेमाल करने के बजाय, क्या भाषा में explicit namespace जोड़ना बेहतर नहीं होगा?
अगर कोई feature कई जगह optimization देता हो, तो वही समय होता है जब उसे जोड़ा जाता है
Zig में
@importकिसी file को struct में बदल देता है, और namespace को बस nested struct के रूप में व्यक्त किया जाता हैयानी namespace वास्तव में एक और import ही है
(अभी coffee पूरी नहीं हुई है, इसलिए शुद्धता की गारंटी नहीं)
भाषा बदलाव की चर्चाओं में एक पहलू अक्सर नज़रअंदाज़ हो जाता है — यानी ecosystem पर असर
अगर भाषा बार-बार टूटती है, तो सिर्फ apps नहीं बल्कि libraries, tools, tutorials वगैरह को भी लगातार साथ चलना पड़ता है
नतीजतन ecosystem “एक बार बनाकर छोड़ दी गई” libraries के बजाय actively maintained projects की ओर झुकने लगता है
शुरुआती language design phase में यह एक उचित trade-off हो सकता है, लेकिन लंबे समय में इसका असर ecosystem growth पर पड़ता है
दूसरी नई भाषाएँ ऐसे change fatigue को कम करने पर काफ़ी मेहनत करती हैं
Zig का यह approach क्या नतीजे लाता है, यह देखना भी दिलचस्प होगा
Blender अक्सर API break करता है, लेकिन ज़्यादातर fixes मामूली होती हैं
फिर भी किसी न किसी को उन्हें ठीक करना पड़ता है, और maintenance रुक जाए तो user को ख़ुद patch करना पड़ता है
paid addons के बने रहने की संभावना ज़्यादा होती है, लेकिन वह भी गारंटी नहीं है
जो libraries maintain नहीं होतीं, वे वैसे भी खराब code हैं
Zig की आलोचना करने के बजाय, दूसरी भाषाओं (जैसे C3) का प्रचार करना बंद करना चाहिए
Zig के PR में जो लिखा था कि “Chromium, boringssl, Firefox, Rust, advapi32.dll के SystemFunction036 को call करते हैं” — वह सही नहीं है
ये पहले से ही ProcessPrng इस्तेमाल कर रहे हैं, और Windows 10 के बाद यह fail नहीं होता
इसका संबंधित आधार Microsoft whitepaper में है
RNG request कभी fail न हो, इस तरह इसे design किया गया है, और failure होने पर process को ही terminate कर दिया जाता है
यानी high-quality randomness की गारंटी के लिए यह error code लौटाता ही नहीं
Zig की language semantics ऊपर से सरल दिखती हैं, लेकिन उनके interaction काफ़ी सूक्ष्म हैं
लगता है कि समय के साथ इससे C++ template rules की तरह जटिल edge cases पैदा हो सकते हैं
30 हज़ार lines वाला PR अपने आप में बड़ी उपलब्धि है
लेकिन language semantics बदलना बहुत गंभीर बात है, इसलिए मैं चौंक गया
समझता हूँ कि Zig अभी 1.0 से पहले है और बदलाव तेज़ी से हो रहे हैं, लेकिन “इस branch में semantics बदल दिए” जैसी casual phrasing थोड़ा अजीब लगी
क्या इतने बड़े बदलाव Zig की अपनी संस्कृति का हिस्सा हैं, या फिर मैं ही समय से पीछे हूँ, यह जानना चाहता हूँ
“modern Zig” जैसा वाक्यांश भी भाषा के तेज़ बदलावों की वजह से थोड़ा मज़ेदार लगा
devlog कोई marketing post नहीं, बल्कि insiders के लिए record के ज़्यादा क़रीब है, और Zig अभी 1.0 नहीं है
PR में पर्याप्त context और rationale मौजूद है
Zig चुनते समय आपने एक हद तक language change risk स्वीकार ही किया है
बल्कि इस चरण में चीज़ों को साफ़-सुथरा करना लंबे समय में फ़ायदेमंद है
(C के bitwise operator precedence जैसी ऐसी विरासतों को याद कीजिए जिन्हें बाद में ठीक नहीं किया जा सकता)
mluggZig के core contributor और Zig Foundation के सदस्य हैंयह बदलाव circular dependency को सुलझाने और type system को व्यवस्थित करने के लिए है
संबंधित प्रस्ताव #3257 और #15909 में खुले रूप से मौजूद हैं
इस बदलाव से Zig का type resolution DAG(Directed Acyclic Graph) संरचना में व्यवस्थित हो जाता है, जिससे compiler stability काफ़ी बेहतर होती है
Zig को BDFN(Benevolent Dictator For Now) model पर चलाया जाता है, और अंतिम निर्णय Andrew Kelley के पास है
लेकिन टीम एक non-profit organization के रूप में user trust और language quality को सबसे ऊपर रखती है
निजी तौर पर Matthew के साथ काम करना मेरे लिए बड़े सम्मान की बात है
औपचारिक रूप से परिष्कृत होने के बावजूद, व्यवहार में अराजक भाषा रहे C की याद दिलाता है