सीखना अर्लंग बनाम लर्निंग नोड.जेएस [बंद]


41

मुझे लगता है कि Erlang kicks नोड के बारे में ऑनलाइन बहुत सी बकवास देख रहा है। सिर्फ हर बोधगम्य श्रेणी के बारे में नोड्स। इसलिए मैं एरलांग सीखना चाहूंगा, और इसे एक शॉट दूंगा, लेकिन यहां समस्या है। मुझे लग रहा है कि मेरे पास एर्लांग को लेने से ज्यादा कठिन समय है, इससे पहले कि मैं नोड उठाऊं। नोड.जेएस के साथ, मैं एक अपेक्षाकृत जटिल परियोजना चुन सकता था, और एक दिन में मुझे कुछ काम करना था। एर्लैंग के साथ, मैं बाधाओं में भाग रहा हूं, और जल्दी से लगभग नहीं जा रहा हूं।

तो .. अधिक अनुभव वाले लोगों के लिए, क्या एर्लांग सीखने के लिए जटिल है, या मैं सिर्फ कुछ याद कर रहा हूं? Node.js सही नहीं हो सकता है, लेकिन मुझे लगता है कि इसके साथ काम करने में सक्षम होना चाहिए।


9
शायद मुझे कुछ याद आ रहा है, लेकिन एक JavaScript लाइब्रेरी नोड नहीं है, और Erlang एक पूरी तरह से अलग भाषा है? कैसे वे भी तुलनीय हैं?
FrustratedWithFormsDesigner

3
@FrustratedWithFormsDesigner, node.js हाल ही में एक बहु-थ्रेडेड दृष्टिकोण के साथ सर्वर पर जावास्क्रिप्ट प्राप्त करने के फैशन / प्रचार का हिस्सा है, इसलिए वे तुलनीय हैं
lurscher

5
@lurscher: आप Erlang (भाषा) की तुलना Node.js (सर्वर साइड जावास्क्रिप्ट) से नहीं कर सकते। यह जावा (भाषा) की तुलना Django (सर्वर पायथन) की तरह होगा। एर्लांग और जेएस का उल्लेख नहीं है और साथ ही बहुत अलग हैं।
जोश के

10
जैसा कि कोई भी इरलांग और नोड दोनों का उपयोग करता है, वे निश्चित रूप से उन समस्याओं में तुलनीय हैं जो वे हल करते हैं
डेल हार्वे

3
@ नोली में नोड.जेएस और इरलांग के बीच अंतर है। आपका मतलब नोड.जेएस और एरांग आधारित वेबसर्वर के बीच तुलना से था। Erlang में वेब सर्वर के बाहर कई उपयोगकर्ता हैं।
रेयनोस

जवाबों:


46

सबसे पहले, मैं एरलांग सीखने के संबंध में सिर्फ मेरे सही सुझाव के जवाब से सहमत हूं। यह एक ज्यादातर कार्यात्मक भाषा है (हालांकि संगामिति एक बड़ी भूमिका निभाती है), और इसकी सभी विशेषताओं को दोष-सहिष्णुता और मजबूती की ओर जाने के लिए जोड़ा गया था, जो कि पहले स्थान पर जावास्क्रिप्ट के समान डिज़ाइन लक्ष्य नहीं है।

सभी में से दूसरा, नेल.जेएस को एर्लांग में जाने के लिए छोड़ना थोड़ा गलत है। Node.js एक एकल सर्वर / ढांचा है जो कॉलबैक की मदद से सब कुछ घटना-संचालित तरीके से करने के लिए जाता है। एर्लैंग का अपना ढांचा (ओटीपी) है, लेकिन यह समान स्तर पर नहीं है।

यदि आप एरलांग सीखने की योजना बनाते हैं, तो मैं ट्यूटोरियल में गोता लगाने से पहले इंट्रो रीडिंग के रूप में मेरे ब्लॉग प्रविष्टि एरलंग बिगिनर (या ऑन्जेंडर) के लिए एक ओपन लेटर सुझाता हूं ।


केवल एक चीज आप पैटर्न और उपयोग के संदर्भ में एर्लैंग और नोड.जेएस की तुलना कर सकते हैं कि वे घटना-चालित कैसे हैं। हालांकि, यहां दो बड़े अंतर हैं। Node.js का मॉडल घटनाओं के लिए बाध्य कॉलबैक पर आधारित है। एरलंग संदेश कतारों और चयनात्मक प्राप्तियों पर आधारित है। वहाँ निहितार्थ क्या हैं?

