2009-12-07 19 views
19

अब हाल ही में Node.JS के बारे में सभी प्रचार हैं, जावास्क्रिप्ट कॉलबैक का उपयोग करके एक ईवेंट संचालित फ्रेमवर्क। मेरी सीमित समझ के लिए, इसका प्राथमिक लाभ यह प्रतीत होता है कि आपको क्रमशः चरण-दर-चरण प्रतीक्षा करने की आवश्यकता नहीं है (उदाहरण के लिए, आप SQL परिणाम, प्राप्त कर सकते हैं जबकि अन्य कार्यों को भी कॉल कर रहे हैं)।पहियों को फिर से शुरू करना: नोड.जेएस/इवेंट-संचालित प्रोग्रामिंग बनाम। कार्यात्मक प्रोग्रामिंग?

तो मेरा सवाल यह है कि यह सीएल, हास्केल, क्लोजर इत्यादि जैसी कार्यात्मक भाषाओं की तुलना में अलग, या बेहतर कैसे है? यदि बेहतर नहीं है, तो लोग क्यों केवल कार्यात्मक भाषाएं नहीं करते हैं (के बजाय जावास्क्रिप्ट के साथ पहिया को फिर से शुरू करना)?

कृपया ध्यान दें कि मेरे पास नोड.जेएस और न ही कार्यात्मक प्रोग्रामिंग में कोई अनुभव नहीं है। तो कुछ बुनियादी स्पष्टीकरण सहायक हो सकता है।

उत्तर

10

मुझे वास्तव में नोड.जेएस के बारे में पता नहीं है, लेकिन मुझे वास्तव में इसके बीच (आपके विवरण से) और कार्यात्मक प्रोग्रामिंग के बीच कोई हड़ताली समानता दिखाई नहीं दे रही है। आपके विवरण से, नोड.जेएस का लक्ष्य एसिंक्रोनस प्रोग्रामिंग की सहायता करने के लिए किया जाता है - जैसा कि आप कहते हैं "आपको क्रमशः चरण-दर-चरण प्रतीक्षा करने की ज़रूरत नहीं है", आप अन्य कार्यों को कर सकते हैं क्योंकि एक लंबे समय से चलने वाला कार्य इसकी बात करता है।

कार्यात्मक प्रोग्रामिंग पूरी तरह से ऑर्थोगोनल है - यानी यह वास्तव में asynchronicity के लिए कोई लिंक नहीं है। आप एक के बिना, या दोनों एक साथ, या उनमें से कोई भी हो सकता है। कार्यात्मक प्रोग्रामिंग आपके कार्यक्रमों में साइड इफेक्ट्स को खत्म करने और भाषा के प्रथम श्रेणी के सदस्यों के रूप में कार्य करने की अनुमति देने के बारे में है, ताकि अन्य मूल्यों के समान तरीके से छेड़छाड़ की जा सके।

+2

अच्छा, काफी ईमानदार होने के लिए, कार्यात्मक प्रोग्रामिंग एक शुद्ध भाषा का संकेत नहीं देती है। हास्केल बस ऐसा करने का विकल्प चुनता है। – codebliss

+3

ध्यान दें कि मैंने कभी दावा नहीं किया है। प्रोग्रामिंग शैली, अपने आप में, जैसा कि मैंने इसे परिभाषित किया है। इसके बारे में थोड़ा विवाद। इस बारे में एक सतत बहस है कि किसी को "कार्यात्मक प्रोग्रामिंग भाषा" कहने की अनुमति दी जानी चाहिए - कोई भी भाषा जो शैली की अनुमति देती है, कोई भी भाषा जहां मुख्य फोकस उस शैली का समर्थन कर रहा है, या केवल ऐसी भाषाएं जो किसी अन्य शैली का समर्थन नहीं करती हैं। यह एक अलग बहस है। Haskell उदाहरण के लिए – harms

3

यह वास्तव में "पहिया को पुनर्निर्मित नहीं कर रहा है।" जावास्क्रिप्ट वास्तव में एक कार्यात्मक भाषा नहीं है, लेकिन यह लिस्प पर आधारित था और यह ऐसी चीज है जिसे इसे करने के लिए डिज़ाइन किया गया था। जावास्क्रिप्ट मेरी राय में एक ओओ भाषा के रूप में एक लिस्प-ईश कार्यात्मक भाषा के रूप में वास्तव में मजबूत है। यही कारण है कि jQuery के साथ दृढ़ता से कार्यात्मक * डिजाइन जैसे फ्रेमवर्क भाषा को अच्छी तरह फिट करते हैं।

