SQLite को C में क्यों लिखा गया
(sqlite.org)- SQLite को performance, compatibility, कम dependencies और stability की वजह से शुरुआत (2000) से ही C भाषा में विकसित किया गया
- C लगभग हर OS और language में इस्तेमाल की जा सकती है, और खासकर low-level library के रूप में तेज़ execution को support करती है
- object-oriented languages की बजाय C चुनने का कारण extensibility, अलग-अलग languages से call किए जाने की सुविधा, और development के समय C++ और Java की अपरिपक्वता था
- SQLite की लगभग dependency-free single-file structure है, और यह C standard library के केवल न्यूनतम functions का इस्तेमाल करती है
- Rust और Go जैसी "safe languages" में rewrite करने पर चर्चा होती रही है, लेकिन quality control, performance, और library callability जैसे पहलुओं में अब भी C आगे है
1. C सबसे अच्छा विकल्प क्यों है
- SQLite को 29 मई 2000 को पहली बार विकसित किए जाने के बाद से अब तक C भाषा में ही बनाए रखा गया है
- फिलहाल इसे किसी दूसरी language में rewrite करने की कोई योजना नहीं है
- C में hardware के क़रीब नियंत्रण मिलता है और साथ ही portability भी बहुत अच्छी है, इसलिए इसे “portable assembly language” कहा जाता है
- दूसरी languages यह दावा कर सकती हैं कि वे “C जितनी तेज़” हैं, लेकिन C से तेज़ होने का दावा कोई language नहीं करती
1.1. Performance
- SQLite जैसी low-level library को बार-बार call किया जाता है, इसलिए इसका बहुत तेज़ चलना ज़रूरी है
- C भाषा तेज़ code लिखने के लिए उपयुक्त है, और portability के साथ hardware तक क़रीबी access भी देती है
- दूसरी modern languages भी ‘C जितनी तेज़’ होने का दावा करती हैं, लेकिन general-purpose programming में C से तेज़ होने को लेकर कोई language पूरी तरह आश्वस्त नहीं है
- C memory और CPU resources पर बारीक नियंत्रण देती है, इसलिए कभी-कभी यह file system से 35% तेज़ performance भी दिखाती है
- उदाहरण: Internal vs External BLOBs
1.2. Compatibility
- लगभग हर system C में लिखी गई libraries को call कर सकता है
- उदाहरण के लिए, Android (Java-आधारित) में भी adaptor के ज़रिए SQLite का उपयोग किया जा सकता है
- अगर SQLite को Java में लिखा गया होता, तो iPhone (Objective-C, Swift) पर उसका उपयोग संभव नहीं होता और उसकी सार्वभौमिक उपयोगिता काफ़ी घट जाती
1.3. कम dependencies
- C library के रूप में विकसित होने के कारण इसकी runtime dependencies बहुत कम हैं
- न्यूनतम configuration में यह standard C library के केवल बहुत बुनियादी functions (memcmp(), memcpy(), memmove(), memset(), strcmp(), strlen(), strncmp()) का ही उपयोग करती है
- ज़्यादा पूर्ण build में भी malloc(), free(), file I/O जैसी कुछ ही dependencies होती हैं
- modern languages में अक्सर कई बड़े runtimes और हज़ारों interfaces की आवश्यकता होती है
1.4. Stability
- C एक पुरानी और कम बदलने वाली, कुछ हद तक नीरस language है, लेकिन यही बात predictability और stability भी देती है
- SQLite जैसे छोटे, तेज़ और भरोसेमंद database engine के लिए ऐसी language उपयुक्त है जिसकी specification बार-बार न बदले
- अगर language की spec या implementation बार-बार बदलती रहे, तो वह SQLite की stability के लिए ठीक नहीं है
2. इसे object-oriented language में क्यों नहीं लिखा गया
- कुछ developers मानते हैं कि object-oriented approach के बिना SQLite जैसे complex system को implement करना मुश्किल है, लेकिन C की तुलना में C++ या Java में library बनाने पर उसे दूसरी languages से call करना कठिन हो जाता है
- Haskell, Java जैसी कई languages के support के लिए C library चुनना उचित था
- object-oriented एक language नहीं, बल्कि design pattern है, इसलिए यह किसी एक language तक सीमित नहीं है
- C में भी structs और function pointers से object-oriented patterns लागू किए जा सकते हैं
- object-oriented हमेशा सबसे अच्छा structure नहीं होता; कई बार procedural code ज़्यादा स्पष्ट, maintain करने में आसान और तेज़ परिणाम देने वाला होता है
- SQLite development के शुरुआती दौर (लगभग 2000) में
- Java अपरिपक्व था
- C++ में compilers के बीच compatibility की गंभीर समस्या थी
→ उस समय C सबसे व्यावहारिक और सुरक्षित विकल्प था
- आज भी SQLite को rewrite करने लायक़ लाभ पर्याप्त नहीं दिखता
3. इसे "safe language" में क्यों नहीं लिखा गया
- हाल के वर्षों में Rust, Go जैसी safe programming languages में रुचि बढ़ी है, लेकिन SQLite जब पहली बार विकसित हुई थी (पहले 10 वर्षों तक), तब ये मौजूद ही नहीं थीं
- Go या Rust में दोबारा लिखने पर bugs बढ़ सकते हैं, या performance घट सकती है
- ये languages memory checks जैसी अतिरिक्त branch code insert करती हैं, जबकि SQLite की quality strategy में 100% branch coverage बहुत महत्वपूर्ण है और यह पहलू अभी संतोषजनक नहीं है
- safe languages आमतौर पर out-of-memory स्थिति में program को terminate कर देती हैं, लेकिन SQLite को memory की कमी की स्थिति से भी recover करने के लिए design किया गया है
- Rust, Go आदि अब भी अपेाकृत नई languages हैं और इनमें लगातार development की आवश्यकता है
- इसलिए SQLite development team safe languages की प्रगति का समर्थन करती है, लेकिन SQLite implementation में अब भी सिद्ध C की स्थिरता को प्राथमिकता देती है
इसके बावजूद, भविष्य में कभी Rust में rewrite होने की संभावना हो सकती है। Go में assert() को पसंद नहीं किया जाता, इसलिए Go में लिखे जाने की संभावना कम है
- लेकिन Rust में लिखे जाने के लिए कुछ शर्तें होंगी:
- Rust और अधिक mature हो, और उसका बदलाव चक्र धीमा होकर वह “पुरानी और नीरस language” बन जाए
- यह साबित होना चाहिए कि उससे कई languages से call की जा सकने वाली सार्वभौमिक library बनाई जा सकती है
- embedded जैसे OS-विहीन devices पर चल सकने वाला object code तैयार किया जा सके
- compiled binary के लिए 100% branch coverage test tools उपलब्ध हों
- OOM (memory shortage) errors से recovery संभव हो
- SQLite में C जो कुछ भी करती है, वह सब Rust बिना performance loss के कर सके
- अगर कोई Rust enthusiast (rustacean) मानता है कि ऊपर की शर्तें पहले से पूरी हो चुकी हैं और SQLite को Rust में फिर से लिखना चाहिए, तो उसे SQLite developers से सीधे संपर्क कर अपनी राय रखने की सलाह दी जाती है
2 टिप्पणियां
Hacker News राय
if (i >= array_length) panic("index out of bounds")जैसे रक्षा-कोड जोड़ देता है, और उस कोड की खुद Rust compiler ने अच्छी तरह टेस्टिंग की होती है, इसलिए उसकी चिंता नहीं होनी चाहिए। मैं यह तर्क सही समझ रहा हूँ या नहीं, यही जानना चाहता हूँget_unchecked()जैसी विधि का उपयोग करके bounds check के बिना access भी किया जा सकता है, जिससे safety बनाए रखते हुए performance बढ़ाई जा सकती है get_unchecked दस्तावेज़if condition { panic(err) }को assert function की तरह इस्तेमाल नहीं किया जा सकता?SQLite के लिए भी C एक सुरक्षा जोखिम है — यह बात क्या तब भी लागू होती है, जब टेस्टिंग बहुत अच्छी तरह की गई हो और डेवलपर काफ़ी अनुभवी हों? समस्या logic और development process में हो सकती है, लेकिन भाषा खुद ही security vulnerability है — यह समझना मेरे लिए मुश्किल है। दरअसल, शायद ही कोई ऐसा प्रोग्राम हो जो C में लिखे गए infrastructure पर निर्भर न करता हो।