सबसे पहले, यदि आप कॉलबैक-आधारित तरीके से काम करते हैं, तो जिस तरह से आप राज्य के चारों ओर ले जाते हैं, वह या तो वैश्विक है या निरंतरता-गुजर शैली प्रोग्रामिंग में मिलता है। दूसरे, आपको स्वयं पूर्ण इवेंट मैट्रिक्स की देखभाल करनी होगी। इसका एक उदाहरण यह है कि अगर हम एक बहुत ही सरल परिमित अवस्था मशीन की कल्पना करते हैं: एक म्यूटेक्स सेमाफोर, घटना-चालित।

म्यूटेक्स सेमाफोर के दो राज्य हैं: लॉक और फ्री। जब भी गणना की एक इकाई (कार्यकर्ता, प्रक्रिया, कार्य या धागा) म्यूटेक्स तक पहुंच प्राप्त करना चाहता है, तो उसे एक ऐसी घटना को आग देना होगा जो यह बताता है कि 'मैं दिलचस्पी रखता हूं'। अब आपको निम्नलिखित प्रकार के आयोजनों की देखभाल करनी होगी:

  • म्यूटेक्स मुक्त है और आप लॉक प्राप्त करने के लिए कहते हैं
  • म्यूटेक्स किसी और द्वारा लॉक किया गया है और आप लॉक प्राप्त करना चाहते हैं
  • म्यूटेक्स अपने आप से बंद है और आप म्यूटेक्स को मुक्त करना चाहते हैं

फिर आपके पास विचार करने के लिए अतिरिक्त कार्यक्रम हैं, जैसे कि गतिरोध से बचने के लिए समय समाप्त करना:

  • म्यूटेक्स को बंद कर दिया गया है और आप बहुत देर तक इंतजार करते रहे, आग बुझाने के लिए टाइमर
  • म्यूटेक्स को लॉक कर दिया गया है और आपने बहुत देर तक इंतजार किया, लॉक प्राप्त किया, फिर टाइमआउट बंद हो गया

तो फिर तुम भी बाध्य घटनाओं से बाहर है:

  • आपने अभी म्यूटेक्स को लॉक किया है जबकि कुछ कार्यकर्ता ने इसे मुफ्त होने की उम्मीद की थी। अब उस कार्यकर्ता की क्वेरी को कतारबद्ध करना होगा ताकि जब वह मुक्त हो जाए तो उसे वापस संभाला जा सके
  • आपको काम के सभी को अतुल्यकालिक बनाने की आवश्यकता है

इवेंट मैट्रिक्स बहुत तेजी से जटिल हो जाता है। हमारे यहां एफएसएम केवल 2 राज्य हैं। एरलैंग (या किसी भी भाषा में चयनात्मक प्राप्ति और संभावित तुल्यकालिक घटनाओं के साथ एसिंक्स) के मामले में, आपको कुछ मामलों की देखभाल करनी होगी:

  • म्यूटेक्स मुक्त है और आप लॉक प्राप्त करने के लिए कहते हैं
  • म्यूटेक्स किसी और द्वारा लॉक किया गया है और आप लॉक प्राप्त करना चाहते हैं
  • म्यूटेक्स अपने आप से बंद है और आप म्यूटेक्स को मुक्त करना चाहते हैं

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

इसका मतलब यह है कि सामान्य मामलों में, CPS और कॉलबैक-आधारित मॉडल जैसे कि node.js में या तो आप बहुत चालाक होने के लिए पूछते हैं कि आप घटनाओं को कैसे संभालते हैं, या आपको पूरे जटिल इवेंट मैट्रिक्स का पूरा ध्यान रखने के लिए कहते हैं, क्योंकि आपको प्रत्येक असंगत मामले पर वापस बुलाया जाना चाहिए जो अजीब समय के मुद्दों और राज्य परिवर्तनों से उत्पन्न होता है।

चयनात्मक प्राप्तियां आमतौर पर आपको सभी संभावित घटनाओं के एक उपसमूह में ध्यान केंद्रित करने की अनुमति देती हैं और आपको उस मामले में घटनाओं के बारे में अधिक आसानी से तर्क करने की अनुमति देती हैं। ध्यान दें कि एर्लैंग में किसी चीज़ का व्यवहार (डिज़ाइन पैटर्न / फ्रेमवर्क कार्यान्वयन) होता है gen_event। Gen_event कार्यान्वयन आपको एक तंत्र के समान होने की अनुमति देता है जो नोड में उपयोग किया जा रहा है। यदि ऐसा है जो आप चाहते हैं।


