एल्म (प्रोग्रामिंग भाषा)

From alpha
Jump to navigation Jump to search
Elm
The Elm tangram
ParadigmFunctional
द्वारा डिज़ाइन किया गयाEvan Czaplicki
पहली प्रस्तुतिMarch 30, 2012; 12 years ago (2012-03-30)[1]
Stable release
0.19.1 / October 21, 2019; 4 years ago (2019-10-21)[2]
टाइपिंग अनुशासनStatic, Strong, Inferred
लाइसेंसPermissive (Revised BSD)[3]
फ़ाइल नाम एक्सटेंशनएस.elm
Influenced by
Haskell, Standard ML, OCaml, F#
Influenced
Redux,[4] Rust,[5] Vue[6]

एल्म एक डोमेन-विशिष्ट भाषा है | वेब ब्राउज़र-आधारित ग्राफिकल यूज़र इंटरफ़ेस बनाने वाली घोषणात्मक प्रोग्रामिंग के लिए डोमेन-विशिष्ट प्रोग्रामिंग भाषा। एल्म विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग है, और इसे उपयोगिता, प्रदर्शन और मजबूती (कंप्यूटर विज्ञान) पर जोर देने के साथ विकसित किया गया है। व्यवहार में यह कोई रनटाइम (कार्यक्रम जीवनचक्र चरण) अपवाद हैंडलिंग का विज्ञापन नहीं करता है,[7] एल्म कंपाइलर के टाइप सिस्टम # स्टेटिक टाइप चेकिंग द्वारा संभव बनाया गया।

इतिहास

एल्म को शुरुआत में 2012 में अपनी थीसिस के रूप में इवान जाप्लिकी द्वारा डिजाइन किया गया था।[8] एल्म की पहली रिलीज़ कई उदाहरणों और एक ऑनलाइन संपादक के साथ आई जिसने वेब ब्राउज़र में इसे आज़माना आसान बना दिया।[9] एल्म पर काम करने के लिए इवान 2013 में Prezi से जुड़े,[10] और 2016 में एक ओपन सोर्स इंजीनियर के रूप में NoRedInk में चले गए, साथ ही Elm Software Foundation भी शुरू किया।[11] एल्म कंपाइलर का प्रारंभिक कार्यान्वयन HTML, व्यापक शैली पत्रक और जावास्क्रिप्ट को लक्षित करता है।[12] कोर टूल्स के सेट का विस्तार जारी है, जिसमें अब एक रीड-इवल-प्रिंट लूप भी शामिल है,[13] पैकेज प्रबंधन प्रणाली,[14] समय-यात्रा डिबगर,[15] और macOS और Windows के लिए इंस्टॉलर।[16] एल्म के पास समुदाय द्वारा बनाई गई लाइब्रेरी और Ellie का एक पारिस्थितिकी तंत्र भी है, जो एक उन्नत ऑनलाइन संपादक है जो सहेजे गए कार्य और शामिल किए जाने की अनुमति देता है सामुदायिक पुस्तकालय।

सुविधाएँ

एल्म में भाषा निर्माण का एक छोटा सा सेट है, जिसमें पारंपरिक अगर-अभिव्यक्तियाँ, स्थानीय राज्य के लिए लेट-एक्सप्रेशन और पैटर्न मिलान के लिए केस-एक्सप्रेशन शामिल हैं।[17] एक कार्यात्मक भाषा के रूप में, यह अज्ञात कार्यों का समर्थन करता है, तर्कों के रूप में कार्य करता है, और कार्य कार्यों को वापस कर सकता है, बाद वाले अक्सर करीबी कार्यों के आंशिक अनुप्रयोग द्वारा। कार्यों को मूल्य द्वारा कहा जाता है। इसके शब्दार्थों में अपरिवर्तनीय मूल्य, शुद्ध कार्य और प्रकार के अनुमान के साथ स्थिर टाइपिंग शामिल है। एल्म प्रोग्राम एक वर्चुअल डोम के माध्यम से HTML को प्रस्तुत करते हैं, और एक सेवा के रूप में जावास्क्रिप्ट का उपयोग करके अन्य कोड के साथ इंटरऑपरेट कर सकते हैं।

अपरिवर्तनीयता

