• 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 को मज़बूती देती है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.