C सबसे बेहतरीन है (2025)
(sqlite.org)- SQLite 2000 से C भाषा में इम्प्लीमेंट किया गया एक हल्का डेटाबेस इंजन है, और इसे किसी दूसरी भाषा में दोबारा लिखने की कोई योजना नहीं है
- performance, compatibility, कम dependencies, और stability के लिहाज़ से C को SQLite के लिए सबसे उपयुक्त भाषा माना जाता है
- object-oriented भाषाएँ (C++, Java आदि) में भाषाओं के बीच कॉल करने की सीमाएँ ज़्यादा होती हैं, और procedural approach कई बार अधिक सरल और तेज़ हो सकती है
- Rust या Go जैसी ‘safe languages’ अभी पर्याप्त परिपक्व नहीं हैं, और SQLite की quality strategy (जैसे 100% branch testing, OOM recovery) से मेल नहीं खातीं
- आगे Rust में port करने की संभावना खुली है, लेकिन maturity, compatibility, performance, tool support जैसी कई शर्तें पूरी होनी चाहिए
1. C सबसे अच्छा विकल्प क्यों है
- SQLite को 29 मई 2000 को शुरुआत से ही साधारण C भाषा में इम्प्लीमेंट किया गया था, और अब तक किसी दूसरी भाषा में जाने की कोई योजना नहीं है
- SQLite के implementation के लिए C के उपयुक्त होने के कारण के रूप में performance, compatibility, कम dependency, stability बताए गए हैं
1.1 प्रदर्शन
- SQLite एक गहन रूप से इस्तेमाल होने वाली low-level library है, इसलिए तेज़ गति अनिवार्य है
- उदाहरण के तौर पर “Internal Versus External BLOBs”, “35% Faster Than The Filesystem” दस्तावेज़ों में performance साबित की गई है
- C को अक्सर ‘portable assembly language’ कहा जाता है, क्योंकि यह hardware के क़रीब नियंत्रण देता है और साथ ही platforms के बीच portability भी बनाए रखता है
- दूसरी भाषाएँ यह दावा करती हैं कि वे “C जितनी तेज़” हैं, लेकिन कोई भाषा यह दावा नहीं करती कि वह C से तेज़ है
1.2 संगतता
- लगभग हर system में C में लिखी गई libraries को कॉल करने की क्षमता होती है
- उदाहरण के लिए Android में Java applications adapter के ज़रिए SQLite को कॉल कर सकती हैं
- अगर SQLite Java में लिखा गया होता, तो Objective-C या Swift आधारित iPhone apps में उसका उपयोग संभव नहीं होता
1.3 कम dependency
- C में लिखी गई libraries की runtime dependencies बहुत कम होती हैं
- न्यूनतम configuration में SQLite को standard C library की सिर्फ़ इन functions की ज़रूरत होती है
- memcmp(), memcpy(), memmove(), memset(), strcmp(), strlen(), strncmp()
- full build में भी malloc(), free(), और file I/O जैसी चीज़ों का ही उपयोग होता है
- इसके विपरीत, आधुनिक भाषाओं को कई MB के runtime और हज़ारों interfaces की ज़रूरत होती है
1.4 स्थिरता
- C एक पुरानी और कम बदलने वाली भाषा है, जो स्पष्ट और पूर्वानुमेय व्यवहार देती है
- SQLite जैसे छोटे, तेज़ और भरोसेमंद डेटाबेस इंजन को विकसित करते समय यह महत्वपूर्ण है कि भाषा specification बार-बार न बदले
2. इसे object-oriented भाषा में क्यों नहीं लिखा गया
-
कुछ developers मानते हैं कि जटिल systems को केवल object-oriented भाषा में ही इम्प्लीमेंट किया जा सकता है, लेकिन SQLite ऐसा नहीं मानता
-
C++ या Java में लिखी गई libraries आम तौर पर केवल उसी भाषा में लिखे applications में इस्तेमाल की जा सकती हैं
- जबकि C libraries को लगभग हर भाषा से कॉल किया जा सकता है
-
object orientation एक design pattern है, भाषा स्वयं नहीं, और C में भी object-oriented structure इम्प्लीमेंट किया जा सकता है
-
object orientation हमेशा सबसे अच्छा विकल्प नहीं होता; कई बार procedural code अधिक सरल होता है और maintenance व performance के लिहाज़ से बेहतर होता है
-
SQLite के शुरुआती विकास काल (2000 के दशक की शुरुआत) में Java परिपक्व नहीं था, और C++ में compiler compatibility की समस्याएँ गंभीर थीं
- उस समय C साफ़ तौर पर बेहतर विकल्प था, और आज भी दोबारा लिखने का लाभ लगभग नहीं है
3. इसे ‘safe language’ में क्यों नहीं लिखा गया
- हाल के वर्षों में Rust, Go जैसी ‘safe languages’ पर ध्यान बढ़ा है, लेकिन SQLite अब भी C में ही बना हुआ है
- SQLite के शुरुआती 10 वर्षों में safe languages मौजूद ही नहीं थीं
- इसे Go या Rust में दोबारा लिखा जा सकता है, लेकिन नए bugs आने और गति कम होने का जोखिम रहेगा
- safe languages array bounds checks जैसी अतिरिक्त branches जोड़ती हैं
- सही code में वे branches चलती ही नहीं, इसलिए 100% branch testing संभव नहीं होती
- ज़्यादातर safe languages out-of-memory (OOM) होने पर program बंद कर देती हैं
- SQLite को OOM में भी सामान्य recovery के लिए डिज़ाइन किया गया है, इसलिए यह व्यवहार उससे टकराता है
- मौजूदा safe languages सभी नई हैं और तेज़ी से बदल रही हैं
- SQLite पुरानी और स्थिर भाषा को प्राथमिकता देता है
4. Rust में port करने की संभावना
- SQLite के Rust में दोबारा लिखे जाने की संभावना है, लेकिन Go में port करना लगभग असंभव है
- कारण: Go को assert() पसंद नहीं है
- Rust में port करने के लिए पूर्व शर्तें
- Rust और अधिक परिपक्व हो, और उसके बदलाव की गति धीमी होकर वह ‘पुरानी और स्थिर भाषा’ बन जाए
- Rust ऐसी general-purpose libraries बना सके जिन्हें हर भाषा से कॉल किया जा सके
- Rust ऐसा object code बना सके जो operating system के बिना embedded devices पर भी चल सके
- Rust के पास 100% branch coverage testing को support करने वाला tool ecosystem हो
- Rust OOM recovery mechanism प्रदान करे
- यह साबित हो कि वह C-स्तर की बिना performance loss वाली implementation दे सकता है
- जो developers मानते हैं कि Rust ये शर्तें पूरी करता है, वे SQLite टीम से सीधे संपर्क कर चर्चा कर सकते हैं
5. निष्कर्ष
- SQLite एक छोटा, तेज़ और भरोसेमंद डेटाबेस इंजन है, और C भाषा की विशेषताएँ उसके इस लक्ष्य से मेल खाती हैं
- object-oriented या safe languages में बदलाव का compatibility, performance, और quality control के लिहाज़ से कोई ठोस लाभ नहीं है
- C की सरलता और स्थिरता SQLite के दीर्घकालिक maintenance और reliability को मज़बूती देती है
8 टिप्पणियां
वैसे भी यह ऐसा प्रोजेक्ट है जो PR लेता ही नहीं, तो क्या... लोग वही इस्तेमाल कर रहे हैं जो वे खुद इस्तेमाल करना चाहते हैं।
अगर स्थिति compact है, तो C, C++, Rust की जगह लेने वाली कोई भाषा नहीं है। बस ऐसे developers बहुत कम हैं जो structure या map में bit-level overflow या hacking की चिंता करते हुए development करने की ज़रूरत को समझ सकें।
शीर्षक बहुत ज़्यादा उत्तेजक है। अगर आप मूल लेख देखें, तो यह इस बारे में है कि sqlite के development के लिए C सबसे उपयुक्त क्यों है। आप सब नाराज़गी छोड़ दें।
अरे, यहाँ तक कि यह लेख खुद भी 7 साल पहले लिखा गया था, है न? लगता है बाद में सामग्री जोड़ते हुए 2025 में कुछ हिस्से अपडेट किए गए हैं... 🤦
अलग-अलग development स्थितियों में उपयुक्त भाषा चुनने का फ़ैसला कर पाना ज़्यादा महत्वपूर्ण है; किसी एक भाषा को हमेशा सबसे अच्छा बताकर ऐसा शीर्षक लगाना सोच के स्तर को दिखाता है, जो मानो मिडिल स्कूल से आगे न बढ़ा हो...
मुझे लगता है कि C का सबसे बड़ा फायदा यह है कि यह सीधे उस मूल सच को छूती है कि 'कंप्यूटर बिटों की एक श्रृंखला है'। C की सरल philosophy और आक्रामक
reinterpret castingकी वजह से यह आकर्षण रहता है कि उपयोगकर्ता लगभग हमेशा समझ सकता है कि यह किस machine code में अनुवादित होगा। ऐसा नहीं है कि सिर्फ C होने की वजह से उसे हर भाषा से कॉल किया जा सकता है; कॉल किए जाने योग्य चीज़ ABI है, और C में यह केवल इसलिए संभव है क्योंकि यह अनुमान लगाया जा सकता है कि इनपुट-आउटपुट किस bit sequence का होगा (या होना चाहिए)। मुझे यह भी लगता है कि जब भी हम implementability पर चर्चा करते हैं, तब यह फर्क करना महत्वपूर्ण है कि कोई चीज़ Turing machine पर असंभव है, या सिर्फ उस भाषा या framework में असंभव है जिसका हम अभी उपयोग कर रहे हैं।Hacker News की राय
मेरा मानना है कि हर प्रोजेक्ट या प्रोग्रामर के लिए Rust या Zig का इस्तेमाल न करने को जस्टिफाई करने की ज़रूरत नहीं है
Hacker News या दूसरे प्लेटफ़ॉर्म्स पर इन भाषाओं को ज़रूरत से ज़्यादा आगे बढ़ाने की प्रवृत्ति दिखती है
अगर C से काफ़ी अच्छे नतीजे मिल रहे हैं और यूज़र्स भी संतुष्ट हैं, तो बाहर वालों के दखल देने का कारण नहीं है
टेक्नोलॉजी की प्रगति में रुचि रखने वाले लोगों का नई भाषाओं की संभावनाओं को खोजना एक नैसर्गिक प्रवाह है
लेकिन बाहर वालों को राय देने की आज़ादी है, प्रोजेक्ट पर उसे मानने की कोई बाध्यता नहीं है
Rust बग के उजागर होने को कम करता है, लेकिन उसी तरह के बग अब भी मौजूद रहते हैं
C डेवलपर्स आम तौर पर race condition के प्रति ज़्यादा संवेदनशील रहते हैं, जबकि Rust में ‘safe’ annotations पर ज़रूरत से ज़्यादा भरोसा करने का जोखिम हो सकता है
साथ ही Rust में बदलाव हमेशा सरल नहीं होते, इसलिए refactoring का बोझ बढ़ सकता है
आखिरकार Rust एक दिलचस्प भाषा है, लेकिन सर्वगुणसंपन्न नहीं, और इसे थोपना नहीं चाहिए
Rust या Zig जैसी भाषाओं में पारंपरिक object-oriented patterns से बाहर निकलने की मंशा दिखती है
OOP कभी ‘ज्ञानोदय’ जैसा एक आकर्षक वैचारिक ढाँचा था, लेकिन व्यवहार में यह जटिलता बढ़ाता है और अक्सर modularity को नुकसान पहुँचाता है
जैसे हाथ वाले drill की जगह electric drill का इस्तेमाल स्वाभाविक है, वैसे ही बेहतर tool हो तो उसका इस्तेमाल करना सामान्य है
लेकिन सुरक्षित C code लिखने के लिए tools और training को भी पर्याप्त रूप से विकसित होने की ज़रूरत है
मैं काफ़ी गंभीर Rustacean हूँ, लेकिन मुझे नहीं लगता कि हर प्रोजेक्ट को Rust में फिर से लिखना तर्कसंगत है
पहले से अच्छी तरह सत्यापित C प्रोजेक्ट्स को Rust में ले जाने पर अल्पकाल में उल्टा बग बढ़ने की संभावना ज़्यादा है
फिर भी कुछ लोग Rust rewrite की चुनौती ले रहे हैं, उदाहरण के लिए Limbo: SQLite को Rust में पूरी तरह से फिर से लिखने वाला प्रोजेक्ट
SQLite का एक बड़ा फ़ायदा यह है कि कई processes से एक साथ access किया जा सकता है, और यह हट जाए तो इसके उपयोग का दायरा सीमित हो जाता है
वे खुद नया version बनाकर उसकी सफलता को आज़मा सकते हैं
मुझे RediSearch को Rust में migrate करने का अनुभव है
ऐसा हाल के CVE vulnerabilities की अधिकता की वजह से किया गया था
अगर SQLite में ऐसी समस्या नहीं है, तो उसे Rust में ले जाने की वजह कमज़ोर है
Rust की ताकत और सीमाओं को समझने में शायद कई दशक लगेंगे
खासकर GUI applications में Rust की उपयोगिता अभी भी स्पष्ट नहीं है
Rust को उसी स्तर का भरोसा पाने में शायद 2040 तक का समय लग जाए
जैसा Linus ने कहा, Rust में OOM (Out of Memory) recovery mechanism की ज़रूरत है
इससे जुड़ी चर्चा LKML discussion link में देखी जा सकती है
embedded या kernel code में allocation functionality को पूरी तरह बंद भी किया जा सकता है
यानी Rust पहले से ही memory control पूरी तरह उपलब्ध कराता है
“C से तेज़ कोई general-purpose language नहीं है” वाला दावा developer time को नज़रअंदाज़ करने वाली अधूरी तुलना है
C में 5 घंटे लगाकर 4 सेकंड का प्रोग्राम बनाने से बेहतर, किसी दूसरी भाषा में 5 मिनट में 5 सेकंड का प्रोग्राम बनाना व्यवहारिक हो सकता है
जितने ज़्यादा यूज़र्स होंगे, उतना ही छोटे speed differences का cumulative value बढ़ेगा
Rust को ‘boring and stable’ भाषा बनने में अभी काफ़ी समय है
C को conservative committee संभालती है और compatibility का कड़ाई से पालन करती है, जबकि Rust समस्याएँ सुलझाने के लिए compatibility से ज़्यादा innovation को प्राथमिकता देता है
पुराने versions के code को नए compiler से भी लगातार build किया जा सकता है
मेरे हिसाब से यह C++ की तरह पुराने features को लगातार ढोते रहने से बेहतर है
इसके उलट C++ या Common Lisp जैसी committee-designed languages में जटिलता बढ़ी
Rust भी काफ़ी बड़ा हो चुका है, इसलिए embedded या core systems में इसे सावधानी से इस्तेमाल करना चाहिए
“जो ठीक चल रहा है उसे बेवजह मत तोड़ो” वाली सोच से मैं सहमत हूँ
भाषाओं के विकास का इतिहास बार-बार समस्याएँ सुलझाने की कोशिश में नई जटिलता पैदा करने जैसा लगता है
C, “Worse is Better” फ़िलॉसफ़ी का एक प्रमुख उदाहरण है, और अपनी सादगी की वजह से दशकों तक सफल रहा
Rust इसके उलट “Right Thing™” को लक्ष्य बनाता है
आज ज़्यादातर environments में चीज़ों को खुद implement करने का बोझ कम हो गया है, इसलिए अब यह बेहतर विकल्प हो सकता है
लेकिन पहले से सफल प्रोजेक्ट्स को ज़बरदस्ती migrate करने की ज़रूरत नहीं है
नए प्रोजेक्ट्स के लिए Rust बेहतर विकल्प होने की संभावना ज़्यादा है
C की सादगी और स्थिरता ऐसे फ़ायदे हैं जिनका कम आकलन किया जाता है
मेरा मानना है कि भाषा को बार-बार बदलने से बेहतर standard library या ecosystem को परिष्कृत करना है
सिर्फ़ सादगी ही नहीं, बल्कि deterministic behavior की गारंटी भी महत्वपूर्ण है
उदाहरण के लिए designated initializer, compound literal, alignas, memset_explicit जैसे features पसंद हैं
व्यक्तिगत रूप से मुझे अब भी C सबसे अच्छा लगता है
Rust में कई अच्छे ideas हैं, लेकिन यह स्पष्ट कमियों वाली भाषा भी है
अभी भी ऐसा माहौल है जहाँ Rust की समस्याओं पर ठंडे दिमाग़ से चर्चा करना आसान नहीं है
उदाहरण के लिए learning curve या packaging complexity जैसी बातें हो सकती हैं
“हर सिस्टम C libraries को कॉल कर सकता है” यह बात अब पूरी तरह सच नहीं रही
Rust और Zig भी इस requirement को पूरा करते हैं
लेकिन Rust की standard library अक्सर OOM की स्थिति में recovery के बजाय panic करती है, और इसकी documentation भी कमज़ोर है
extern "C"याexportलिखना पड़ता हैवरना ABI परिभाषित नहीं होता, और स्थिति C++ से भी ज़्यादा अस्थिर हो सकती है
खासकर Linux distributions में Rust crate वितरित करते समय यह समस्या और बड़ी हो सकती है