(* ध्यान दें:। शुद्ध नहीं है, जाहिर है, लेकिन कार्यात्मक योजना के रूप में ठीक उसी तरह) एक वेबसर्वर के रूप में नोड में

0

जावास्क्रिप्ट की महत्वपूर्ण भूमिका है कि यह काफी हद तक कार्यक्रम चालित है।

मेरा मानना ​​है कि कार्यात्मक प्रोग्रामिंग में अन्य चीजों के साथ अपरिवर्तनीयता के कारण समरूपता के फायदे हैं।

सुनिश्चित नहीं है कि अन्य कार्यात्मक भाषाओं को कैसे संचालित किया जाता है, बस नोड के फायदों के हिस्से के रूप में इसे हाइलाइट करना चाहता था।

33

नोड.जेएस दस्तावेज़ (और अच्छा slide deck) के माध्यम से पढ़ने के बाद, मुझे लगता है कि यहां अन्य उत्तरों के बारे में बात याद आ रही है: नोड.जेएस इस विचार पर आधारित है कि लेखन कार्यक्रमों की शैली जहां हम उन्हें उम्मीद करते हैं I/O पर अवरुद्ध करने के लिए गलत है, और इसके बजाय हमें I/O (जैसे डेटाबेस पढ़ना, या सॉकेट पढ़ना) शुरू करना चाहिए और अनुरोध के साथ I/O के परिणाम को संभालने के लिए एक फ़ंक्शन के साथ पास करना चाहिए। नोड के

db.query("select..", function (result) { 
    // use result 
}); 

लेखकों (:

तो बजाय ऐसा करते हैं:

var result = db.query("select.."); // blocking 
// use result 

Node.js ऐसा करने का विचार पर आधारित है।जेएस) बताते हैं कि प्रोग्रामिंग का यह तरीका कई प्रणालियों में बहुत अजीब है क्योंकि भाषाओं में बंद या अज्ञात कार्य नहीं होते हैं और पुस्तकालय मुख्य रूप से I/O को अवरुद्ध कर रहे हैं। हालांकि, जावास्क्रिप्ट पूर्व की आपूर्ति करता है (और प्रोग्रामर का उपयोग इस बात के लिए किया जाता है कि जेएस का उपयोग ब्राउज़र में किसी तरह की घटना में कैसे किया जाता है), और नोड.जेएस बाद में भर जाता है: बिना किसी अवरुद्ध कॉल के एक पूरी तरह से संचालित आई/ओ लाइब्रेरी बिलकुल।

यह कार्यात्मक प्रोग्रामिंग से कैसे संबंधित है? सभी कार्यात्मक प्रोग्रामिंग भाषाएं बंद करने के लिए पर्याप्त शक्तिशाली बनाती हैं जो नोड.जेएस जावास्क्रिप्ट के साथ करने की कोशिश कर रही है। अधिकांश कोड को और भी आसान बनाते हैं, क्योंकि पासिंग क्लोजर आमतौर पर भाषा के लिए मौलिक होता है।

मोनाड्स का उपयोग करके हास्केल के लिए, इस तरह की चीज निर्माण करना बहुत आसान हो सकता है। उदाहरण के लिए:

doQuery :: DBConnection -> IO() 
doQuery db = do 
    rows <- query db "select..." 
    doSomething rows 
    doSomethingElse rows 

ये बहुत अनुक्रमिक, कोड की अनिवार्यता लाइनों वास्तव में IO इकाई के नियंत्रण में बंद का एक क्रम है। यह है के रूप में यदि जावास्क्रिप्ट में आप लिखा था:

db.query("select...", function (rows) { 
    doSomething(rows, function() { 
     doSomethingElse(rows, function() { /* done */ }) 
    }) 
}) 

संक्षेप में, जब एक कार्यात्मक भाषा में monadic कोड लिखने, आप पहले से ही यह रूप में लिख रहे हैं Node.js लेखक हमें लिखना चाहते हैं: जहां हर कदम अनुक्रमिक गणना के पहले को बंद करने के रूप में पारित किया गया है। हालांकि, देखो कि कोड हास्केल में कितना अच्छा दिखता है!

forkQuery :: DBConnection -> IO ThreadId 
forkQuery db = forkIO $ do 
    rows <- query db "select..." 
    doSomething rows 
    doSomethingElse rows 

महंगी प्रक्रिया कांटा आप के लिए इस्तेमाल कर रहे हैं, या यहां तक ​​कि ओएस की प्रक्रिया के साथ कि forkIO भ्रमित न हों:

