- Zig ने
build.zigऔर build system को अलग process में बांटने वाले flow के अनुरूप, package management logic को compiler executable से बाहर maker process में शिफ्ट किया zig build,zig fetch,zig init,zig libcके maker की ओर जाने के साथ HTTP, TLS, Git, compression,build.zig.zonhandling code source form में distribute किए जाते हैं- इस structure में compiler को rebuild किए बिना package management features को ठीक किया जा सकता है, और maker
ReleaseSafeमें compile होता है, जिससे networking tasks के लिए safety checks भी enabled होते हैं - मूल उद्देश्य build server protocol को expose करके ZLS को रोक रही
--build-runnerchange की समस्या सुलझाना है, और नए process tree में maker, configurer का parent बना रहता है, जिससे configuration rerun को अधिक स्थिर रूप से handle किया जा सकता है - Users पर असर बड़ा नहीं है, लेकिन Zig executable 14.1MiB से 13.5MiB होकर 4% छोटा होता है, और
--maker-optव--zig-lib-dirकी जगह क्रमशःZIG_DEBUG_MAKER,ZIG_LIB_DIRenvironment variables लेते हैं
Package management logic का स्थानांतरण
- Zig ने user
build.zigscript और build system के खुद अलग processes में बांटे जाने के बाद, package management logic को भी build system की तरफ रखने वाला structure अपनाया - maker process में शिफ्ट किए गए subcommands ये हैं
zig buildzig fetchzig initzig libc
Compiler executable से निकला code
- पहले compiler executable के अंदर मौजूद बड़े code areas अब source form में distribute किए जाते हैं
- Package fetch करने का logic
- HTTP client और networking
- TLS और संबंधित cryptography
- Git protocol
xz,gzip,zstd,flate,zipbuild.zig.zonfile की parsing, validation, और अन्य handling
- इन features को compiler को दोबारा build किए बिना patch किया जा सकता है, जिससे users और contributors के लिए experiment करना आसान होता है
- maker executable
ReleaseSafemode में compile होता है, इसलिए package management के networking tasks में safety checks enabled रहते हैं - Networking और file hashing में इस्तेमाल होने वाला cryptography code host पर उपलब्ध special CPU instructions का उपयोग कर सकता है
Process structure और build server
- मूल motivation build server protocol को expose करके ZLS को रोक रही समस्या को हल करना था
- पुराने structure में
zig buildcompiler और package manager दोनों की जिम्मेदारी लेता था, और उसके नीचे builder में userbuild.ziglogic और build system implementation होते थे - maker/configurer separation के बाद structure ऐसा था
zig build: compiler + package managerconfigurer: userbuild.ziglogicmaker: build system
- इस structure में लंबे समय तक चलने वाले
zig build --watchकोbuild.zigया related files में बदलाव detect होने पर configurer को फिर से run करना पड़ता था, और इसके लिए maker को exit करना होता था ताकिzig buildको package management logic repeat करने का मौका मिले - नए structure में
zig buildकेवल compiler संभालता है, और उसके नीचे maker build system और package manager को संभालता है, जबकि configurer maker का child process बनता है - Configuration को फिर से run करना पड़े तब भी maker parent process के रूप में लगातार alive रह सकता है
- Planned build server में server shutdown के बाद client के दोबारा connect करने के बजाय, client को configuration changes notify करने वाला structure संभव हो जाता है
दिखने वाले बदलाव
- अधिकतर बदलाव incompatible नहीं हैं, लेकिन users को दिखने वाले कुछ अंतर हैं
- Zig executable binary size: LLVM के बिना
ReleaseSmallके आधार पर 14.1MiB से 13.5MiB तक घटकर 4% कमी --maker-optflag की जगहZIG_DEBUG_MAKERenvironment variable लेता है--zig-lib-dirflag की जगहZIG_LIB_DIRenvironment variable लेता है
- Zig executable binary size: LLVM के बिना
Zig 0.17.0 से पहले बचे blocking issues
- इस set of changes के बाद बचे प्रमुख blocking issues Zig 0.17.0 tag से पहले के core tasks हैं
- जुलाई में दो conferences और presentations की तैयारी होने के कारण, इन tasks को finish करने का समय realistically अगस्त की शुरुआत होने की उम्मीद है
- ZLS team के Techatrix ने build server protocol work पर संपर्क और collaboration किया है, और sponsorship खोज रहे हैं
1 टिप्पणियां
Hacker News की राय
Zig, Go, Python के डेवलपर कभी-कभी घोषणा करते हैं कि उन्होंने फ्यूल टैंक से कूलेंट हटा दिया है, और समर्थक खुशी मनाते हैं कि यह भाषा के लिए अच्छा है और performance भी काफ़ी बेहतर होगी
लेकिन मुझे ज़्यादा उत्सुकता इस बात की है कि शुरुआत में कूलेंट को फ्यूल टैंक में रखा ही क्यों गया था
package management को compiler के अंदर रखना सुविधाजनक था, लेकिन जब भाषा और tooling व्यापक रूप से इस्तेमाल होने लगते हैं, तो जो feature किसी व्यक्ति के लिए फायदेमंद था वही adoption रोकने वाला debt बन जाता है
कई प्रोजेक्ट्स में developer “इसे सही ढंग से करने के लिए ज़रूरी कठिन काम” से बचने के लिए आसान रास्ता चुनते हैं, और चूंकि दूसरे लोग भी वह कठिन काम नहीं करना चाहते, वही प्रथा बन जाती है
अगर build system के अंदर package manager implement करते हुए उसे compiler में भी रखना हो, तो पहले यह तय करना होगा कि compiler और build system के बीच कैसी abstraction रखी जाए
इसका असर import system और भाषा के मूल हिस्सों पर भी पड़ता है, और इन हिस्सों को ठीक से design करना पड़ता है; बाद में इन्हें बदलना भी मुश्किल होता है
शुरुआत में package management और compiler को कसकर जोड़कर desired programmer experience से उल्टा design किया जाए, और बाद में implementation बदली जाए, तो users पर असर कम हो सकता है
खासकर Python का import system package management के कई तरीकों को accommodate करने के कारण बहुत complex और flawed हो गया है, ऐसा मुझे लगता है
इसके उलट Go को शुरू से package management को ध्यान में रखकर design किया गया, इसलिए import से जुड़ा syntax अपेक्षाकृत छोटा और साफ़ है। बेशक, मैं हर design decision से सहमत नहीं हूं
छोटे product में भी यह अनुमान लगाना मुश्किल होता है कि उसके components आपस में कैसे interact करेंगे, इसलिए बार-बार सुधार करना पड़ता है
अब सोचिए कि आप self-hosting C replacement language बना रहे हैं
speed gain जितना बड़ा होता है, लोग उतना खुश होते हैं, लेकिन ज़्यादातर optimization कोई चालाक technique नहीं होती; वह profiler से यह ढूंढना होता है कि “अरे, कूलेंट फ्यूल टैंक में नहीं होना चाहिए”
ज़्यादातर performance bottleneck hardware या समस्या की अपनी मूलभूत सीमा नहीं होते
result पाने के लिए न्यूनतम काम तो करना ही होता है, लेकिन applications धीमी लगभग हमेशा उस पर जोड़े गए फालतू सामान की वजह से होती हैं
Zig development सच में healthy माहौल जैसा लगता है
मैं LLM रोज़ इस्तेमाल करता हूं और मानता हूं कि कई तरह की समस्याओं में वे हैरान करने वाले तरीके से अच्छे हैं, लेकिन मैं LLM द्वारा बनाई गई programming language नहीं चाहता
programming language की हर code line, decision और trade-off मायने रखता है
सिर्फ vibe के आधार पर design और code की गई भाषा disaster होगी
किसी model ने कभी ऐसा code नहीं दिखाया जिससे मैं इसके उलट आश्वस्त हो सकूं। Fable भी पहले के best models से स्पष्ट रूप से बेहतर है, लेकिन बात वही है
model की अपनी कोई इच्छा नहीं होती, कोई meaningful राय नहीं होती, और उसे नहीं पता कि भाषा में comfort और discomfort क्या होता है। पर्याप्त complex GUI या CLI interface में भी यही बात है
Zig जैसी भाषा LLM से नहीं आ सकती, जब तक कि वह बस Zig की नकल न करे; और नकल भी होगी तो खराब copy होगी
यहां LLM से नकल करने का मतलब source tree को literally
cpकरना नहीं है, बल्कि LLM spec लिखे और दूसरा LLM उस spec के अनुसार भाषा implement करे—ऐसा हैमैंने bootloader बनाया और UEFI पर काम किया, और निजी तौर पर यह C की तुलना में कहीं आसान लगा
हालांकि नई और चमकदार चीज़ सीखने का मज़ा भी था, जिससे bias बढ़ गया होगा
सोच रहा हूं कि क्या यह वही बदलाव है जिसकी वजह से Zig में
@cImportको हटाकर build system में ले जाया गयायह पूरी तरह user experience का सवाल है, और समझता हूं कि build system और compiler को अलग करना maintainers के लिए महत्वपूर्ण है, फिर भी थोड़ा अफ़सोस है कि development stability user experience से पहले आ रही है
फैसला सही है, लेकिन दुखद है, और मुझे लगता है
@cImportइस भाषा का एक strong killer feature थायह बदलाव third-party packages download और extract करने वाले code से जुड़ा है
@cImportवाला बदलाव Zig की LLVM/libclang dependency को किसी दिन optional बनाने, और आगे चलकर third-party package में निकालने की कोशिश का हिस्सा था, लेकिन यह सीधे तौर पर संबंधित नहीं लगताकहीं पढ़ा था कि long-term goal build system को WebAssembly VM के अंदर ले जाना है
अगर ऐसा है तो यह कमाल की बात है
Zig के लिए अच्छा बदलाव है
Go से Zig पर जाने का मन काफ़ी करता है, लेकिन फिलहाल किनारे से देखना भी अच्छा लग रहा है
जब भी कोई भाषा अपना package system बनाती है, मुझे बस लगता है कि हमने कोई बड़ा मौका खो दिया
इकलौता exception C/C++ है, जहां अच्छा हो या बुरा, पर्याप्त रूप से स्थापित कुछ नहीं है
ऐसा चुनाव बाद में कई भाषाओं को मिलाकर इस्तेमाल करना पड़े तो बहुत complex process बना सकता है
packaging system काम आसान बनाते हैं, लेकिन जैसे ही आपको दूसरी भाषा इस्तेमाल करनी पड़ती है, आगे की प्रक्रिया और complex हो जाती है
क्या आप सभी भाषाओं के लिए एक build system चाहते हैं? Bazel जैसे system मौजूद हैं और multi-language projects में अक्सर इस्तेमाल होते हैं, लेकिन व्यवहार में language-specific knowledge वाले build system को संभालना कहीं आसान साबित हुआ लगता है
क्योंकि इससे dependency जोड़ने से पहले गंभीरता से सोचना पड़ता है
ऐसी dependencies में अक्सर security vulnerabilities जैसी छुपी लागतें होती हैं
कई critical systems C++ में लिखे गए हैं, इसलिए आसानी से उपलब्ध dozens third-party packages पर, हर package का ठीक से audit किए बिना निर्भर होना बहुत risky है
Zig उसी खाली जगह को भर रहा है
असल में ऐसे build systems सिर्फ Buck और Bazel हैं, लेकिन दोनों अपने पीछे मौजूद giant organizations का बहुत ज़्यादा baggage लेकर आते हैं
यह अफ़सोस की बात है
separation of concerns बहुत convincing तरीके से किया गया है