7 पॉइंट द्वारा GN⁺ 2026-01-07 | 8 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 में ही बना हुआ है
  1. SQLite के शुरुआती 10 वर्षों में safe languages मौजूद ही नहीं थीं
    • इसे Go या Rust में दोबारा लिखा जा सकता है, लेकिन नए bugs आने और गति कम होने का जोखिम रहेगा
  2. safe languages array bounds checks जैसी अतिरिक्त branches जोड़ती हैं
    • सही code में वे branches चलती ही नहीं, इसलिए 100% branch testing संभव नहीं होती
  3. ज़्यादातर safe languages out-of-memory (OOM) होने पर program बंद कर देती हैं
    • SQLite को OOM में भी सामान्य recovery के लिए डिज़ाइन किया गया है, इसलिए यह व्यवहार उससे टकराता है
  4. मौजूदा safe languages सभी नई हैं और तेज़ी से बदल रही हैं
    • SQLite पुरानी और स्थिर भाषा को प्राथमिकता देता है

4. Rust में port करने की संभावना

  • SQLite के Rust में दोबारा लिखे जाने की संभावना है, लेकिन Go में port करना लगभग असंभव है
    • कारण: Go को assert() पसंद नहीं है
  • Rust में port करने के लिए पूर्व शर्तें
    1. Rust और अधिक परिपक्व हो, और उसके बदलाव की गति धीमी होकर वह ‘पुरानी और स्थिर भाषा’ बन जाए
    2. Rust ऐसी general-purpose libraries बना सके जिन्हें हर भाषा से कॉल किया जा सके
    3. Rust ऐसा object code बना सके जो operating system के बिना embedded devices पर भी चल सके
    4. Rust के पास 100% branch coverage testing को support करने वाला tool ecosystem हो
    5. Rust OOM recovery mechanism प्रदान करे
    6. यह साबित हो कि वह C-स्तर की बिना performance loss वाली implementation दे सकता है
  • जो developers मानते हैं कि Rust ये शर्तें पूरी करता है, वे SQLite टीम से सीधे संपर्क कर चर्चा कर सकते हैं

5. निष्कर्ष

  • SQLite एक छोटा, तेज़ और भरोसेमंद डेटाबेस इंजन है, और C भाषा की विशेषताएँ उसके इस लक्ष्य से मेल खाती हैं
  • object-oriented या safe languages में बदलाव का compatibility, performance, और quality control के लिहाज़ से कोई ठोस लाभ नहीं है
  • C की सरलता और स्थिरता SQLite के दीर्घकालिक maintenance और reliability को मज़बूती देती है

8 टिप्पणियां

 
ndrgrd 2026-01-10

वैसे भी यह ऐसा प्रोजेक्ट है जो PR लेता ही नहीं, तो क्या... लोग वही इस्तेमाल कर रहे हैं जो वे खुद इस्तेमाल करना चाहते हैं।

 
skrevolve 2026-01-09

अगर स्थिति compact है, तो C, C++, Rust की जगह लेने वाली कोई भाषा नहीं है। बस ऐसे developers बहुत कम हैं जो structure या map में bit-level overflow या hacking की चिंता करते हुए development करने की ज़रूरत को समझ सकें।

 
[यह टिप्पणी छिपाई गई है.]
 
aqqnucs 2026-01-08

शीर्षक बहुत ज़्यादा उत्तेजक है। अगर आप मूल लेख देखें, तो यह इस बारे में है कि sqlite के development के लिए C सबसे उपयुक्त क्यों है। आप सब नाराज़गी छोड़ दें।

 
aqqnucs 2026-01-08

अरे, यहाँ तक कि यह लेख खुद भी 7 साल पहले लिखा गया था, है न? लगता है बाद में सामग्री जोड़ते हुए 2025 में कुछ हिस्से अपडेट किए गए हैं... 🤦

 
wahihi 2026-01-08

अलग-अलग development स्थितियों में उपयुक्त भाषा चुनने का फ़ैसला कर पाना ज़्यादा महत्वपूर्ण है; किसी एक भाषा को हमेशा सबसे अच्छा बताकर ऐसा शीर्षक लगाना सोच के स्तर को दिखाता है, जो मानो मिडिल स्कूल से आगे न बढ़ा हो...

 
m00nny 2026-01-08

