एमएल (प्रोग्रामिंग भाषा): Difference between revisions
No edit summary |
No edit summary |
||
Line 20: | Line 20: | ||
| website = | | website = | ||
}} | }} | ||
एमएल (मेटा लैंग्वेज) [[सामान्य प्रयोजन प्रोग्रामिंग भाषा|सामान्य प्रयोजन]] की [[कार्यात्मक प्रोग्रामिंग]] भाषा होती है | यह पॉलिमॉर्फिक हिंडले-मिलनर टाइप सिस्टम के उपयोग के लिए जाना जाता है, जो स्पष्ट प्रकार के एनोटेशन की आवश्यकता के बिना स्वचालित रूप से अधिकांश [[अभिव्यक्ति (प्रोग्रामिंग)]] के [[डेटा प्रकार]] को असाइन करता है, और टाइप सुरक्षा सुनिश्चित करता है। | एमएल (मेटा लैंग्वेज) [[सामान्य प्रयोजन प्रोग्रामिंग भाषा|सामान्य प्रयोजन]] की [[कार्यात्मक प्रोग्रामिंग]] भाषा होती है | यह पॉलिमॉर्फिक हिंडले-मिलनर टाइप सिस्टम के उपयोग के लिए जाना जाता है, जो स्पष्ट प्रकार के एनोटेशन की आवश्यकता के बिना स्वचालित रूप से अधिकांश [[अभिव्यक्ति (प्रोग्रामिंग)]] के [[डेटा प्रकार]] को असाइन करता है, और टाइप सुरक्षा सुनिश्चित करता है। औपचारिक प्रमाण है कि उत्तम प्रकार से टाइप किया गया एमएल प्रोग्राम रनटाइम प्रकार की त्रुटियों का कारण नहीं बनता है।<ref>Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 17(3):348–375, 1978.</ref> एमएल फ़ंक्शन तर्कों, [[कचरा संग्रह (कंप्यूटर विज्ञान)|गार्बेज संग्रह (कंप्यूटर विज्ञान)]], [[अनिवार्य प्रोग्रामिंग]], [[कॉल-टू-मूल्य से]] और [[करी]]इंग के लिए पैटर्न मिलान प्रदान करता है। यह प्रोग्रामिंग भाषा अनुसंधान में अत्यधिक उपयोग किया जाता है और यह प्रोग्रामिंग भाषाओं के औपचारिक शब्दार्थों का उपयोग करके पूर्ण रूप से निर्दिष्ट और सत्यापित होने वाली कुछ भाषाओं में से है। इसके प्रकार पैटर्न मिलान इसे उत्तम उपाय से अनुकूल बनाते हैं और सामान्यतः अन्य औपचारिक भाषाओं जैसे [[संकलक लेखन]], स्वचालित प्रमेय सिद्ध करने और [[औपचारिक सत्यापन]] में काम करने के लिए उपयोग किया जाता है। | ||
== अवलोकन == | == अवलोकन == | ||
Line 28: | Line 28: | ||
एमएल की मजबूती अधिकतर भाषा डिजाइन और परिवर्तन (संकलक, विश्लेषक, प्रमेय सिद्ध) में लागू होती है, लेकिन यह सामान्य उद्देश्य वाली भाषा है जिसका उपयोग जैव सूचना विज्ञान और वित्तीय प्रणालियों में भी किया जाता है। | एमएल की मजबूती अधिकतर भाषा डिजाइन और परिवर्तन (संकलक, विश्लेषक, प्रमेय सिद्ध) में लागू होती है, लेकिन यह सामान्य उद्देश्य वाली भाषा है जिसका उपयोग जैव सूचना विज्ञान और वित्तीय प्रणालियों में भी किया जाता है। | ||
एमएल को [[एडिनबर्ग विश्वविद्यालय]] में 1970 के दशक के प्रारम्भ में [[रॉबिन मिलनर]] और अन्य द्वारा विकसित किया गया था <ref name="Gordon1996">{{cite web | last = Gordon | first = Michael J. C. | author-link = Michael J. C. Gordon | year=1996 | title = From LCF to HOL: a short history | url = http://www.cl.cam.ac.uk/~mjcg/papers/HolHistory.html | access-date = 2007-10-11}}</ref> और इसका सिंटैक्स [[ISWIM| | एमएल को [[एडिनबर्ग विश्वविद्यालय]] में 1970 के दशक के प्रारम्भ में [[रॉबिन मिलनर]] और अन्य द्वारा विकसित किया गया था <ref name="Gordon1996">{{cite web | last = Gordon | first = Michael J. C. | author-link = Michael J. C. Gordon | year=1996 | title = From LCF to HOL: a short history | url = http://www.cl.cam.ac.uk/~mjcg/papers/HolHistory.html | access-date = 2007-10-11}}</ref> और इसका सिंटैक्स [[ISWIM|आईएसडब्लूआईएम]] से प्रेरित है। ऐतिहासिक रूप से, एमएल की कल्पना को[[संगणनीय कार्यों के लिए तर्क]] (जिसकी भाषा, प्लम्बडा, [[पहले क्रम का तर्क]] का संयोजन फ़र्स्ट-ऑर्डर प्रेडिकेट कैलकुलस और सिंपल-टाइप्ड पॉलीमॉर्फिज़्म (कंप्यूटर साइंस) [[लैम्ब्डा कैलकुलस]]) के लिए प्रूफ टैक्टिक्स विकसित करने के लिए की गई थी)। | ||
एमएल परिवार में कई भाषाएं हैं; तीन सबसे प्रमुख मानक | एमएल परिवार में कई भाषाएं हैं; तीन सबसे प्रमुख मानक एसएमएल, [[OCaml|ओसीएमएल]] और एफ शार्प (प्रोग्रामिंग भाषा) हैं। एमएल के विचारों ने कई अन्य भाषाओं, जैसे हास्केल (प्रोग्रामिंग भाषा), साइक्लोन (प्रोग्रामिंग भाषा), [[नेमर्ले]],<ref>{{Citation |title=Programming language for "special forces" of developers |publisher=Nemerle Project Team |publication-place=Russian Software Development Network |url=http://nemerle.org/About |access-date=January 24, 2021}}</ref> [[एटीएस (प्रोग्रामिंग भाषा)]], और [[एल्म (प्रोग्रामिंग भाषा)]] को प्रभावित किया है।<ref>{{cite book|last1=Tate|first1=Bruce A.|last2=Daoud|first2=Fred|last3=Dees|first3=Ian|last4=Moffitt|first4=Jack|title=Seven More Languages in Seven Weeks|date=2014|publisher=The Pragmatic Programmers, LLC|isbn=978-1-941222-15-7|pages=97, 101|edition=Book version: P1.0-November 2014|chapter=3. Elm|quote=On page 101, Elm creator Evan Czaplicki says: 'I tend to say "Elm is an ML-family language" to get at the shared heritage of all these languages.' ["these languages" is referring to Haskell, OCaml, SML, and F#.]}}</ref> | ||
== उदाहरण == | == उदाहरण == | ||
निम्नलिखित उदाहरण मानक एमएल के सिंटैक्स का उपयोग करते हैं। अन्य एमएल | निम्नलिखित उदाहरण मानक एमएल के सिंटैक्स का उपयोग करते हैं। अन्य एमएल भाषाएँ जैसे ओसीएमएल और F# छोटे-छोटे तरीकों से भिन्न हैं। | ||
=== [[कारख़ाने का|फ़ैक्टोरियल]] === | === [[कारख़ाने का|फ़ैक्टोरियल]] === | ||
Line 43: | Line 43: | ||
fun fac (0 : int) : int = 1 | fun fac (0 : int) : int = 1 | ||
<nowiki>|</nowiki> fac (n : int) : int = n * fac (n - 1) | <nowiki>|</nowiki> fac (n : int) : int = n * fac (n - 1) | ||
यह फैक्टोरियल को पुनरावर्ती फ़ंक्शन के रूप में वर्णित करता है, जिसमें एकल समाप्ति आधार केस होता है। यह गणित की पाठ्यपुस्तकों में पाए जाने वाले फैक्टोरियल्स के विवरण के समान होता है। अधिकांश एमएल कोड सुविधा और सिंटैक्स में गणित के समान होते है। | यह फैक्टोरियल को पुनरावर्ती फ़ंक्शन के रूप में वर्णित करता है, जिसमें एकल समाप्ति आधार केस होता है। यह गणित की पाठ्यपुस्तकों में पाए जाने वाले फैक्टोरियल्स के विवरण के समान होता है। अधिकांश एमएल कोड सुविधा और सिंटैक्स में गणित के समान होते है। | ||
दिखाई गई परिभाषा का भाग वैकल्पिक है, और इस फ़ंक्शन के प्रकारों का वर्णन करता है। संकेतन E: t को व्यंजक E के प्रकार t के रूप में पढ़ा जा सकता है। उदाहरण के लिए, तर्क n को टाइप पूर्णांक (int) असाइन किया गया है, और fac (n: int), पूर्णांक n पर fac लगाने का परिणाम भी प्रकार पूर्णांक है। पूर्ण के रूप में फ़ंक्शन फ़ैक में पूर्णांक से पूर्णांक (int -> int) तक टाइप फ़ंक्शन होता है, अर्थात, पूर्णांक को तर्क के रूप में स्वीकार करता है और पूर्णांक परिणाम देता है। टाइप के अनुमान के लिए धन्यवाद, टाइप के एनोटेशन को छोड़ा जा सकता है और संकलक द्वारा प्राप्त किया जाएगा। टाइप एनोटेशन के बिना पुनर्लेखित, उदाहरण इस प्रकार दिखता है: | दिखाई गई परिभाषा का भाग वैकल्पिक है, और इस फ़ंक्शन के प्रकारों का वर्णन करता है। संकेतन E: t को व्यंजक E के प्रकार t के रूप में पढ़ा जा सकता है। उदाहरण के लिए, तर्क n को टाइप पूर्णांक (int) असाइन किया गया है, और fac (n: int), पूर्णांक n पर fac लगाने का परिणाम भी प्रकार पूर्णांक है। पूर्ण के रूप में फ़ंक्शन फ़ैक में पूर्णांक से पूर्णांक (int -> int) तक टाइप फ़ंक्शन होता है, अर्थात, पूर्णांक को तर्क के रूप में स्वीकार करता है और पूर्णांक परिणाम देता है। टाइप के अनुमान के लिए धन्यवाद, टाइप के एनोटेशन को छोड़ा जा सकता है और संकलक द्वारा प्राप्त किया जाएगा। टाइप एनोटेशन के बिना पुनर्लेखित, उदाहरण इस प्रकार दिखता है: | ||
fun fac 0 = 1 | fun fac 0 = 1 | ||
| fac n = n * fac (n - 1) | | fac n = n * fac (n - 1) | ||
फ़ंक्शन पैटर्न मिलान पर भी निर्भर करता है, जो एमएल प्रोग्रामिंग का महत्वपूर्ण भाग है। ध्यान दें कि किसी फ़ंक्शन के पैरामीटर आवश्यक रूप से कोष्ठक में नहीं हैं बल्कि रिक्त स्थान द्वारा अलग किए गए हैं। जब फ़ंक्शन का तर्क 0 (शून्य) होता है तो यह पूर्णांक 1 (एक) लौटाएगा। अन्य सभी विषयो के लिए दूसरी पंक्ति की कोशिश की जाती है। यह [[रिकर्सन (कंप्यूटर विज्ञान)]] है, और बेस केस तक पहुंचने तक फ़ंक्शन को फिर से निष्पादित करता है। | फ़ंक्शन पैटर्न मिलान पर भी निर्भर करता है, जो एमएल प्रोग्रामिंग का महत्वपूर्ण भाग है। ध्यान दें कि किसी फ़ंक्शन के पैरामीटर आवश्यक रूप से कोष्ठक में नहीं हैं बल्कि रिक्त स्थान द्वारा अलग किए गए हैं। जब फ़ंक्शन का तर्क 0 (शून्य) होता है तो यह पूर्णांक 1 (एक) लौटाएगा। अन्य सभी विषयो के लिए दूसरी पंक्ति की कोशिश की जाती है। यह [[रिकर्सन (कंप्यूटर विज्ञान)]] है, और बेस केस तक पहुंचने तक फ़ंक्शन को फिर से निष्पादित करता है। | ||
फैक्टोरियल फ़ंक्शन के इस कार्यान्वयन को समाप्त करने की गारंटी नहीं है, क्योंकि नकारात्मक तर्क पुनरावर्ती कॉल की [[अनंत अवरोही श्रृंखला]] का कारण बनता है। अधिक मजबूत कार्यान्वयन पुनरावर्ती से पहले गैर-नकारात्मक तर्क की जांच करेगा, जो इस प्रकार है: | फैक्टोरियल फ़ंक्शन के इस कार्यान्वयन को समाप्त करने की गारंटी नहीं है, क्योंकि नकारात्मक तर्क पुनरावर्ती कॉल की [[अनंत अवरोही श्रृंखला]] का कारण बनता है। अधिक मजबूत कार्यान्वयन पुनरावर्ती से पहले गैर-नकारात्मक तर्क की जांच करेगा, जो इस प्रकार है: | ||
fun fact n = let | fun fact n = let | ||
Line 70: | Line 60: | ||
if (n < 0) then raise Domain else fac n | if (n < 0) then raise Domain else fac n | ||
end | end | ||
समस्याग्रस्त विषय (जब n ऋणात्मक होता है) एमएल की अपवाद प्रणाली के उपयोग को प्रदर्शित करता है। | समस्याग्रस्त विषय (जब n ऋणात्मक होता है) एमएल की अपवाद प्रणाली के उपयोग को प्रदर्शित करता है। | ||
इसके आंतरिक लूप को [[टेल कॉल]] के रूप में लिखकर फ़ंक्शन को और अच्छा बनाया जा सकता है, जैसे कि [[कॉल स्टैक]] को फ़ंक्शन कॉल की संख्या के अनुपात में बढ़ने की आवश्यकता नहीं है। यह आंतरिक फ़ंक्शन में अतिरिक्त, संचायक, पैरामीटर जोड़कर प्राप्त किया जाता है। अंत में, हम पहुंचे | इसके आंतरिक लूप को [[टेल कॉल]] के रूप में लिखकर फ़ंक्शन को और अच्छा बनाया जा सकता है, जैसे कि [[कॉल स्टैक]] को फ़ंक्शन कॉल की संख्या के अनुपात में बढ़ने की आवश्यकता नहीं है। यह आंतरिक फ़ंक्शन में अतिरिक्त, संचायक, पैरामीटर जोड़कर प्राप्त किया जाता है। अंत में, हम पहुंचे | ||
fun fact n = let | fun fact n = let | ||
Line 85: | Line 70: | ||
if (n < 0) then raise Domain else fac n 1 | if (n < 0) then raise Domain else fac n 1 | ||
end | end | ||
=== उत्क्रम सूची === | === उत्क्रम सूची === | ||
निम्न फ़ंक्शन किसी सूची में तत्वों को पलट देता है। अधिक सटीक रूप से, यह नई सूची देता है जिसके तत्व दी गई सूची की तुलना में उल्टे क्रम में होते हैं। | निम्न फ़ंक्शन किसी सूची में तत्वों को पलट देता है। अधिक सटीक रूप से, यह नई सूची देता है जिसके तत्व दी गई सूची की तुलना में उल्टे क्रम में होते हैं। | ||
fun 'a reverse xs : 'a list = List.foldl (op ::) [] xs | fun 'a reverse xs : 'a list = List.foldl (op ::) [] xs | ||
रिवर्स का यह कार्यान्वयन, जबकि सही और स्पष्ट है, अक्षम है, निष्पादन के लिए [[द्विघात समय]] की आवश्यकता होती है। फ़ंक्शन को [[रैखिक समय]] में निष्पादित करने के लिए फिर से लिखा जा सकता है: | रिवर्स का यह कार्यान्वयन, जबकि सही और स्पष्ट है, अक्षम है, निष्पादन के लिए [[द्विघात समय]] की आवश्यकता होती है। फ़ंक्शन को [[रैखिक समय]] में निष्पादित करने के लिए फिर से लिखा जा सकता है: | ||
यह फ़ंक्शन पैरामीट्रिक बहुरूपता का उदाहरण है। यह उन सूचियों का उपभोग कर सकता है जिनके तत्वों का कोई प्रकार है, और उसी प्रकार की सूची वापस कर सकते हैं। | यह फ़ंक्शन पैरामीट्रिक बहुरूपता का उदाहरण है। यह उन सूचियों का उपभोग कर सकता है जिनके तत्वों का कोई प्रकार है, और उसी प्रकार की सूची वापस कर सकते हैं। | ||
=== मॉड्यूल === | === मॉड्यूल === | ||
बड़ी परियोजनाओं और पुस्तकालयों की संरचना के लिए मॉड्यूल एमएल की प्रणाली है। मॉड्यूल में हस्ताक्षर फ़ाइल और एक या अधिक संरचना फ़ाइलें होती हैं। हस्ताक्षर फ़ाइल [[एपीआई]] को लागू करने के लिए निर्दिष्ट करती है (जैसे C हेडर फ़ाइल, या [[इंटरफ़ेस (जावा)]] फ़ाइल) और संरचना हस्ताक्षर लागू करती है (जैसे सी स्रोत फ़ाइल या जावा क्लास फ़ाइल)। उदाहरण के लिए, निम्नलिखित अंकगणितीय हस्ताक्षर को परिभाषित करता है और परिमेय संख्याओं का उपयोग करके इसका कार्यान्वयन करता है: | बड़ी परियोजनाओं और पुस्तकालयों की संरचना के लिए मॉड्यूल एमएल की प्रणाली है। मॉड्यूल में हस्ताक्षर फ़ाइल और एक या अधिक संरचना फ़ाइलें होती हैं। हस्ताक्षर फ़ाइल [[एपीआई]] को लागू करने के लिए निर्दिष्ट करती है (जैसे C हेडर फ़ाइल, या [[इंटरफ़ेस (जावा)]] फ़ाइल) और संरचना हस्ताक्षर लागू करती है (जैसे सी स्रोत फ़ाइल या जावा क्लास फ़ाइल)। उदाहरण के लिए, निम्नलिखित अंकगणितीय हस्ताक्षर को परिभाषित करता है और परिमेय संख्याओं का उपयोग करके इसका कार्यान्वयन करता है: | ||
signature ARITH = | signature ARITH = | ||
Line 116: | Line 86: | ||
val sum : t * t -> t | val sum : t * t -> t | ||
end | end | ||
structure Rational : ARITH = | structure Rational : ARITH = | ||
Line 130: | Line 95: | ||
fun sum (Rat (a, b), Rat (c, d)) = Rat (a * d + c * b , b * d) | fun sum (Rat (a, b), Rat (c, d)) = Rat (a * d + c * b , b * d) | ||
end | end | ||
इन्हें 'युएसई' कमांड द्वारा दुभाषिया में आयात किया जाता है। कार्यान्वयन के साथ सहभागिता केवल हस्ताक्षर कार्यों के माध्यम से अनुमति दी जाती है, उदाहरण के लिए इस कोड के माध्यम से सीधे 'रैट' डेटा ऑब्जेक्ट बनाना संभव नहीं होता है। 'संरचना' ब्लॉक कार्यान्वयन के सभी विवरणों को बाहर से छुपाता है। | |||
इन्हें ' | |||
एमएल के मानक पुस्तकालयों को इस प्रकार से मॉड्यूल के रूप में लागू किया जाता है। | एमएल के मानक पुस्तकालयों को इस प्रकार से मॉड्यूल के रूप में लागू किया जाता है। | ||
Line 143: | Line 105: | ||
* [[आलसी एमएल|मंद एमएल]]: 1980 के दशक की शुरुआत से एक प्रयोगात्मक आलसी मूल्यांकन एमएल बोली | * [[आलसी एमएल|मंद एमएल]]: 1980 के दशक की शुरुआत से एक प्रयोगात्मक आलसी मूल्यांकन एमएल बोली | ||
* [[पाल (प्रोग्रामिंग भाषा)]]: एमएल से संबंधित एक शैक्षिक भाषा | * [[पाल (प्रोग्रामिंग भाषा)]]: एमएल से संबंधित एक शैक्षिक भाषा | ||
* | * ओसीएमएल: [[Coq|सीओक्यू]] को लागू करने के लिए उपयोग की जाने वाली एक एमएल बोली | ||
* एफ शार्प (प्रोग्रामिंग लैंग्वेज) | | * एफ शार्प (प्रोग्रामिंग लैंग्वेज) | एफ:नेफ्ट फ्रेमवर्क के लिए ओपन-सोर्स क्रॉस-प्लेटफॉर्म फंक्शनल-फर्स्ट लैंग्वेज | ||
* [[एकमा स्क्रिप्ट]] और [[टाइपप्रति]]: ईसीएमएस्क्रिप्ट के लिए धातु भाषाएं | * [[एकमा स्क्रिप्ट]] और [[टाइपप्रति]]: ईसीएमएस्क्रिप्ट के लिए धातु भाषाएं | ||
Revision as of 13:42, 4 March 2023
Paradigm | Multi-paradigm: functional, generic, imperative |
---|---|
द्वारा डिज़ाइन किया गया | Robin Milner and others at the University of Edinburgh |
पहली प्रस्तुति | 1973 |
टाइपिंग अनुशासन | Inferred, static, strong |
Dialects | |
OCaml, Standard ML, F# | |
Influenced by | |
ISWIM | |
Influenced | |
Clojure, Coq, Cyclone, C++, Elm, F#, F*, Haskell, Idris, Kotlin, Miranda, Nemerle, OCaml, Opa, Erlang, Rust, Scala, Standard ML |
एमएल (मेटा लैंग्वेज) सामान्य प्रयोजन की कार्यात्मक प्रोग्रामिंग भाषा होती है | यह पॉलिमॉर्फिक हिंडले-मिलनर टाइप सिस्टम के उपयोग के लिए जाना जाता है, जो स्पष्ट प्रकार के एनोटेशन की आवश्यकता के बिना स्वचालित रूप से अधिकांश अभिव्यक्ति (प्रोग्रामिंग) के डेटा प्रकार को असाइन करता है, और टाइप सुरक्षा सुनिश्चित करता है। औपचारिक प्रमाण है कि उत्तम प्रकार से टाइप किया गया एमएल प्रोग्राम रनटाइम प्रकार की त्रुटियों का कारण नहीं बनता है।[1] एमएल फ़ंक्शन तर्कों, गार्बेज संग्रह (कंप्यूटर विज्ञान), अनिवार्य प्रोग्रामिंग, कॉल-टू-मूल्य से और करीइंग के लिए पैटर्न मिलान प्रदान करता है। यह प्रोग्रामिंग भाषा अनुसंधान में अत्यधिक उपयोग किया जाता है और यह प्रोग्रामिंग भाषाओं के औपचारिक शब्दार्थों का उपयोग करके पूर्ण रूप से निर्दिष्ट और सत्यापित होने वाली कुछ भाषाओं में से है। इसके प्रकार पैटर्न मिलान इसे उत्तम उपाय से अनुकूल बनाते हैं और सामान्यतः अन्य औपचारिक भाषाओं जैसे संकलक लेखन, स्वचालित प्रमेय सिद्ध करने और औपचारिक सत्यापन में काम करने के लिए उपयोग किया जाता है।
अवलोकन
एमएल की विशेषताओं में कॉल-बाय-वैल्यू मूल्यांकन रणनीति, प्रथम श्रेणी के कार्य, गार्बेज संग्रह के माध्यम से स्वचालित मेमोरी प्रबंधन, पैरामीट्रिक बहुरूपता, प्रकार प्रणाली स्टेटिक टाइपिंग, प्रकार अनुमान, बीजगणितीय डेटा प्रकार, पैटर्न मिलान और अपवाद हैंडलिंग सम्मलित हैं। एमएल स्कोप (कंप्यूटर साइंस) लेक्सिकल स्कोपिंग नियमों का उपयोग करता है।[2] एमएल को अशुद्ध कार्यात्मक भाषा के रूप में संदर्भित किया जा सकता है, क्योंकि यह कार्यात्मक प्रोग्रामिंग को प्रोत्साहित करती है, और यह साइड-इफ़ेक्ट (कंप्यूटर विज्ञान) की अनुमति देती है[3] (जैसे कि लिस्प प्रोग्रामिंग भाषा लेकिन हास्केल (प्रोग्रामिंग भाषा) जैसी विशुद्ध रूप से कार्यात्मक भाषा के विपरीत)। अधिकांश प्रोग्रामिंग भाषाओं की जैसे, एमएल उत्सुक मूल्यांकन का उपयोग करता है, जिसका अर्थ है कि सभी उप-अभिव्यक्तियों का सदैव मूल्यांकन किया जाता है, चूँकि क्लोजर (कंप्यूटर विज्ञान) के उपयोग के माध्यम से मंद मूल्यांकन प्राप्त किया जा सकता है। इस प्रकार हास्केल के जैसे अनंत धाराएँ बना और उपयोग कर सकते हैं, लेकिन उनकी अभिव्यक्ति अप्रत्यक्ष होती है।
एमएल की मजबूती अधिकतर भाषा डिजाइन और परिवर्तन (संकलक, विश्लेषक, प्रमेय सिद्ध) में लागू होती है, लेकिन यह सामान्य उद्देश्य वाली भाषा है जिसका उपयोग जैव सूचना विज्ञान और वित्तीय प्रणालियों में भी किया जाता है।
एमएल को एडिनबर्ग विश्वविद्यालय में 1970 के दशक के प्रारम्भ में रॉबिन मिलनर और अन्य द्वारा विकसित किया गया था [4] और इसका सिंटैक्स आईएसडब्लूआईएम से प्रेरित है। ऐतिहासिक रूप से, एमएल की कल्पना कोसंगणनीय कार्यों के लिए तर्क (जिसकी भाषा, प्लम्बडा, पहले क्रम का तर्क का संयोजन फ़र्स्ट-ऑर्डर प्रेडिकेट कैलकुलस और सिंपल-टाइप्ड पॉलीमॉर्फिज़्म (कंप्यूटर साइंस) लैम्ब्डा कैलकुलस) के लिए प्रूफ टैक्टिक्स विकसित करने के लिए की गई थी)।
एमएल परिवार में कई भाषाएं हैं; तीन सबसे प्रमुख मानक एसएमएल, ओसीएमएल और एफ शार्प (प्रोग्रामिंग भाषा) हैं। एमएल के विचारों ने कई अन्य भाषाओं, जैसे हास्केल (प्रोग्रामिंग भाषा), साइक्लोन (प्रोग्रामिंग भाषा), नेमर्ले,[5] एटीएस (प्रोग्रामिंग भाषा), और एल्म (प्रोग्रामिंग भाषा) को प्रभावित किया है।[6]
उदाहरण
निम्नलिखित उदाहरण मानक एमएल के सिंटैक्स का उपयोग करते हैं। अन्य एमएल भाषाएँ जैसे ओसीएमएल और F# छोटे-छोटे तरीकों से भिन्न हैं।
फ़ैक्टोरियल
शुद्ध एमएल के रूप में व्यक्त फैक्टोरियल फ़ंक्शन:
<वाक्यविन्यास प्रकाश लैंग = एसएमएल>
fun fac (0 : int) : int = 1
fun fac (0 : int) : int = 1 | fac (n : int) : int = n * fac (n - 1)
यह फैक्टोरियल को पुनरावर्ती फ़ंक्शन के रूप में वर्णित करता है, जिसमें एकल समाप्ति आधार केस होता है। यह गणित की पाठ्यपुस्तकों में पाए जाने वाले फैक्टोरियल्स के विवरण के समान होता है। अधिकांश एमएल कोड सुविधा और सिंटैक्स में गणित के समान होते है।
दिखाई गई परिभाषा का भाग वैकल्पिक है, और इस फ़ंक्शन के प्रकारों का वर्णन करता है। संकेतन E: t को व्यंजक E के प्रकार t के रूप में पढ़ा जा सकता है। उदाहरण के लिए, तर्क n को टाइप पूर्णांक (int) असाइन किया गया है, और fac (n: int), पूर्णांक n पर fac लगाने का परिणाम भी प्रकार पूर्णांक है। पूर्ण के रूप में फ़ंक्शन फ़ैक में पूर्णांक से पूर्णांक (int -> int) तक टाइप फ़ंक्शन होता है, अर्थात, पूर्णांक को तर्क के रूप में स्वीकार करता है और पूर्णांक परिणाम देता है। टाइप के अनुमान के लिए धन्यवाद, टाइप के एनोटेशन को छोड़ा जा सकता है और संकलक द्वारा प्राप्त किया जाएगा। टाइप एनोटेशन के बिना पुनर्लेखित, उदाहरण इस प्रकार दिखता है:
fun fac 0 = 1
| fac n = n * fac (n - 1)
फ़ंक्शन पैटर्न मिलान पर भी निर्भर करता है, जो एमएल प्रोग्रामिंग का महत्वपूर्ण भाग है। ध्यान दें कि किसी फ़ंक्शन के पैरामीटर आवश्यक रूप से कोष्ठक में नहीं हैं बल्कि रिक्त स्थान द्वारा अलग किए गए हैं। जब फ़ंक्शन का तर्क 0 (शून्य) होता है तो यह पूर्णांक 1 (एक) लौटाएगा। अन्य सभी विषयो के लिए दूसरी पंक्ति की कोशिश की जाती है। यह रिकर्सन (कंप्यूटर विज्ञान) है, और बेस केस तक पहुंचने तक फ़ंक्शन को फिर से निष्पादित करता है।
फैक्टोरियल फ़ंक्शन के इस कार्यान्वयन को समाप्त करने की गारंटी नहीं है, क्योंकि नकारात्मक तर्क पुनरावर्ती कॉल की अनंत अवरोही श्रृंखला का कारण बनता है। अधिक मजबूत कार्यान्वयन पुनरावर्ती से पहले गैर-नकारात्मक तर्क की जांच करेगा, जो इस प्रकार है:
fun fact n = let
fun fac 0 = 1 | fac n = n * fac (n - 1) in if (n < 0) then raise Domain else fac n end
समस्याग्रस्त विषय (जब n ऋणात्मक होता है) एमएल की अपवाद प्रणाली के उपयोग को प्रदर्शित करता है।
इसके आंतरिक लूप को टेल कॉल के रूप में लिखकर फ़ंक्शन को और अच्छा बनाया जा सकता है, जैसे कि कॉल स्टैक को फ़ंक्शन कॉल की संख्या के अनुपात में बढ़ने की आवश्यकता नहीं है। यह आंतरिक फ़ंक्शन में अतिरिक्त, संचायक, पैरामीटर जोड़कर प्राप्त किया जाता है। अंत में, हम पहुंचे
fun fact n = let
fun fac 0 acc = acc | fac n acc = fac (n - 1) (n * acc) in if (n < 0) then raise Domain else fac n 1 end
उत्क्रम सूची
निम्न फ़ंक्शन किसी सूची में तत्वों को पलट देता है। अधिक सटीक रूप से, यह नई सूची देता है जिसके तत्व दी गई सूची की तुलना में उल्टे क्रम में होते हैं।
fun 'a reverse xs : 'a list = List.foldl (op ::) [] xs
रिवर्स का यह कार्यान्वयन, जबकि सही और स्पष्ट है, अक्षम है, निष्पादन के लिए द्विघात समय की आवश्यकता होती है। फ़ंक्शन को रैखिक समय में निष्पादित करने के लिए फिर से लिखा जा सकता है: यह फ़ंक्शन पैरामीट्रिक बहुरूपता का उदाहरण है। यह उन सूचियों का उपभोग कर सकता है जिनके तत्वों का कोई प्रकार है, और उसी प्रकार की सूची वापस कर सकते हैं।
मॉड्यूल
बड़ी परियोजनाओं और पुस्तकालयों की संरचना के लिए मॉड्यूल एमएल की प्रणाली है। मॉड्यूल में हस्ताक्षर फ़ाइल और एक या अधिक संरचना फ़ाइलें होती हैं। हस्ताक्षर फ़ाइल एपीआई को लागू करने के लिए निर्दिष्ट करती है (जैसे C हेडर फ़ाइल, या इंटरफ़ेस (जावा) फ़ाइल) और संरचना हस्ताक्षर लागू करती है (जैसे सी स्रोत फ़ाइल या जावा क्लास फ़ाइल)। उदाहरण के लिए, निम्नलिखित अंकगणितीय हस्ताक्षर को परिभाषित करता है और परिमेय संख्याओं का उपयोग करके इसका कार्यान्वयन करता है:
signature ARITH =
sig type t val zero : t val succ : t -> t val sum : t * t -> t end
structure Rational : ARITH =
struct datatype t = Rat of int * int val zero = Rat (0, 1) fun succ (Rat (a, b)) = Rat (a + b, b) fun sum (Rat (a, b), Rat (c, d)) = Rat (a * d + c * b , b * d) end
इन्हें 'युएसई' कमांड द्वारा दुभाषिया में आयात किया जाता है। कार्यान्वयन के साथ सहभागिता केवल हस्ताक्षर कार्यों के माध्यम से अनुमति दी जाती है, उदाहरण के लिए इस कोड के माध्यम से सीधे 'रैट' डेटा ऑब्जेक्ट बनाना संभव नहीं होता है। 'संरचना' ब्लॉक कार्यान्वयन के सभी विवरणों को बाहर से छुपाता है।
एमएल के मानक पुस्तकालयों को इस प्रकार से मॉड्यूल के रूप में लागू किया जाता है।
यह भी देखें
- मानक एमएल और मानक एमएल § कार्यान्वयन
- आश्रित एमएल: एमएल का निर्भर रूप से टाइप किया गया विस्तार
- एटीएस (प्रोग्रामिंग भाषा): निर्भर एमएल का एक और विकास
- मंद एमएल: 1980 के दशक की शुरुआत से एक प्रयोगात्मक आलसी मूल्यांकन एमएल बोली
- पाल (प्रोग्रामिंग भाषा): एमएल से संबंधित एक शैक्षिक भाषा
- ओसीएमएल: सीओक्यू को लागू करने के लिए उपयोग की जाने वाली एक एमएल बोली
- एफ शार्प (प्रोग्रामिंग लैंग्वेज) | एफ:नेफ्ट फ्रेमवर्क के लिए ओपन-सोर्स क्रॉस-प्लेटफॉर्म फंक्शनल-फर्स्ट लैंग्वेज
- एकमा स्क्रिप्ट और टाइपप्रति: ईसीएमएस्क्रिप्ट के लिए धातु भाषाएं
संदर्भ
- ↑ Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 17(3):348–375, 1978.
- ↑ Milner, Robin; Tofte, Mads (1991). "4.1 Contexts, environments and scope". Commentary on Standard ML. The MIT Press. pp. 35–36. ISBN 0-262-63137-7.
- ↑ Sebesta, Robert (1999). Concepts of Programming Languages (4th ed.). Addison-Westley. p. 54. ISBN 0-201-38596-1.
- ↑ Gordon, Michael J. C. (1996). "From LCF to HOL: a short history". Retrieved 2007-10-11.
- ↑ Programming language for "special forces" of developers, Russian Software Development Network: Nemerle Project Team, retrieved January 24, 2021
- ↑ Tate, Bruce A.; Daoud, Fred; Dees, Ian; Moffitt, Jack (2014). "3. Elm". Seven More Languages in Seven Weeks (Book version: P1.0-November 2014 ed.). The Pragmatic Programmers, LLC. pp. 97, 101. ISBN 978-1-941222-15-7.
On page 101, Elm creator Evan Czaplicki says: 'I tend to say "Elm is an ML-family language" to get at the shared heritage of all these languages.' ["these languages" is referring to Haskell, OCaml, SML, and F#.]
अग्रिम पठन
- The Definition of Standard एमएल, Robin Milner, Mads Tofte, Robert Harper, MIT Press 1990; (revised edition adds author David MacQueen), MIT Press 1997, ISBN 0-262-63181-4 The Definition of Standard एमएल (Revised).
- Commentary on Standard एमएल, Robin Milner, Mads Tofte, MIT Press 1997, ISBN 0-262-63137-7.
- एमएल for the Working Programmer, Lawrence Paulson, Cambridge University Press 1991, 1996, ISBN 0-521-57050-6.
- Harper, Robert (2011). Programming in Standard ML (PDF). Carnegie Mellon University.
- Elements of एमएल Programming, Jeffrey D. Ullman, Prentice-Hall 1994, 1998, ISBN 0-13-790387-1.
बाहरी संबंध
- Standard एमएल of New Jersey, another popular implementation
- F#, an एमएल implementation using the Microsoft .NET framework Archived 2010-02-18 at the Wayback Machine
- एमएलton, a whole-program optimizing Standard एमएल compiler
- Cakeएमएल, a read-eval-print loop version of एमएल with formally verified runtime and translation to assembler