एल्म में सभी मान अपरिवर्तनीय वस्तु हैं, जिसका अर्थ है कि एक मान बनने के बाद इसे संशोधित नहीं किया जा सकता है। एल्म मानक पुस्तकालय में अपने सरणियों, सेटों और शब्दकोशों को लागू करने के लिए लगातार डेटा संरचनाओं का उपयोग करता है।[18]


स्थिर प्रकार

एल्म स्थिर रूप से टाइप किया गया है। टाइप एनोटेशन वैकल्पिक हैं (प्रकार अनुमान के कारण) लेकिन दृढ़ता से प्रोत्साहित किया जाता है। एनोटेशन परिभाषा के ऊपर की रेखा पर मौजूद हैं (सी-फ़ैमिली भाषाओं के विपरीत जहां प्रकार और नाम बीच-बीच में होते हैं)। एल्म मतलब है टाइप करने के लिए एक कोलन का उपयोग करता है।

प्रकारों में पूर्णांक और तार जैसे आदिम शामिल हैं, और बुनियादी डेटा संरचनाएँ जैसे सूचियाँ, टुपल्स और रिकॉर्ड। उदाहरण के लिए, कार्यों में तीरों के साथ लिखे गए प्रकार होते हैं round : Float -> Int. टैग किए गए संघ प्रोग्रामर को समस्या डोमेन से मेल खाने वाले तरीके से डेटा का प्रतिनिधित्व करने के लिए कस्टम प्रकार बनाने की अनुमति देते हैं।[19] प्रकार अन्य प्रकारों को संदर्भित कर सकते हैं, उदाहरण के लिए ए List Int. प्रकार हमेशा पूंजीकृत होते हैं; लोअरकेस नाम प्रकार चर हैं। उदाहरण के लिए, ए List a अज्ञात प्रकार के मूल्यों की एक सूची है। यह खाली सूची और तर्क का प्रकार है List.length, जो सूची के तत्वों के लिए अज्ञेयवादी है। कुछ विशेष प्रकार हैं जो प्रोग्रामर एल्म रनटाइम के साथ इंटरैक्ट करने के लिए बनाते हैं। उदाहरण के लिए, Html Msg एक (आभासी) DOM ट्री का प्रतिनिधित्व करता है जिसके ईवेंट हैंडलर सभी प्रकार के संदेश उत्पन्न करते हैं Msg.