मुझे लगता है कि C का सबसे बड़ा फायदा यह है कि यह सीधे उस मूल सच को छूती है कि 'कंप्यूटर बिटों की एक श्रृंखला है'। C की सरल philosophy और आक्रामक reinterpret casting की वजह से यह आकर्षण रहता है कि उपयोगकर्ता लगभग हमेशा समझ सकता है कि यह किस machine code में अनुवादित होगा। ऐसा नहीं है कि सिर्फ C होने की वजह से उसे हर भाषा से कॉल किया जा सकता है; कॉल किए जाने योग्य चीज़ ABI है, और C में यह केवल इसलिए संभव है क्योंकि यह अनुमान लगाया जा सकता है कि इनपुट-आउटपुट किस bit sequence का होगा (या होना चाहिए)। मुझे यह भी लगता है कि जब भी हम implementability पर चर्चा करते हैं, तब यह फर्क करना महत्वपूर्ण है कि कोई चीज़ Turing machine पर असंभव है, या सिर्फ उस भाषा या framework में असंभव है जिसका हम अभी उपयोग कर रहे हैं।

 
GN⁺ 2026-01-07
Hacker News की राय
  • मेरा मानना है कि हर प्रोजेक्ट या प्रोग्रामर के लिए Rust या Zig का इस्तेमाल न करने को जस्टिफाई करने की ज़रूरत नहीं है
    Hacker News या दूसरे प्लेटफ़ॉर्म्स पर इन भाषाओं को ज़रूरत से ज़्यादा आगे बढ़ाने की प्रवृत्ति दिखती है
    अगर C से काफ़ी अच्छे नतीजे मिल रहे हैं और यूज़र्स भी संतुष्ट हैं, तो बाहर वालों के दखल देने का कारण नहीं है

    • नई भाषाओं का ध्यान खींचना स्वाभाविक है
      टेक्नोलॉजी की प्रगति में रुचि रखने वाले लोगों का नई भाषाओं की संभावनाओं को खोजना एक नैसर्गिक प्रवाह है
      लेकिन बाहर वालों को राय देने की आज़ादी है, प्रोजेक्ट पर उसे मानने की कोई बाध्यता नहीं है
    • Rust की डिज़ाइन फ़िलॉसफ़ी और हाल के Linux kernel में Rust bug के मामलों को देखें तो Rust कोई परफ़ेक्ट समाधान नहीं है
      Rust बग के उजागर होने को कम करता है, लेकिन उसी तरह के बग अब भी मौजूद रहते हैं
      C डेवलपर्स आम तौर पर race condition के प्रति ज़्यादा संवेदनशील रहते हैं, जबकि Rust में ‘safe’ annotations पर ज़रूरत से ज़्यादा भरोसा करने का जोखिम हो सकता है
      साथ ही Rust में बदलाव हमेशा सरल नहीं होते, इसलिए refactoring का बोझ बढ़ सकता है
      आखिरकार Rust एक दिलचस्प भाषा है, लेकिन सर्वगुणसंपन्न नहीं, और इसे थोपना नहीं चाहिए
    • आजकल उल्टा OOP को लेकर संदेह बढ़ रहा है
      Rust या Zig जैसी भाषाओं में पारंपरिक object-oriented patterns से बाहर निकलने की मंशा दिखती है
      OOP कभी ‘ज्ञानोदय’ जैसा एक आकर्षक वैचारिक ढाँचा था, लेकिन व्यवहार में यह जटिलता बढ़ाता है और अक्सर modularity को नुकसान पहुँचाता है
    • अगर Rust हर मायने में बेहतर है और बग कम करता है, तो लोगों का उसकी तारीफ़ करना अजीब नहीं है
      जैसे हाथ वाले drill की जगह electric drill का इस्तेमाल स्वाभाविक है, वैसे ही बेहतर tool हो तो उसका इस्तेमाल करना सामान्य है
    • हाल ही में अमेरिकी सरकार ने memory-safe न होने वाली भाषाओं (जैसे C) का इस्तेमाल बंद करने की सिफ़ारिश की है
      लेकिन सुरक्षित C code लिखने के लिए tools और training को भी पर्याप्त रूप से विकसित होने की ज़रूरत है
  • मैं काफ़ी गंभीर Rustacean हूँ, लेकिन मुझे नहीं लगता कि हर प्रोजेक्ट को Rust में फिर से लिखना तर्कसंगत है
    पहले से अच्छी तरह सत्यापित C प्रोजेक्ट्स को Rust में ले जाने पर अल्पकाल में उल्टा बग बढ़ने की संभावना ज़्यादा है
    फिर भी कुछ लोग Rust rewrite की चुनौती ले रहे हैं, उदाहरण के लिए Limbo: SQLite को Rust में पूरी तरह से फिर से लिखने वाला प्रोजेक्ट

    • Limbo दिलचस्प है, लेकिन multi-process access न होना एक बड़ी सीमा है
      SQLite का एक बड़ा फ़ायदा यह है कि कई processes से एक साथ access किया जा सकता है, और यह हट जाए तो इसके उपयोग का दायरा सीमित हो जाता है
    • Rust डेवलपर्स को बेवजह SQLite की मंज़ूरी का इंतज़ार करने की ज़रूरत नहीं है
      वे खुद नया version बनाकर उसकी सफलता को आज़मा सकते हैं
    • व्यक्तिगत रूप से मुझे SQLite को port करने के बजाय Rust में नई embedded DB बनाना ज़्यादा तर्कसंगत लगता है
    • Limbo कैसे आगे बढ़ता है, यह देखने लायक होगा
  • मुझे RediSearch को Rust में migrate करने का अनुभव है
    ऐसा हाल के CVE vulnerabilities की अधिकता की वजह से किया गया था
    अगर SQLite में ऐसी समस्या नहीं है, तो उसे Rust में ले जाने की वजह कमज़ोर है
    Rust की ताकत और सीमाओं को समझने में शायद कई दशक लगेंगे
    खासकर GUI applications में Rust की उपयोगिता अभी भी स्पष्ट नहीं है

    • C की स्थिरता और उसका ‘boring’ होना कई दशकों के trial and error का नतीजा है
      Rust को उसी स्तर का भरोसा पाने में शायद 2040 तक का समय लग जाए
    • SQLite जैसे सिस्टम्स के लिए Ada/SPARK जैसी भाषाएँ अधिक उपयुक्त हो सकती हैं
  • जैसा Linus ने कहा, Rust में OOM (Out of Memory) recovery mechanism की ज़रूरत है
    इससे जुड़ी चर्चा LKML discussion link में देखी जा सकती है

    • लेकिन Rust की भाषा-विशेषताएँ मूल रूप से stack allocation केंद्रित हैं, इसलिए यह सीधे malloc को कॉल नहीं करती
      embedded या kernel code में allocation functionality को पूरी तरह बंद भी किया जा सकता है
      यानी Rust पहले से ही memory control पूरी तरह उपलब्ध कराता है
    • (एक तरफ़ की बात) उस पेज के CSS को बेहतर बनाने वाला code भी साझा किया गया था
    • Linus की बात सही है, लेकिन अपनी तरफ़ की समस्याओं को भी व्यवस्थित करने की ज़रूरत है
  • “C से तेज़ कोई general-purpose language नहीं है” वाला दावा developer time को नज़रअंदाज़ करने वाली अधूरी तुलना है
    C में 5 घंटे लगाकर 4 सेकंड का प्रोग्राम बनाने से बेहतर, किसी दूसरी भाषा में 5 मिनट में 5 सेकंड का प्रोग्राम बनाना व्यवहारिक हो सकता है

    • लेकिन SQLite जैसे ऐसे software जहाँ user CPU time बहुत ज़्यादा हावी होता है, वहाँ C की efficiency कहीं ज़्यादा महत्वपूर्ण है
      जितने ज़्यादा यूज़र्स होंगे, उतना ही छोटे speed differences का cumulative value बढ़ेगा
    • अंततः अगर user time को महत्व दिया जाए, तो C की performance optimization अब भी बहुत मायने रखती है
  • Rust को ‘boring and stable’ भाषा बनने में अभी काफ़ी समय है
    C को conservative committee संभालती है और compatibility का कड़ाई से पालन करती है, जबकि Rust समस्याएँ सुलझाने के लिए compatibility से ज़्यादा innovation को प्राथमिकता देता है

    • Rust भाषा खुद कभी-कभी compatibility तोड़ती है, लेकिन उसका tooling ecosystem स्थिर है
      पुराने versions के code को नए compiler से भी लगातार build किया जा सकता है
    • Rust पुराने code को पुराने compiler से अपने-आप संभालकर legacy burden कम करने का तरीका चुनता है
      मेरे हिसाब से यह C++ की तरह पुराने features को लगातार ढोते रहने से बेहतर है
    • C का conservative होना कोई ‘अजीब’ बात नहीं, बल्कि stability का प्रतीक है
    • C को मूल रूप से एक मज़बूत राय वाले व्यक्ति ने डिज़ाइन किया था, इसलिए उसकी दिशा स्पष्ट थी
      इसके उलट C++ या Common Lisp जैसी committee-designed languages में जटिलता बढ़ी
      Rust भी काफ़ी बड़ा हो चुका है, इसलिए embedded या core systems में इसे सावधानी से इस्तेमाल करना चाहिए
    • Rust भी कभी न कभी स्थिर चरण में पहुँच सकता है
  • “जो ठीक चल रहा है उसे बेवजह मत तोड़ो” वाली सोच से मैं सहमत हूँ
    भाषाओं के विकास का इतिहास बार-बार समस्याएँ सुलझाने की कोशिश में नई जटिलता पैदा करने जैसा लगता है

    • Mozilla ने Rust को C++ की समस्याओं की वजह से बनाया, लेकिन Rust सिर्फ़ C++ का विकल्प नहीं है
      C, “Worse is Better” फ़िलॉसफ़ी का एक प्रमुख उदाहरण है, और अपनी सादगी की वजह से दशकों तक सफल रहा
      Rust इसके उलट “Right Thing™” को लक्ष्य बनाता है
      आज ज़्यादातर environments में चीज़ों को खुद implement करने का बोझ कम हो गया है, इसलिए अब यह बेहतर विकल्प हो सकता है
      लेकिन पहले से सफल प्रोजेक्ट्स को ज़बरदस्ती migrate करने की ज़रूरत नहीं है
      नए प्रोजेक्ट्स के लिए Rust बेहतर विकल्प होने की संभावना ज़्यादा है
  • C की सादगी और स्थिरता ऐसे फ़ायदे हैं जिनका कम आकलन किया जाता है
    मेरा मानना है कि भाषा को बार-बार बदलने से बेहतर standard library या ecosystem को परिष्कृत करना है

    • फिर भी C में अब भी बहुत सा UB (undefined behavior) है, इसलिए सावधानी ज़रूरी है
      सिर्फ़ सादगी ही नहीं, बल्कि deterministic behavior की गारंटी भी महत्वपूर्ण है
    • मुझे Clojure जैसी सरल, सुरुचिपूर्ण और स्थिर भाषाएँ पसंद हैं
    • C में नए features जुड़ते भी हैं तो वे ज़्यादातर बिना विवाद के व्यावहारिक सुधार होते हैं
      उदाहरण के लिए designated initializer, compound literal, alignas, memset_explicit जैसे features पसंद हैं
  • व्यक्तिगत रूप से मुझे अब भी C सबसे अच्छा लगता है
    Rust में कई अच्छे ideas हैं, लेकिन यह स्पष्ट कमियों वाली भाषा भी है
    अभी भी ऐसा माहौल है जहाँ Rust की समस्याओं पर ठंडे दिमाग़ से चर्चा करना आसान नहीं है

    • अगर Rust की कमियों को ठोस रूप से बताया जाए तो चर्चा ज़्यादा उत्पादक हो सकती है
      उदाहरण के लिए learning curve या packaging complexity जैसी बातें हो सकती हैं
    • “Rust एक भयानक भाषा है” जैसे दावे के लिए ठोस आधार चाहिए
  • “हर सिस्टम C libraries को कॉल कर सकता है” यह बात अब पूरी तरह सच नहीं रही
    Rust और Zig भी इस requirement को पूरा करते हैं
    लेकिन Rust की standard library अक्सर OOM की स्थिति में recovery के बजाय panic करती है, और इसकी documentation भी कमज़ोर है

    • Rust और Zig में C ABI compatibility के लिए स्पष्ट रूप से extern "C" या export लिखना पड़ता है
      वरना ABI परिभाषित नहीं होता, और स्थिति C++ से भी ज़्यादा अस्थिर हो सकती है
      खासकर Linux distributions में Rust crate वितरित करते समय यह समस्या और बड़ी हो सकती है