ऐसे अन्य बिंदु होंगे जो उन्हें अलग करते हैं; Erlang का प्रीमेप्टिव शेड्यूलिंग है जबकि नोड.जेएस इसे सहयोगी बनाता है, Erlang कुछ बहुत बड़े पैमाने पर एप्लिकेशन (वितरण और सभी) के लिए उपयुक्त है, लेकिन Node.js और इसका समुदाय आमतौर पर अधिक वेब-एप और नवीनतम वेब प्रवृत्ति के बारे में जानकार है। यह सबसे अच्छा उपकरण चुनने का सवाल है, और यह आपकी पृष्ठभूमि, आपकी समस्या का प्रकार, और आपकी प्राथमिकताओं पर निर्भर करेगा। मेरे मामले में, एरलांग का मॉडल मेरे सोचने के तरीके को बहुत अच्छी तरह से फिट करता है। जरूरी नहीं कि हर किसी के लिए यही हो।

उम्मीद है की यह मदद करेगा।


प्रतिक्रियाशील प्रोग्रामिंग पर अधिक और जेएस में यह कर रहा है: blog.flowdock.com/2013/01/22/…
बार्ट

"क्योंकि आपको प्रत्येक असंगत मामले पर वापस बुलाया जाना चाहिए जो अजीब समय मुद्दों और राज्य परिवर्तनों से उत्पन्न होता है।" - एर्लांग में, आपको अभी भी टाइमर को संभालने की आवश्यकता है, और तथ्य यह है कि आप इसे "उन्हीं मामलों में" प्राप्त करते हैं जैसे "जटिलता नहीं बदलता है (बिल्कुल भी)। मेरे दृष्टिकोण से (प्रति दिन अरबों अनुरोधों को संसाधित करने वाले सिस्टम के एक वास्तुकार के रूप में), चयनात्मक प्राप्त और नोड.जेएस-शैली के बीच केवल यथार्थवादी अंतर हैं (ए) सवाल "हम डिफ़ॉल्ट रूप से क्या करना चाहते हैं" (नोड के साथ)। डिफ़ॉल्ट रूप से ईवेंट संसाधित करना , और एरलंग इवेंट्स को तब तक स्थगित करना जब तक कि मैच न हो जाए ...
No-Bugs Hare

... (बी) पठनीयता, जिसमें बॉयलरप्लेट की मात्रा भी शामिल है (जो कि शास्त्रीय नोड में बहुत खराब है। जेएस, लेकिन बहुत बेहतर हो गया - और आईएमएनएसएचओ एर्लांग की तुलना में बेहतर है - नए पेश किए गए प्रतीक्षित ऑपरेटर के साथ) ... और किसी भी मामले में , ये अंतर बहुत अधिक कॉस्मेटिक हैं (दोनों उपदेशों पर जोश के बावजूद अन्यथा उपदेश देते हैं)।
नहीं-बग्स हरे

38

एर्लैंग सीखने के लिए जटिल नहीं है, यह सिर्फ मानसिकता के लिए विदेशी है कि कोडर्स के चेम्बर्स कॉन्स्टेंट (99.44%) ने प्रोग्रामिंग कार्यों के तरीके के रूप में सीखा है। आप जिस समस्या का सामना कर रहे हैं, वह वास्तविक जटिलता के बजाय केवल वैचारिक भटकाव है।

