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

From Vigyanwiki
Revision as of 16:49, 28 February 2023 by alpha>Artiverma
ML
ParadigmMulti-paradigm: functional, generic, imperative
द्वारा डिज़ाइन किया गयाRobin Milner and others at the University of Edinburgh
पहली प्रस्तुति1973; 51 years ago (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] और इसका सिंटैक्स ईस्वीं(ISWIM) से प्रेरित है। ऐतिहासिक रूप से, एमएल की कल्पना कोसंगणनीय कार्यों के लिए तर्क (LCF) (जिसकी भाषा, प्लम्बडा, पहले क्रम का तर्क का संयोजन फ़र्स्ट-ऑर्डर प्रेडिकेट कैलकुलस और सिंपल-टाइप्ड पॉलीमॉर्फिज़्म (कंप्यूटर साइंस) लैम्ब्डा कैलकुलस) के लिए प्रूफ टैक्टिक्स विकसित करने के लिए की गई थी)।

एमएल परिवार में कई भाषाएं हैं; तीन सबसे प्रमुख मानक एमएल (SML), OCaml और F Sharp (प्रोग्रामिंग भाषा) हैं। एमएल के विचारों ने कई अन्य भाषाओं, जैसे हास्केल (प्रोग्रामिंग भाषा), साइक्लोन (प्रोग्रामिंग भाषा), नेमर्ले,[5] एटीएस (प्रोग्रामिंग भाषा), और एल्म (प्रोग्रामिंग भाषा) को प्रभावित किया है।[6]

उदाहरण

निम्नलिखित उदाहरण मानक एमएल के सिंटैक्स का उपयोग करते हैं। अन्य एमएल बोलियाँ जैसे OCaml और 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) तक टाइप फ़ंक्शन होता है, अर्थात, पूर्णांक को तर्क के रूप में स्वीकार करता है और पूर्णांक परिणाम देता है। टाइप के अनुमान के लिए धन्यवाद, टाइप के एनोटेशन को छोड़ा जा सकता है और संकलक द्वारा प्राप्त किया जाएगा। टाइप एनोटेशन के बिना पुनर्लेखित, उदाहरण इस प्रकार दिखता है:

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> फन फैक 0 = 1

 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

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

रिवर्स का यह कार्यान्वयन, जबकि सही और स्पष्ट है, अक्षम है, निष्पादन के लिए द्विघात समय की आवश्यकता होती है। फ़ंक्शन को रैखिक समय में निष्पादित करने के लिए फिर से लिखा जा सकता है:

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> मज़ा 'एक रिवर्स xs:' एक सूची = List.foldl (op ::) [] xs </वाक्यविन्यास हाइलाइट> यह फ़ंक्शन पैरामीट्रिक बहुरूपता का एक उदाहरण है। यही है, यह उन सूचियों का उपभोग कर सकता है जिनके तत्वों का कोई प्रकार है, और उसी प्रकार की सूची वापस कर सकते हैं।

मॉड्यूल

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

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> हस्ताक्षर एरिथ = हस्ताक्षर

      signature ARITH =
sig
        type t
        val zero : t
        val succ : t -> t
        val sum : t * t -> t
end

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

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> संरचना परिमेय : ARITH = struct

       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

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

इन्हें 'use' कमांड द्वारा दुभाषिया में आयात किया जाता है। कार्यान्वयन के साथ सहभागिता केवल हस्ताक्षर कार्यों के माध्यम से अनुमति दी जाती है, उदाहरण के लिए इस कोड के माध्यम से सीधे 'रैट' डेटा ऑब्जेक्ट बनाना संभव नहीं है। 'संरचना' ब्लॉक कार्यान्वयन के सभी विवरणों को बाहर से छुपाता है।

एमएल के मानक पुस्तकालयों को इस तरह से मॉड्यूल के रूप में लागू किया जाता है।

यह भी देखें

  • मानक एमएल और Standard ML § Implementations
  • आश्रित एमएल: एमएल का निर्भर रूप से टाइप किया गया विस्तार
    • एटीएस (प्रोग्रामिंग भाषा): निर्भर एमएल का एक और विकास
  • आलसी एमएल: 1980 के दशक की शुरुआत से एक प्रयोगात्मक आलसी मूल्यांकन एमएल बोली
  • पाल (प्रोग्रामिंग भाषा): एमएल से संबंधित एक शैक्षिक भाषा
  • OCaएमएल: Coq को लागू करने के लिए उपयोग की जाने वाली एक एमएल बोली
  • एफ शार्प (प्रोग्रामिंग लैंग्वेज) | एफ #: .NET फ्रेमवर्क के लिए एक ओपन-सोर्स क्रॉस-प्लेटफॉर्म फंक्शनल-फर्स्ट लैंग्वेज
  • एकमा स्क्रिप्ट और टाइपप्रति: ईसीएमएस्क्रिप्ट के लिए धातु भाषाएं

संदर्भ

  1. Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 17(3):348–375, 1978.
  2. 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.
  3. Sebesta, Robert (1999). Concepts of Programming Languages (4th ed.). Addison-Westley. p. 54. ISBN 0-201-38596-1.
  4. Gordon, Michael J. C. (1996). "From LCF to HOL: a short history". Retrieved 2007-10-11.
  5. Programming language for "special forces" of developers, Russian Software Development Network: Nemerle Project Team, retrieved January 24, 2021
  6. 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#.]


अग्रिम पठन


बाहरी संबंध