यह कहना थोड़ा कठिन है क्योंकि ये शब्द अच्छी तरह से परिभाषित नहीं हैं। आम बोलचाल में, मुझे लगता है कि Node.js को एक ढांचा कहना थोड़ा सा असामान्य है, निश्चित रूप से, लेकिन मेरे पास एक कठिन समय होगा क्योंकि यह वास्तव में ऐसा नहीं है।
यह सब पासा जाता है, और मैं अक्सर भाषा के बहुत खराब उपयोग देखता हूं, इसलिए मैं स्पष्ट और नीचे से शुरू करूंगा
जावास्क्रिप्ट एक कंप्यूटर भाषा है, जिसे कहना है, संकीर्ण रूप से, सम्मेलनों का एक सेट जो हमें पाठ का एक गुच्छा पढ़ने और व्याख्या करने के लिए अनुमति देता है, जिसमें " अर्थ -निर्देश के रूप में भाषा की व्याख्या करने के तरीके" के लिए निष्पादन शब्दार्थ -फैंसी शब्द है। दुभाषियों , संकलक , ट्रांसपॉयलर , लिंटर , हाइलाइटर्स आदि नामक कार्यक्रमों की कक्षाएं , सभी में पाठ लेते हैं और कोड को निष्पादित करने की इस पारंपरिक समझ के साथ कुछ करने का प्रयास करते हैं।
- दुभाषिए वास्तव में कुछ मशीन का संचालन करके निष्पादन शब्दार्थ का प्रदर्शन करते हैं - आमतौर पर आपका कंप्यूटर। आप उन्हें अपने कंप्यूटर के अंदर एक छोटे आदमी के रूप में सोच सकते हैं जैसे कि आपके जावास्क्रिप्ट प्रोग्राम में लिखे इंस्ट्रक्शन के आधार पर "इस वर्ण को प्रिंट करें" जैसे स्विच।
- कंपाइलर जावास्क्रिप्ट पाठ को नए सेट के पाठ में बदलने की कोशिश करते हैं, जिसमें एक अलग भाषा के लिए निष्पादन शब्दार्थ होता है - शायद विशेष संपत्ति वाले कंप्यूटर के साथ इसे निष्पादित कर सकते हैं।
- ट्रांसपॉयलर कंपाइलर का एक सामान्यीकृत रूप है जिसमें वे जावास्क्रिप्ट टेक्स्ट को किसी अन्य भाषा के आउटपुट टेक्स्ट में लेते हैं। इस प्रकार अंतर थोड़ा व्यक्तिपरक है, लेकिन आमतौर पर एक संकलक के बारे में सोचता है कि बहुत कम स्तर कोड और ट्रांसपिलर को उच्च स्तर के कोड के रूप में आउटपुट किया जाता है ।
- लिंटर , हाइलाइटर्स , टाइप चेकर्स , आदि सभी जावास्क्रिप्ट पाठ में लेते हैं और किसी प्रकार के विश्लेषणात्मक उत्पाद का उत्पादन करते हैं, उदाहरण के लिए हाइलाइट किया गया पाठ, जो निष्पादन शब्दार्थ से प्रभावित होता है, लेकिन वास्तव में इसका प्रतिनिधि नहीं है।
अब, चलो निष्पादन शब्दार्थ में थोड़ा खुदाई करते हैं। आम तौर पर, निष्पादन शब्दार्थ में भाषा पाठ को पढ़ने और एक अमूर्त मशीन के विवरण पर पहुंचने या अवलोकन साइड इफेक्ट्स का वर्णन शामिल होता है । मैं जो सुझाव देना चाहता हूं, वह यह है कि इन दोनों को मशीन के संचालन के लिए या निम्न प्रभाव दिखाने के लिए किसी प्रकार की "निम्न-स्तरीय एपीआई" होने की आवश्यकता है। इन्हें आमतौर पर रनटाइम पर्यावरण का हिस्सा माना जाता है
- क्रम पर्यावरण या क्रम ग्रहण पुरातन का एक सेट है कि भाषा सम्मेलन को संचालित करने के अस्तित्व के लिए की आवश्यकता है। जहाँ तक भाषा जाती है, उनके व्यवहार के बारे में कुछ धारणा हो सकती है, लेकिन वे अप्राप्य हैं। ऊपर दुभाषिया की कल्पना में, "अंदर आदमी" सिर्फ रनटाइम के स्विच को फ्लिक करता है --- वह व्यक्तिगत रूप से निरीक्षण नहीं कर सकता कि वे क्या कर रहे हैं।
रनटाइम शब्द का आमतौर पर दुरुपयोग किया जाता है, जिसका अर्थ है कि खुद को मानने वाले प्राइमेटिव्स का सेट और उनमें से एक वास्तविक तात्कालिकता।
तो, अब हम कुछ बालों के लिए मिलता है। एक भाषा सम्मेलनों का एक समूह है जो अपने निष्पादन शब्दार्थों को अर्थ प्रदान करने के लिए एक रनटाइम के अस्तित्व को मानता है। यह कभी भी "जांच नहीं करता है" क्योंकि वे दायरे से बाहर हैं।
वास्तव में एक भाषा का उपयोग करने के लिए आप एक रनर कार्यान्वयन के साथ एक कंपाइलर या दुभाषिया जैसा कुछ चाहते हैं। संकलक / दुभाषिया और यह रनटाइम वास्तव में आपके कोड को निष्पादित करने में हाथ से जाता है ।
- Chrome का V8 , जिसे अक्सर एक इंजन कहा जाता है , एक पैकेज डील है जिसमें ECMA मानक जावास्क्रिप्ट सम्मेलनों द्वारा मांग की गई रनटाइम इंटरफ़ेस के साथ एक दुभाषिया, कंपाइलर, रनटाइम कार्यान्वयन संगत है।
तो Node.js इस में कहाँ फिट होता है?
हमें इसे भागों में तोड़ना होगा:
- Node.js जावास्क्रिप्ट भाषा का विस्तार करता है जो रनटाइम एनवायरनमेंट प्राइमेटिव का एक बड़ा सेट प्रदान करता है - जो ECMA के मानकों के दायरे से बाहर हैं। इनमें फ़ाइल I / O जैसी चीजें शामिल हैं । इसका मतलब है कि Node.js भाषा को बदलता है और कुछ मायने में एक नई भाषा है: "Node.js जावास्क्रिप्ट"
- Node.js, एक पैकेज के रूप में, एक दुभाषिया और एक संकलक होता है। यह सिर्फ V8 से चोरी करता है।
- Node.js Node.js रनटाइम वातावरण का कार्यान्वयन प्रदान करता है जो "Node.js जावास्क्रिप्ट" को निष्पादित करने की अनुमति देता है।
- Node.js नई प्राथमिकताओं के साथ निर्मित मानक पुस्तकालयों का एक सेट प्रदान करता है जो उन्हें "Node.js जावास्क्रिप्ट" के अंतिम उपयोगकर्ताओं के लिए अधिक सुलभ बनाता है।
तो Node.js बहुत सी चीजें हैं!
लेकिन क्या यह एक ढांचा है?
यह वह जगह है जहाँ शब्दावली पूरी तरह से अलग हो जाती है - किसी के पास वास्तव में एक अच्छी, सुसंगत, सार्थक परिभाषा नहीं है कि वास्तव में एक रूपरेखा क्या है।
इस बात पर बहस होती है कि हंगामा: "एक पुस्तकालय बनाम एक ढांचा क्या है" और वे असंतोषजनक चीजों पर समाप्त होते हैं जैसे "एक पुस्तकालय कुछ है जिसे आप कहते हैं और एक ढांचा ऐसा है जो आपको बुलाता है"। मैं वास्तव में इस तरह की एक दुखद व्याख्या को दिन की रोशनी नहीं देना चाहता हूं - लेकिन जावास्क्रिप्ट, और विशेष रूप से जावास्क्रिप्ट, एनडीएस। जावास्क्रिप्ट इस परिभाषा के लिए एक बहुत बड़ा झटका है क्योंकि पूरी कॉलबैक-पासिंग तकनीक का मतलब है कि आप लगातार कॉलिंग के बीच स्विच कर रहे हैं और कहा जा रहा है।
मेरी व्यक्तिगत राय में, यहाँ कुछ महत्वपूर्ण है। मैं एक उज्ज्वल रेखा नहीं खींचना चाहता, लेकिन मैं केवल इतना कहूंगा
- कोड का एक सेट लाइब्रेरी की तरह है अगर यह लेगो के सेट की तरह काम करता है : विभाज्य और विधानसभा के लिए बनाया गया। हालांकि लाइब्रेरी का उपयोग कैसे करें, इसके कुछ उदाहरण हो सकते हैं, यह आम तौर पर उपयोगकर्ता को अपनी आवश्यकताओं की ओर इकट्ठा करने के लिए होता है।
- कोड का एक सेट ढांचा है, जैसे कि यह गैर-विभाज्य है और इसका अर्थ है अधिवेशन *: इसके अलग-अलग टुकड़ों को खींचना कई धारणाओं को विफल कर सकता है इसलिए आपको किसी रूपरेखा का सही उपयोग करने के लिए पारंपरिक उपयोग को समझना होगा।
यह सुनिश्चित करने के लिए एक हाथ-लहरदार रेखा है, लेकिन मैं रूपरेखाओं के बारे में एक बहुत दिलचस्प बिंदु निकालना चाहता हूं:
फ्रेमवर्क कोड की व्याख्या करने के तरीके का एक सेट प्रदान करता है; इसलिए वे अपने आप में एक भाषा हैं।
यह कुछ ऐसा हो सकता है, जिसके बारे में लोग बहस करना चाहते हैं, लेकिन अगर आपने मेरी पूर्व परिभाषा खरीदी है कि एक भाषा सिर्फ सम्मेलनों का एक सेट है, जो जीवन को एक खंड के रूप में देती है, तो जब भी आप सम्मेलनों की एक नई परत बनाते हैं ' एक नई भाषा बनाई है शायद रूपरेखा के साथ कच्चे माल कच्चे पाठ फ़ाइलों के बजाय उनकी मेजबान भाषा की शब्दार्थ व्याख्याएं हैं, लेकिन विचार एक ही है!
इतना सब कहा कि, मैं पूरी तरह से Node.js एक फ्रेम कॉल करने के लिए खुश हूँ, भले ही यह आदर्श के खिलाफ एक सा हो जाता है! Node.js भाषा के विस्तार के तरीके में कच्चे जावास्क्रिप्ट में कार्यक्षमता जोड़ता है । इसके साथ इस विस्तारित भाषा में काम करने के लिए नई धारणाएँ और उपकरण आए। कार्यात्मक रूप से, ये विचार रूबी जैसे अन्य अच्छी तरह से स्वीकृत रूपरेखाओं के विचारों के समान हैं ।
मैं यह तर्क दूंगा कि यदि इस समय आप थोड़ा असहज महसूस करते हैं और यह तर्क देना चाहते हैं कि इस तरह की चीजों में रूबी ऑन रेल्स और नोड.जेएस के बीच बहुत बड़ा विभाजन है तो मैं आपके साथ वहीं हूं , बिल्कुल। जिस तरह की वैचारिक दुनिया में दोनों रहते हैं, वह नाटकीय रूप से अलग होती है- मैं केवल यह कहना चाहता हूं कि वे एक ही तरह की हों: किसी विशेष डोमेन के भीतर आधार भाषा की शक्तियों के विस्तार के लिए सम्मेलनों के सेट।
मुझे यह सुझाव देते हुए खुशी हो रही है कि Node.js का डोमेन छोटा और तंग है और इस प्रकार इसमें जो कन्वेंशन जोड़े जाते हैं, वे कारण के बारे में सरल और सही बनाने में अपेक्षाकृत आसान हैं। ओटोह, रूबी ऑन रेल्स "व्यापार वेब अनुप्रयोगों" के एक जटिल, खराब परिभाषित डोमेन में रहता है, जिसका अर्थ है कि यह जो कन्वेंशन देता है वह निश्चित रूप से फजी और टूटा हुआ है।
लेकिन यह सब कहने का एक लंबा तरीका है, हाँ, नियोक्ताओं को शायद यह पता नहीं है कि जब वे कहते हैं तो उनका क्या मतलब है। मैं अनुमान लगा रहा हूं कि "रनटाइम" या "इंजन" की तुलना में "फ्रेमवर्क" सिर्फ एक बेहतर, अधिक ग्रैकेबल शब्द लगता है।