भाषा डिज़ाइन करना बंद करें, उसकी जगह लाइब्रेरी लिखें
(lbstanza.org)- प्रोग्रामिंग उत्पादकता का मूल भाषा से अधिक समृद्ध लाइब्रेरी ecosystem में है
- Ruby on Rails जैसे भाषा की उन्नत सुविधाओं का उपयोग करने वाले framework गैर-विशेषज्ञों को भी उच्च उत्पादकता देते हैं
- लेकिन भाषा की संरचनात्मक सीमाओं के कारण Rails स्तर का framework Java या C में लागू करना कठिन है
- भाषा डिज़ाइन सीधे यह तय करती है कि किस रूप और जटिलता की लाइब्रेरी लिखी जा सकती है, और यही भाषा विकास का मूल उद्देश्य है
- Stanza भाषा इस दृष्टिकोण से दिखाती है कि शक्तिशाली और उपयोग में आसान लाइब्रेरी बनाना संभव करने के लिए भाषा डिज़ाइन कितना महत्वपूर्ण है
प्रोग्रामिंग भाषाओं और लाइब्रेरी का संबंध
- अधिकांश प्रोग्रामिंग भाषाओं में variables, arrays, loops, functions जैसे समान बुनियादी तत्व होते हैं
- कुछ भाषाएँ first-class functions या coroutines जैसी उन्नत सुविधाएँ देती हैं, लेकिन गैर-विशेषज्ञ आमतौर पर उनका अच्छा उपयोग नहीं करते
- कई डेवलपर्स के लिए उत्पादकता बढ़ाने वाला कारक भाषा नहीं बल्कि लाइब्रेरी है
- उदाहरण के लिए, Ruby on Rails डेटाबेस-आधारित web applications को आसानी से बनाने देता है
- Rails की वजह से Ruby भाषा से अधिक framework के प्रति पसंद बनती है
Ruby on Rails और भाषा सुविधाओं की परस्पर क्रिया
- Rails, Ruby की metaprogramming, runtime evaluation, first-class functions, garbage collection जैसी कई सुविधाओं का उपयोग करता है
- उदाहरण: ActiveRecords metaprogramming का उपयोग करता है, और template system runtime evaluation का
- event handling, callback के रूप में first-class functions पास करके लागू की जाती है
- Java या C में ये सुविधाएँ पर्याप्त नहीं हैं, इसलिए Rails स्तर का framework लागू करना संभव नहीं
- Java की metaprogramming, ActiveRecords लागू करने जितनी शक्तिशाली नहीं है
- इसलिए Rails, Ruby भाषा की संरचना की वजह से संभव है, और भाषा डिज़ाइन लाइब्रेरी की संभावनाएँ तय करती है
भाषा डिज़ाइन लाइब्रेरी के रूप को तय करती है
- C भाषा केवल function declarations और calls के जरिए पुन: उपयोग का समर्थन करती है, इसलिए अधिकतर C libraries functions के संग्रह के रूप में होती हैं
- Ruby, first-class functions का समर्थन करती है, इसलिए “button click होने पर चलने वाला action” को संक्षेप में व्यक्त किया जा सकता है
- जबकि Java में handler class परिभाषित करनी पड़ती है, जिससे कोड जटिल हो जाता है
- भाषा की अभिव्यक्त क्षमता सीधे लाइब्रेरी की संरचना और उपयोगिता को निर्धारित करती है
इंटरैक्टिव software और विस्तार योग्य frameworks का उदय
- 1970 के दशक की batch computing में function-केंद्रित libraries पर्याप्त थीं
- आधुनिक इंटरैक्टिव software में extensible libraries की आवश्यकता होती है
- GUI या event-based systems में “user click करने पर मेरा code चलाओ” जैसी संरचना चाहिए
- Java और C++ inheritance और method overriding के जरिए विस्तार का समर्थन करते हैं, और यही संरचना आगे frameworks में विकसित हुई
Stanza डिज़ाइन की पृष्ठभूमि और भाषा की सीमाएँ
- Stanza के डिज़ाइन की प्रेरणा Java में उपयोग में आसान game programming library लिखने की कठिनाई से शुरू हुई
- Java में concurrency को state machine के रूप में व्यक्त करना पड़ता था
- Scheme, continuation का समर्थन करता है, इसलिए अधिक सहज implementation संभव है
- लेकिन Scheme static type checking का समर्थन नहीं करता, इसलिए debugging की दक्षता कम होती है
- वर्तमान में अधिकांश भाषाएँ type system को library के रूप में extend नहीं कर सकतीं
- Stanza, optional type system, garbage collection, multimethod-based object system प्रदान करता है
- लेकिन नया user-defined object system फिर से लिखना संभव नहीं है
भाषा का उद्देश्य और शोध की दिशा
- सामान्य-उद्देश्य प्रोग्रामिंग भाषा का उद्देश्य शक्तिशाली और उपयोग में आसान libraries के निर्माण का समर्थन करना है
- भाषा जितनी शक्तिशाली होगी, library का उपयोग उतना ही संक्षिप्त होगा
- जब code अच्छी तरह डिज़ाइन की गई library का उपयोग करता है, तो उसमें सहकर्मी को निर्देश देने वाले वाक्य जैसी स्वाभाविकता होती है
- Racket, Shen, meta object protocol पर शोध आदि विस्तार योग्य type और object systems की खोज कर रहे हैं
- अंततः भाषाओं का अंतर इस बात से तय होता है कि “कौन-सी libraries इस्तेमाल की जा सकती हैं, और कौन-सी नहीं”
- सुंदर libraries के पीछे दशकों का भाषा अनुसंधान और डिज़ाइन प्रयास मौजूद होता है
1 टिप्पणियां
Hacker News की टिप्पणियाँ
सबसे अच्छा उदाहरण Prolog है। इसे अक्सर logic programming की प्रतिनिधि भाषा कहा जाता है, लेकिन असल में यह कई algorithms का संग्रह भर है, और इन्हें अलग-अलग भाषाओं की library के रूप में implement किया जा सकता है। मुझे लगता है कि Prolog की syntactic expression को हर भाषा के syntax के अनुसार उपलब्ध करा देना काफी होगा
10 साल पहले मैं Scala का बड़ा प्रशंसक था। type system के अंदर DSL बनाने वाली “Scalable Language” की अवधारणा बहुत आकर्षक लगती थी। लेकिन जब community ने इसे JVM पर Haskell की तरह इस्तेमाल करना शुरू किया, तो मेरी दिलचस्पी कम हो गई। आजकल मुझे WASM और Graal जैसी तकनीकों से उम्मीद है कि वे भाषा चुनने में ज़्यादा flexibility देंगी। कई बार JS ही काफी होता है, लेकिन ज़रूरत पड़ने पर Rust जैसी low-level language इस्तेमाल कर पाने का विकल्प होना अच्छा है
अच्छा होगा अगर typed scripting language से bash को replace किया जा सके। मैंने Elixir में एक आसान JSON parser script लिखकर देखा, और अनुभव काफ़ी अच्छा था
#!/usr/bin/env ocamlसे सीधे चल जाता है। हाँ, single file में external dependencies को अपने-आप install करने की सुविधा नहीं हैभाषा और library एक-दूसरे के विरोधी नहीं हैं। कुछ libraries व्यवहार में भाषा की तरह काम करती हैं, और उल्टा कुछ भाषाएँ खास libraries के लिए design की जाती हैं। उदाहरण के लिए Julia performance और usability के बीच संतुलन का अच्छा उदाहरण है। high-performance code सीधे Julia में लिखा जा सकता है, और JIT-स्तर की type-specialized compilation से optimized execution मिलता है। ऊपर से यह simple function call model जैसा दिखता है, लेकिन अंदरूनी तौर पर बहुत sophisticated तरीके से काम करता है
Raku को कई sublanguages (slang) को जोड़ने वाली संरचना के रूप में design किया गया है। उदाहरण के लिए regex, PEG, quoting आदि को अलग-अलग mini-languages की तरह संभाला जाता है, और Slangify से अपना DSL आसानी से जोड़ा जा सकता है
पहले एक senior developer ने कहा था, “अगर resume में Rails दिखे तो मैं तुरंत फेंक देता हूँ।” इससे फिर महसूस हुआ कि लोगों का मूल्यांकन भाषा के आधार पर करना कितना मूर्खतापूर्ण है
भाषा या library आखिरकार मशीन और इंसान, दोनों से संवाद करने का माध्यम हैं। मशीन bits और voltage से संवाद करती है, और इंसान intent और concepts से। इसलिए अगर कोई भाषा या library इंसानों के लिए स्पष्ट और तेज़ अभिव्यक्ति का माध्यम देती है, तो वह भाषा है या library, यह उतना महत्वपूर्ण नहीं। Rails हो या Stanza, अगर वह उद्देश्य के अनुकूल है और टीम उसे आसानी से समझ सकती है, तो वही सही उत्तर है
मैं मानता हूँ कि “library ही आख़िरकार अंतिम भाषा बन जाती है।” उदाहरण के लिए Ruby on Rails, Ruby पर आधारित एक शानदार web service language है। Ruby और Rails एक-दूसरे के लिए साथ विकसित हुए हैं। अंततः programming भाषाओं के लगातार translation की प्रक्रिया ही है
“भाषा जितनी शक्तिशाली होगी, libraries का उपयोग उतना आसान होगा” — यह बात सही है। पुराने Java में Express जैसा framework बनाना कठिन था
अगर C language के लिए web framework चाहिए, तो PHP है न? ;)