एल्म एक कार्यात्मक प्रोग्रामिंग भाषा है जो जावास्क्रिप्ट में संकलित होती है और मुख्य रूप से वेब अनुप्रयोगों के निर्माण के लिए उपयोग की जाती है। यह सरलता, गुणवत्ता और रखरखाव पर जोर देती है, जिसमें अत्यधिक इंटरैक्टिव उपयोगकर्ता इंटरफेस बनाने पर ध्यान केंद्रित किया गया है। एल्म की आर्किटेक्चर मॉडल-अपडेट-व्यू पैरेडाइम पर आधारित है, जो चिंताओं के स्पष्ट विभाजन को बढ़ावा देती है, जिससे अनुप्रयोगों को स्केल और प्रबंधित करना आसान होता है। यह भाषा अपनी मजबूत प्रकार प्रणाली के लिए जानी जाती है, जो संकलन के समय त्रुटियों को पकड़ने में मदद करती है, जिससे अधिक मजबूत सॉफ़्टवेयर विकास होता है।
एल्म का निर्माण एवान ज़ाप्लिक्की द्वारा 2012 में किया गया था, जो एक परियोजना थी ताकि यह समझा जा सके कि वेब अनुप्रयोगों को अधिक कुशलता से और कम जटिलता के साथ कैसे बनाया जा सकता है। ज़ाप्लिक्की कार्यात्मक प्रोग्रामिंग अवधारणाओं से प्रेरित थे और एक ऐसी भाषा विकसित करने का प्रयास किया जो फ्रंटेंड विकास के लिए जावास्क्रिप्ट के साथ काम करने में होने वाली समस्याओं को कम कर सके। एल्म का प्रारंभिक ध्यान एक ऐसी भाषा बनाने पर था जो न केवल विकास को सुगम बनाती है बल्कि उपयोगकर्ता अनुभव को भी गंभीरता से लेती है, प्रदर्शन और विश्वसनीयता को प्राथमिकता देती है।
अपने निर्माण के बाद से, एल्म लगातार विकसित हुआ है, एक ऐसे समुदाय को बढ़ावा दिया है जो सरलता और गुणवत्ता को महत्व देता है। जैसे-जैसे डेवलपर्स ने इसके मजबूत स्थैतिक टाइपिंग सिस्टम के माध्यम से रनटाइम त्रुटियों को कम करने के लाभों का अनुभव किया, भाषा की लोकप्रियता बढ़ी। 2016 में, एल्म ने संस्करण 0.17 पेश किया, जिसने इसकी आर्किटेक्चर को महत्वपूर्ण रूप से नया रूप दिया और नई सुविधाएँ लाई। एल्म समुदाय ने इसके पुस्तकालयों और उपकरणों में योगदान दिया, जिससे इसके पारिस्थितिकी तंत्र को बढ़ाया गया।
अक्टूबर 2023 तक, एल्म अभी भी सक्रिय रूप से विकसित और बनाए रखा जा रहा है, जिसमें संस्करण 0.19 नवीनतम स्थिर रिलीज है। इस भाषा ने एक वफादार अनुयायी वर्ग प्राप्त किया है, विशेष रूप से वेब विकास के क्षेत्र में, हालांकि यह कुछ मुख्यधारा के समकक्ष जैसे कि रिएक्ट या एंगुलर के स्तर की लोकप्रियता तक नहीं पहुंची है। कार्यात्मक प्रोग्रामिंग सिद्धांतों पर इसका ध्यान इसे अलग करता है, और इसे उन संगठनों द्वारा अपनाया जाता है जो अपने फ्रंटेंड कोड की गुणवत्ता में सुधार करना चाहते हैं।
एल्म एक मजबूत प्रकार प्रणाली का उपयोग करता है जो संकलन के समय त्रुटियों को पकड़ता है। उदाहरण के लिए:
add : Int -> Int -> Int
add x y = x + y
इस कोड के टुकड़े में, add
को एक फ़ंक्शन के रूप में परिभाषित किया गया है जो दो पूर्णांक लेता है और उनका योग लौटाता है। यदि आप इस फ़ंक्शन को एक स्ट्रिंग के साथ कॉल करने का प्रयास करते हैं, तो एल्म संकलन के समय त्रुटि प्रदान करेगा।
एल्म में फ़ंक्शन पहले श्रेणी के नागरिक होते हैं, जिससे उन्हें तर्क के रूप में पास किया जा सकता है और अन्य फ़ंक्शनों से लौटाया जा सकता है:
applyFunction : (a -> b) -> a -> b
applyFunction f x = f x
इस फ़ंक्शन में, applyFunction
एक फ़ंक्शन f
और एक तर्क x
लेता है, और तर्क पर फ़ंक्शन लागू करता है।
एल्म फ़ंक्शन परिभाषाओं और डेटा प्रकारों के लिए पैटर्न मिलान का उपयोग करता है, जिससे कोड अधिक स्पष्ट और संक्षिप्त होता है:
case value of
Just x -> "Found: " ++ x
Nothing -> "Not found"
यहाँ, case
अभिव्यक्ति यह जांचती है कि value
Just x
है या Nothing
, जिससे मूल्य के आधार पर विभिन्न व्यवहारों की अनुमति मिलती है।
एल्म अपरिवर्तनीयता को लागू करता है, जिसका अर्थ है कि एक बार डेटा संरचना बनाई जाने के बाद, इसे बदला नहीं जा सकता। इससे सुरक्षित और अधिक पूर्वानुमानित कोड बनता है:
type alias User = { name : String, age : Int }
alice : User
alice = { name = "Alice", age = 30 }
इस कोड में, alice
User
प्रकार का एक अपरिवर्तनीय रिकॉर्ड है।
एल्म आर्किटेक्चर (TEA) एल्म अनुप्रयोगों को संरचित करने के लिए एक मॉडल है, जिसमें तीन मुख्य घटक होते हैं: मॉडल, दृश्य, और अपडेट।
type alias Model = { count : Int }
update : Msg -> Model -> Model
update Increment model = { model | count = model.count + 1 }
इस स्निपेट में, update
में संदेशों के आधार पर अनुप्रयोग की स्थिति को बदलने की लॉजिक होती है।
एल्म की मजबूत प्रकार प्रणाली प्रकार अनुमान की विशेषता रखती है, जो संकलक को स्वचालित रूप से प्रकारों का अनुमान लगाने की अनुमति देती है, जिससे कोड में verbosity कम होती है:
multiply x y = x * y
इस मामले में, फ़ंक्शन multiply
बिना स्पष्ट प्रकार एनोटेशन के प्रकारों का अनुमान लगा सकता है।
एल्म सूची हेरफेर के लिए शक्तिशाली समर्थन प्रदान करता है, जिसमें कई अंतर्निहित फ़ंक्शन होते हैं:
numbers = [1, 2, 3, 4]
doubled = List.map (\x -> x * 2) numbers
यह कोड List.map
का उपयोग करता है ताकि सूची के प्रत्येक तत्व पर एक फ़ंक्शन लागू किया जा सके।
एल्म कस्टम प्रकारों (जिन्हें बीजगणितीय डेटा प्रकार भी कहा जाता है) के निर्माण की अनुमति देता है:
type Shape = Circle Float | Rectangle Float Float
यहाँ, Shape
या तो एक Circle
हो सकता है जिसका एक त्रिज्या है या एक Rectangle
जिसका चौड़ाई और ऊँचाई है।
एल्म प्रभावों को संभालने के लिए आदेशों और सदस्यताओं का उपयोग करता है, शुद्ध फ़ंक्शनों से साइड इफेक्ट्स को अलग करता है:
type Msg = FetchData | DataFetched Data
update : Msg -> Model -> (Model, Cmd Msg)
इस कोड ब्लॉक में, update
फ़ंक्शन उन संदेशों से निपटता है जो साइड इफेक्ट्स को आरंभ कर सकते हैं।
एल्म में एक शक्तिशाली संकलक है जो एल्म कोड को अनुकूलित जावास्क्रिप्ट में अनुवाद करता है। यह संकलक उपयोगी त्रुटि संदेश प्रदान करता है जो विकास के दौरान डेवलपर्स को डिबगिंग में मार्गदर्शन करते हैं, स्पष्टता और उपयोगकर्ता-मित्रता पर जोर देते हैं।
कई टेक्स्ट संपादक और आईडीई एल्म विकास का समर्थन करते हैं, जिनमें लोकप्रिय विकल्प शामिल हैं:
एल्म परियोजना बनाने के लिए, डेवलपर्स आमतौर पर एल्म सीएलआई का उपयोग करते हैं। एक नई एल्म परियोजना को आरंभ करने के लिए:
elm init
यह कमांड एल्म अनुप्रयोग के लिए आवश्यक निर्देशिका संरचना और कॉन्फ़िगरेशन फ़ाइलों को सेट करता है। इसके बाद के निर्माण को निम्नलिखित का उपयोग करके निष्पादित किया जा सकता है:
elm make src/Main.elm --output=main.js
यह कमांड Main.elm
को main.js
में संकलित करता है, जो एक वेब अनुप्रयोग में तैनाती के लिए तैयार है।
एल्म मुख्य रूप से फ्रंटेंड वेब विकास में उपयोग किया जाता है, जहाँ इसे निम्नलिखित के लिए पसंद किया जाता है:
जब इसे जावास्क्रिप्ट, टाइपस्क्रिप्ट, और यहां तक कि कार्यात्मक भाषाओं जैसे हैस्केल के साथ तुलना की जाती है, तो एल्म कई अद्वितीय विशेषताएँ प्रस्तुत करता है:
गतिशील भाषाओं जैसे पायथन या रूबी की तुलना में, एल्म की स्थैतिक टाइपिंग और संकलन-समय जांच बड़े कोडबेस में कम बग का कारण बन सकती है, जबकि इंटरैक्टिविटी बनाने के लिए एक अलग दृष्टिकोण की आवश्यकता होती है।
एल्म को जावास्क्रिप्ट में अनुवादित किया जा सकता है क्योंकि इसका संकलन लक्ष्य है, लेकिन वर्तमान में, अन्य कार्यात्मक भाषाओं या पैरेडाइम में एल्म कोड के स्रोत से स्रोत अनुवाद के लिए सीमित उपकरण उपलब्ध हैं।
एक दृष्टिकोण यह है कि एल्म की इंटरऑप क्षमताओं का उपयोग जावास्क्रिप्ट के साथ पोर्ट्स के माध्यम से किया जाए, जिससे आवश्यकतानुसार निर्बाध एकीकरण संभव हो सके। हालाँकि, एल्म से अन्य भाषाओं जैसे हैस्केल या स्काला के लिए पूर्ण विकसित ट्रांसपिलर्स अभी भी प्रारंभिक अवस्था में हैं और उन्हें और विकास की आवश्यकता है।