यहाँ Erlang की कुछ विदेशी विशेषताएं हैं जो एक विशिष्ट प्रोग्रामर को काटने जा रही हैं:

  • Erlang एक (अधिकतर-) कार्यात्मक प्रोग्रामिंग भाषा है। अधिकांश आम प्रोग्रामिंग भाषाएं लगभग सैन्य रूप से अनिवार्य हैं।
  • एर्लैंग का कंसीलर मॉडल एक्टर मॉडल है। अधिकांश सामान्य प्रोग्रामिंग भाषाएं लॉक-आधारित थ्रेडिंग या "रिएक्टर" के कुछ रूप का उपयोग करती हैं, जो संगामिति के लिए -based दृष्टिकोण। (मुझे लगता है कि Node.js उत्तरार्द्ध है, लेकिन मुझे इस पर कॉल न करें - क्लाइंट / सर्वर संबंध के किसी भी पक्ष में मेरी जावास्क्रिप्ट में शून्य रुचि है।)
  • एर्लैंग में इन दुर्घटनाओं को पकड़ने के लिए उपलब्ध शक्तिशाली रनटाइम सुविधाओं के साथ कोडिंग करने के लिए "इसे क्रैश करें" दृष्टिकोण है, उन्हें निदान करें और सिस्टम चालू होने पर उन्हें गर्म-पैच करें। अधिकांश सामान्य प्रोग्रामिंग भाषाएँ एक भारी रक्षात्मक प्रोग्रामिंग शैली का समर्थन करती हैं।
  • Erlang लगभग है, लेकिन काफी नहीं है, विश्वसनीय और स्थिर सर्वर (OTP) के लिए आमतौर पर उपयोग किए जाने वाले आर्किटेक्चर के एक बड़े और हल्के मस्तिष्क-युक्त पुस्तकालय के साथ जोड़े गए। (एक कारण है कि एरलंग को आम तौर पर एरलंग / ओटीपी के रूप में संदर्भित किया जाता है।) इसके अलावा इस पुस्तकालय को पहले उल्लिखित विदेशी सुविधाओं पर बनाया गया है और इस प्रकार नए लोगों के लिए अपारदर्शी है। अधिकांश प्रोग्रामिंग लैंग्वेज में कम-से-कम सभी लाइब्रेरियों (जावा ईई के बावजूद) के साथ काम करने के लिए कहा जाता है और कहा जाता है कि लाइब्रेरी, स्वाभाविक रूप से, उन अवधारणाओं पर निर्मित होती हैं जो अधिकांश प्रोग्रामर के लिए अधिक परिचित हैं।

इसलिए, एरलांग सीखना, अधिकांश प्रोग्रामर्स के लिए एक चुनौती से अधिक होने जा रहा है, जो कि Node.js सीखने से अधिक है - खासकर अगर प्रोग्रामर पहले से ही जावास्क्रिप्ट से परिचित है। अंत में, हालाँकि, एक बार जब आप वैचारिक बाधा से पार हो जाते हैं, तो मैं प्रस्तुत करता हूं कि एरलांग कोडिंग समकक्ष Node.js कोडिंग की तुलना में कम जटिल होने वाली है। यह कई कारणों से है:

  • एरलैंग का कंसीलर मॉडल सामान्य "रिएक्टर" -स्टाइल कंसीलर की तुलना में लॉजिक फ्लो को अधिक स्पष्ट बनाता है और कॉनक्युलर लॉक-आधारित कॉनक्यूरेन्सी की तुलना में कंसीलर को अधिक स्थिर और सही बनाता है। यह एक Erlang प्रोग्रामर के लिए लगभग कोई समस्या नहीं है, एक विशिष्ट कार्यक्रम में हजारों प्रक्रियाओं को छोड़ने के लिए हजारों थ्रेड्स को छोड़ते हुए एक विशिष्ट कार्यक्रम में, कहते हैं, जावा विवाद का एक दुःस्वप्न होगा (मेमोरी और सीपीयू ओवरहेड को शामिल करने के लिए नहीं) और एक "रिएक्टर"-आधारित सेटअप में हजारों अलग-अलग राज्यों को बनाए रखने के बराबर पढ़ने के लिए एक बुरा सपना होगा।
  • एक (ज्यादातर-) कार्यात्मक भाषा होने के नाते, एरलांग बहुत ही "क्या आप देखते हैं कि आपको क्या मिलता है" सेटअप है। चर, एक बार सेट, बदल नहीं है। कभी। आपको भ्रमित करने के लिए कोई OOP "दूरी पर डरावना कार्रवाई" नहीं है: आपके साथ काम करने वाली कोई भी चीज़ आपके सामने स्पष्ट रूप से रखी गई है। X से कोई विरासत में मिला चर नहीं है और Y से कोई वर्ग चर और Z से कोई वैश्विक चर अपने आप को चिंतित नहीं करता है। (यह उत्तरार्द्ध बिंदु 100% सत्य नहीं है, लेकिन इस तरह के भारी मामलों में यह सच है कि यह आपके सीखने के चरण के लिए पर्याप्त है।)
  • एरलांग के पास त्रुटियों को संभालने के लिए शक्तिशाली सुविधाएं हैं, जिसका अर्थ है कि आप अपने कोड को कम रक्षात्मक प्रोग्रामिंग के साथ बंद कर देते हैं, इस प्रकार तर्क को स्पष्ट रखने और कोड को छोटा रखने के लिए।
  • OTP लाइब्रेरी, एक बार जब आप इसे ग्रो करते हैं, तो सामान्य कोड का एक बहुत शक्तिशाली स्टैक होता है जो आपके पूरे एप्लिकेशन को नियमित रखता है और कई मुद्दों को कवर करता है और लंबे समय तक रहने वाले सर्वरों के मामलों का उपयोग करता है जो आपको लगता है कि यह बहुत देर तक नहीं होगा। OTP लाइब्रेरी ही, IM (ns) हो, जो एरलांग सीखने के लिए एक अच्छा पर्याप्त कारण है।