किसी भी मूल्य को निहित रूप से अशक्त होने की अनुमति देने के बजाय (जैसे कि JavaScript's undefined या एक अशक्त सूचक), एल्म की मानक लाइब्रेरी a को परिभाषित करती है Maybe a प्रकार। कोड जो एक वैकल्पिक मान का उत्पादन या संचालन करता है, वह इस प्रकार का स्पष्ट रूप से उपयोग करता है, और अन्य सभी कोड की गारंटी है कि दावा किए गए प्रकार का मूल्य वास्तव में मौजूद है।

एल्म सीमित संख्या में बिल्ट-इन वर्ग टाइप करें प्रदान करता है: number जो भी शामिल है Int और Float जैसे संख्यात्मक ऑपरेटरों के उपयोग को सुविधाजनक बनाने के लिए (+) या (*), comparable जिसमें तुलना संचालकों के उपयोग को सुविधाजनक बनाने के लिए संख्याएँ, वर्ण, तार, तुलनीय चीजों की सूची और तुलनीय चीजों के टुपल्स शामिल हैं, और appendable जिसमें संयोजन की सुविधा के लिए तार और सूचियाँ शामिल हैं (++). एल्म इस प्रकार की कक्षाओं में कस्टम प्रकारों को शामिल करने या नए प्रकार की कक्षाएं बनाने के लिए एक तंत्र प्रदान नहीं करता है (सीमाएं अनुभाग देखें)।

मॉड्यूल सिस्टम

एल्म में एक मॉड्यूलर प्रोग्रामिंग है जो उपयोगकर्ताओं को मॉड्यूल नामक छोटे भागों में अपने कोड को तोड़ने की अनुमति देती है। मॉड्यूल कार्यान्वयन विवरण जैसे सहायक कार्यों और समूह से संबंधित कोड को एक साथ छुपा सकते हैं। मॉड्यूल आयातित कोड के लिए एक नाम स्थान के रूप में काम करते हैं, जैसे Bitwise.and. तीसरे पक्ष के पुस्तकालय (या पैकेज) में एक या अधिक मॉड्यूल होते हैं, और Elm Public Library से उपलब्ध होते हैं। सभी पुस्तकालयों को सॉफ्टवेयर संस्करण # अनुकूलता की डिग्री के अनुसार संस्करणित किया जाता है, जिसे संकलक और अन्य उपकरणों द्वारा लागू किया जाता है। अर्थात्, किसी फ़ंक्शन को हटाना या उसके प्रकार को बदलना केवल एक प्रमुख रिलीज़ में ही किया जा सकता है।

एचटीएमएल, सीएसएस और जावास्क्रिप्ट के साथ इंटरऑपरेबिलिटी

एल्म जावास्क्रिप्ट के साथ संवाद करने के लिए बंदरगाहों नामक अमूर्तता का उपयोग करता है।[20] यह एल्म कार्यक्रमों के अंदर और बाहर मूल्यों को प्रवाहित करने की अनुमति देता है, जिससे एल्म और जावास्क्रिप्ट के बीच संवाद करना संभव हो जाता है।

एल्म में एल्म/एचटीएमएल नामक एक लाइब्रेरी है जिसका उपयोग प्रोग्रामर एल्म के भीतर एचटीएमएल और सीएसएस लिखने के लिए कर सकता है।[21] अद्यतनों को कुशल बनाने के लिए यह वर्चुअल दस्तावेज़ ऑब्जेक्ट मॉडल दृष्टिकोण का उपयोग करता है।[22]


बैकएंड

एल्म आधिकारिक तौर पर सर्वर-साइड डेवलपमेंट का समर्थन नहीं करता है। कोर डेवलपमेंट टीम इसे अपना प्राथमिक लक्ष्य नहीं मानती है और फ्रंट-एंड डेवलपमेंट एक्सपीरियंस को बढ़ाने पर ध्यान केंद्रित करना पसंद करती है। फिर भी, कई स्वतंत्र परियोजनाएँ हैं, जो बैक-एंड के लिए एल्म का उपयोग करने की संभावनाओं का पता लगाने का प्रयास करती हैं। परियोजनाएं मुख्य रूप से एल्म संस्करण 0.18.0 पर अटकी हुई हैं क्योंकि नए मूल कोड और कुछ अन्य उपयोग की जाने वाली सुविधाओं का समर्थन नहीं करते हैं। एल्म को BEAM (Erlang वर्चुअल मशीन) के साथ उपयोग करने के दो प्रयास हैं। परियोजनाओं में से एक एल्म को सीधे पर्यावरण पर क्रियान्वित करती है[23] जबकि दूसरा इसे अमृत में संकलित करता है।[24] साथ ही, Node.js इंफ्रास्ट्रक्चर द्वारा संचालित एल्म के लिए बैक-एंड फ्रेमवर्क बनाने का भी प्रयास किया गया था।[25] कोई भी परियोजना उत्पादन के लिए तैयार नहीं है।

एल्म आर्किटेक्चर

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

एक एल्म कार्यक्रम हमेशा तीन भागों में विभाजित होता है:

  • मॉडल - आवेदन की स्थिति
  • देखें - एक फ़ंक्शन जो मॉडल को HTML में बदल देता है
  • अपडेट - एक फ़ंक्शन जो संदेशों के आधार पर मॉडल को अपडेट करता है

वे एल्म आर्किटेक्चर के मूल हैं।

उदाहरण के लिए, एक ऐसे एप्लिकेशन की कल्पना करें जो एक संख्या और एक बटन प्रदर्शित करता है जो दबाए जाने पर संख्या को बढ़ाता है।[26] इस मामले में, हमें केवल एक नंबर को स्टोर करने की आवश्यकता है, इसलिए हमारा मॉडल जितना सरल हो सकता है type alias Model = Int. view e> फ़ंक्शन के साथ परिभाषित किया जाएगा Html पुस्तकालय और संख्या और बटन प्रदर्शित करें। नंबर को अपडेट करने के लिए, हमें एक संदेश भेजने में सक्षम होना चाहिए update कार्य, जो एक कस्टम प्रकार के माध्यम से किया जाता है जैसे type Msg = Increase. Increase डी> मूल्य में परिभाषित बटन से जुड़ा हुआ है view कार्य ऐसे करें कि जब उपयोगकर्ता द्वारा बटन क्लिक किया जाता है, Increase को प्रेषित किया जाता है update फ़ंक्शन, जो संख्या बढ़ाकर मॉडल को अपडेट कर सकता है।

एल्म आर्किटेक्चर में, संदेश भेजना update राज्य को बदलने का एकमात्र तरीका है। अधिक परिष्कृत अनुप्रयोगों में, संदेश विभिन्न स्रोतों से आ सकते हैं: उपयोगकर्ता सहभागिता, मॉडल का प्रारंभ, से आंतरिक कॉल update, बाहरी घटनाओं की सदस्यता (विंडो का आकार बदलना, सिस्टम क्लॉक, जावास्क्रिप्ट इंटरऑप ...) और URL परिवर्तन और अनुरोध।

सीमाएं

एल्म Type_class#Higher-kinded_polymorphism|higher-kinded बहुरूपता का समर्थन नहीं करता,[27] हास्केल (प्रोग्रामिंग भाषा) और प्योरस्क्रिप्ट किस संबंधित भाषा की पेशकश करते हैं, न ही एल्म टाइप क्लास के निर्माण का समर्थन करता है।

इसका मतलब यह है कि, उदाहरण के लिए, एल्म का कोई जेनेरिक नहीं है map फ़ंक्शन जो कई डेटा संरचनाओं जैसे काम करता है List और Set. एल्म में, ऐसे कार्यों को आमतौर पर उनके मॉड्यूल नाम से योग्य कहा जाता है, उदाहरण के लिए कॉलिंग List.map और Set.map. हास्केल या प्योरस्क्रिप्ट में, केवल एक ही कार्य होगा map. यह एक ज्ञात फीचर अनुरोध है जो कम से कम 2015 से Czaplicki के कच्चे रोडमैप पर है।[28] एक अन्य परिणाम मध्यम से बड़े आकार की परियोजनाओं में बॉयलरप्लेट कोड की एक बड़ी मात्रा है जैसा कि एल्म इन एक्शन के लेखक द्वारा उनके एकल पृष्ठ अनुप्रयोग उदाहरण में दिखाया गया है।[29] अपडेट, व्यू, सब्सक्रिप्शन, रूट पार्सिंग और बिल्डिंग फ़ंक्शंस में लगभग समान अंशों को दोहराया जा रहा है।

उदाहरण कोड

<वाक्यविन्यास लैंग = एल्म> - यह एक पंक्ति की टिप्पणी है।

{- यह एक बहु-पंक्ति टिप्पणी है। यह {- नेस्टेबल है। -} -}

- यहां हम `ग्रीटिंग` नामक मान को परिभाषित करते हैं। प्रकार को `स्ट्रिंग` के रूप में अनुमानित किया गया है। अभिवादन =

    हैलो वर्ल्ड!
- शीर्ष-स्तरीय घोषणाओं में टाइप एनोटेशन जोड़ना सबसे अच्छा है।

हैलो: स्ट्रिंग नमस्कार =

    नमस्ते।

- फ़ंक्शन नाम के बाद तर्कों के साथ फ़ंक्शंस उसी तरह घोषित किए जाते हैं। एक्स वाई = जोड़ें

   एक्स + वाई

- फिर से, टाइप एनोटेशन जोड़ना सबसे अच्छा है। कर्ण : फ्लोट -> फ्लोट -> फ्लोट कर्ण a b =

   sqrt (ए ^ 2 + बी ^ 2)

- हम `\[arg] -> [अभिव्यक्ति]` सिंटैक्स के साथ लैम्ब्डा फ़ंक्शन बना सकते हैं। हैलो: स्ट्रिंग -> स्ट्रिंग हैलो = \s -> हाय, ++ एस

- फ़ंक्शन घोषणाओं में अज्ञात पैरामीटर नाम `_` द्वारा दर्शाए जा सकते हैं, जो मेल खाते हैं लेकिन शरीर में उपयोग नहीं किए जाते हैं। स्थिरांक: ए -> बी -> ए कॉन्स्ट के _ = के


- कार्य भी करी हैं; यहाँ हमने गुणा करी है - इंफिक्स ऑपरेटर `2` के साथ गुणा 2: संख्या -> संख्या गुणा 2 =

   (*) 2

- यदि-अभिव्यक्तियों का उपयोग `बूल` मूल्यों पर शाखा लगाने के लिए किया जाता है निरपेक्ष मूल्य: संख्या -> संख्या निरपेक्ष मान संख्या =

   यदि संख्या <0 तो संख्या और संख्या को नकारें
- रिकॉर्ड्स का उपयोग नामित फ़ील्ड वाले मान रखने के लिए किया जाता है

किताब : {शीर्षक : स्ट्रिंग, लेखक : स्ट्रिंग, पेज : इंट } पुस्तक =

   {शीर्षक = स्टेपेनवुल्फ़
   , लेखक = हेस्से
   , पेज = 237
   }

- रिकॉर्ड एक्सेस `.` के साथ किया जाता है शीर्षक: स्ट्रिंग शीर्षक =

   पुस्तक का शीर्षक

- रिकॉर्ड एक्सेस `.` का उपयोग फ़ंक्शन के रूप में भी किया जा सकता है लेखक: स्ट्रिंग लेखक =

   .लेखक पुस्तक

- हम `टाइप` कीवर्ड के साथ टैग किए गए यूनियन बना सकते हैं। - निम्न मान एक बाइनरी ट्री का प्रतिनिधित्व करता है। टाइप ट्री ए

   = खाली
   | नोड ए (ट्री ए) (ट्री ए)

- केस-एक्सप्रेशन के साथ इन प्रकारों का निरीक्षण करना संभव है। गहराई : ट्री ए -> इंट गहराई का पेड़ =

   का केस ट्री
       खाली -> 0
       नोड _ बाएँ दाएँ ->
           1 + अधिकतम (गहराई बाएं) (गहराई दाएं)

</वाक्यविन्यास हाइलाइट>

यह भी देखें

संदर्भ

  1. Czaplicki, Evan (30 March 2012). "My Thesis is Finally Complete! "Elm: Concurrent FRP for functional GUIs"". Reddit.
  2. "Releases · elm/Compiler".
  3. "elm/compiler". GitHub. 16 October 2021.
  4. "Prior Art - Redux". redux.js.org.
  5. "Uniqueness Types". Rust Blog. Retrieved 2016-10-08. Those of you familiar with the Elm style may recognize that the updated --explain messages draw heavy inspiration from the Elm approach.
  6. "Comparison with Other Frameworks — Vue.js".
  7. "Elm home page".
  8. "Elm: Concurrent FRP for Functional GUIs" (PDF).
  9. "Try Elm". elm-lang.org. Archived from the original on 2017-05-21. Retrieved 2019-07-24.
  10. "elm and prezi". elm-lang.org.
  11. "new adventures for elm". elm-lang.org.
  12. "elm/compiler". GitHub. 16 October 2021.
  13. "आरईपीएल". elm-lang.org.
  14. "package manager". elm-lang.org.
  15. "घर". elm-lang.org.
  16. "स्थापित करना". guide.elm-lang.org.
  17. - विन्यास.elm "वाक्य - विन्यास". elm-lang.org. Archived from the original on 2016-03-13. Retrieved 2013-05-31. {{cite web}}: Check |archive-url= value (help)
  18. "elm/core". package.elm-lang.org.
  19. "Model The Problem". Elm. Retrieved 4 May 2016.
  20. "JavaScript interop". elm-lang.org.
  21. "elm/html". package.elm-lang.org.
  22. "Blazing Fast HTML". elm-lang.org.
  23. "Kofigumbs/Elm-beam". 24 September 2021.
  24. "What is it?". 24 September 2021.
  25. "तख़्ता". 18 September 2021.
  26. "Buttons · An Introduction to Elm". guide.elm-lang.org. Retrieved 2020-10-15.
  27. "Higher-Kinded types Not Expressible? #396". github.com/elm-lang/elm-compiler. Retrieved 6 March 2015.
  28. "Higher-Kinded types Not Expressible #396". github.com/elm-lang/elm-compiler. Retrieved 19 November 2019.
  29. "Main.elm". github.com/rtfeldman/elm-spa-example. Retrieved 30 June 2020.


बाहरी संबंध

  • No URL found. Please specify a URL here or add one to Wikidata.