इसके अलावा, आप आसानी से समवर्ती हास्केल इस गैर अवरुद्ध आपरेशन आसानी से प्राप्त करने के लिए सुविधाओं का उपयोग कर सकते धागे। यह मूल रूप से निष्पादन का एक हल्का वजन धागा है जो नोड.जेएस उपयोग कर रहा है (केवल कुछ हद तक समृद्ध अर्थशास्त्र के साथ)। आपके पास नोड की तरह 1,000 के दशक हो सकते हैं। जेएस का लक्ष्य है।

तो, संक्षेप में - मुझे लगता है कि नोड.जेएस जावास्क्रिप्ट में मौजूद एक सुविधा पर निर्माण कर रहा है, लेकिन यह कार्यात्मक भाषाओं में अधिक प्राकृतिक है। इसके अलावा, मुझे लगता है कि नोड.जेएस में मौजूद सभी तत्व पहले से ही हास्केल और उसके पैकेज में मौजूद हैं, और फिर कुछ। मेरे लिए, मैं सिर्फ हास्केल का उपयोग करता हूं!

+1

+1। मैं वास्तव में उसकी सराहना करता हूँ। –

+0

सभी +1 में से पहला। यह एक स्पष्ट और संतुलित उत्तर है। हालांकि, दोनों का उपयोग करने के बाद, मुझे लगता है कि सख्त और नामकरण कॉलबैक होने के कारण, कुछ अजीबता दूर हो जाती है। जेएस एक सी परिवार की भाषा के कपड़े पहनने वाली एक कार्यात्मक भाषा है, और आप दोनों के बिट्स के साथ हवादार हो जाते हैं। मुझे लगता है कि दार्शनिक लचीलापन जेएस में कोडिंग को नोड के साथ तेजी से और अधिक मजेदार बनाता है। हालांकि यह सिर्फ मुझे है! – qubyte

1

मैंने अभी तक node.js का उपयोग नहीं किया है, लेकिन मुझे इसमें निश्चित रूप से रूचि है और जल्द ही इसे आजमाया जाएगा। कार्यात्मक प्रोग्रामिंग के बारे में पहले से ही बहुत सारे अच्छे उत्तर हैं और ऐसे में, इसलिए मैं इसमें नहीं जाऊंगा।

आप पूछते हैं कि सर्वर पर किसी अन्य भाषा का उपयोग क्यों नहीं करें, जैसे कि हैकेल, क्लोजर इत्यादि। मेरे लिए, दूसरों पर नोड.जेएस का आकर्षण यह है कि यह जावास्क्रिप्ट है। मेरे एप्लिकेशन क्लाइंट पर जावास्क्रिप्ट में पहले से ही भारी हैं, इसलिए इसका मतलब है कि मैं सर्वर और क्लाइंट दोनों पर एक भाषा में काम कर सकता हूं।

मेरी आशा यह है कि यह विकास को सुव्यवस्थित और सरल बना देगा क्योंकि मुझे संदर्भों को इतनी भारी रूप से स्विच करने की आवश्यकता नहीं होगी। क्लाइंट और सर्वर दोनों पर उपयोग किए जाने वाले कुछ तर्क साझा किए जा सकते हैं (संभवतः सत्यापन कोड और इसी तरह के रूप में) कुछ तर्क में काम में कुछ कमी हो सकती है।

0

क्लाइंट और सर्वर सिकुड़ने के बीच के अंतर के साथ मुख्य लाभांश में से एक क्लाइंट और सर्वर पर कोड का पुन: उपयोग करने की क्षमता है। उदाहरण के लिए यदि आप आधुनिक ब्राउज़र के लिए एक समृद्ध और गतिशील AJAX वेबसाइट और पुराने ब्राउज़र के लिए एक अलग संस्करण चाहते हैं, तो आप क्लाइंट और सर्वर दोनों में डेटा को कम करने के प्रारूप के लिए एक ही डिस्प्ले कोड का उपयोग कर सकते हैं।

इसके साथ अन्य लाभों में एचटीएमएल 5/Google गियर्स/एडोब एयर की स्थानीय स्टोरेज डीबी और सर्वर को वेब ऐप ऑफ़लाइन चलाने की क्षमता शामिल है, तो आपके पास कोड हो सकता है जो पारंपरिक रूप से सर्वर पर स्थानीय रूप से संग्रहीत सर्वर पर हो उपलब्ध नहीं है।

संबंधित मुद्दे