यदि आप ऐसा कर सकते हैं, और यदि आपने अभी तक ऐसा नहीं किया है, तो एर्लांग में नारे लगाना जारी रखें, एक सज्जन और (ज्यादातर-) एर्लंग की अवधारणाओं के लिए मज़ेदार परिचय के लिए ग्रेट यू फॉर एंगल पर जाएँ।


इस पोस्ट के लिए आपका धन्यवाद। मैं अब आप कुछ सीखता हूं, और मैं किताब के माध्यम से आधे रास्ते में पढ़ रहा हूं, लेकिन मुझे यह महसूस हो रहा है कि इससे पहले कि मैं वास्तव में कुछ करना शुरू कर पाऊंगा, मुझे यह सब जानना होगा। महत्वपूर्ण और न केवल इसे टुकड़ा द्वारा टुकड़ा
नोली

1
वास्तव में एक बार जब आप पुस्तक के समसामयिक भागों में पहुँच जाते हैं तो आप आसानी से पर्याप्त रूप से महत्वपूर्ण चीजों को करने में सक्षम होने लगेंगे।
बस

"एर्लैंग का कंसीडर मॉडल सामान्य" रिएक्टर "-स्टाइल कंसीलर की तुलना में लॉजिक फ्लो को अधिक स्पष्ट करता है" - मैं तर्क दूंगा कि रिएक्टर एसिंक्स प्रोसेसिंग वास्तव में दशकों से एक गड़बड़ था, फ्यूचर्स के आगमन के साथ और विशेष रूप से प्रतीक्षारत यह नहीं है अब और मामला। प्रतीक्षा के साथ, आप अपने अल्ट्रा-लाइटवेट कॉरटाइन का अभिनय कर सकते हैं "जैसे कि" वे थोड़े-थ्रेड हैं (और मुझे JS के बारे में निश्चित नहीं है, लेकिन C ++ में co_await को केवल हजारों में नहीं, बल्कि अरबों बकाया करने के लिए स्केल किया गया है coroutines)।
नहीं-बग्स हरे

"यह सिर्फ उस मानसिकता से अलग है जो चैंबर्स कॉन्स्टेंट (99.44%)" - और किसी भी उद्योग परियोजना के लिए, यह एक बिग फैट समस्या के रूप में योग्य है। यह बिग फैट प्रॉब्लम तब भी खड़ी होगी, जब कार्यात्मक भाषाओं की अलोकप्रियता का कोई उद्देश्य नहीं होगा (जिसके साथ मैं सहमत नहीं हूं, लेकिन यह एक बहुत अलग और लंबी कहानी है)।
नहीं-बग्स हरे

10

Erlang और Node के बीच कुछ महत्वपूर्ण अंतर हैं

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

दूसरा यह है कि एर्लैंग के पास एक बहुत ही विशेष रूप से साझा किया हुआ कुछ नहीं है, यह समस्याओं को हल करने के लिए आपको एक अलग तरीके से सोचने की आवश्यकता है, जो एक अच्छी बात है (टीएम)

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

नोड आपको मजेदार चीजों को बहुत जल्दी और अपेक्षाकृत दर्द मुक्त करने की अनुमति देगा, इसमें अभी भी बड़े अनुप्रयोगों के संबंध में दर्द बढ़ रहा है जो कि एरलांग ने लंबे समय तक हल किया है। Erlang आपके प्रोग्राम करने के तरीके को बदल देगा और (imo) आपको एक बेहतर प्रोग्रामर बना देगा, हालाँकि यह शुरुआत में आपके लिए जीवन आसान नहीं करेगा। दोनों अलग-अलग तरह से मजेदार हैं।


2
वर्थ ने उल्लेख किया कि नोड के धागे भी 'शेयर नथिंग' हैं।
टामलिन जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.