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

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

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

एमएल की ताकत ज्यादातर भाषा डिजाइन और हेरफेर (संकलक, विश्लेषक, प्रमेय सिद्ध) में लागू होती है, लेकिन यह एक सामान्य उद्देश्य वाली भाषा है जिसका उपयोग जैव सूचना विज्ञान और वित्तीय प्रणालियों में भी किया जाता है।

एमएल को एडिनबर्ग विश्वविद्यालय में 1970 के दशक की शुरुआत में रॉबिन मिलनर और अन्य द्वारा विकसित किया गया था। और इसका सिंटैक्स ISWIM से प्रेरित है। ऐतिहासिक रूप से, ML की कल्पना संगणनीय कार्यों के लिए तर्क (जिसकी भाषा, plambda, पहले क्रम का तर्क का संयोजन | फ़र्स्ट-ऑर्डर प्रेडिकेट कैलकुलस और सिंपल-टाइप्ड पॉलीमॉर्फिज़्म (कंप्यूटर साइंस) लैम्ब्डा कैलकुलस) के लिए प्रूफ टैक्टिक्स विकसित करने के लिए की गई थी, में ML था इसकी धातुभाषा के रूप में)।

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

उदाहरण
निम्नलिखित उदाहरण मानक एमएल के सिंटैक्स का उपयोग करते हैं। अन्य ML बोलियाँ जैसे OCaml और F# छोटे-छोटे तरीकों से भिन्न हैं।

कारख़ाने का
शुद्ध एमएल के रूप में व्यक्त फैक्टोरियल फ़ंक्शन:

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> fun fac (0 : int) : int = 1 | एफएसी (एन: इंट): इंट = एन * एफएसी (एन - 1) 

यह फैक्टोरियल को एक पुनरावर्ती फ़ंक्शन के रूप में वर्णित करता है, जिसमें एकल समाप्ति आधार केस होता है। यह गणित की पाठ्यपुस्तकों में पाए जाने वाले फैक्टोरियल्स के विवरण के समान है। अधिकांश एमएल कोड सुविधा और सिंटैक्स में गणित के समान है।

दिखाई गई परिभाषा का भाग वैकल्पिक है, और इस फ़ंक्शन के प्रकारों का वर्णन करता है। संकेतन E : t को व्यंजक E के प्रकार t के रूप में पढ़ा जा सकता है। उदाहरण के लिए, तर्क n को टाइप पूर्णांक (int) असाइन किया गया है, और fac (n: int), पूर्णांक n पर fac लगाने का परिणाम भी प्रकार पूर्णांक है। एक पूरे के रूप में फ़ंक्शन फ़ैक में पूर्णांक से पूर्णांक (int -> int) तक टाइप फ़ंक्शन होता है, अर्थात, एक पूर्णांक को एक तर्क के रूप में स्वीकार करता है और एक पूर्णांक परिणाम देता है। प्रकार के अनुमान के लिए धन्यवाद, प्रकार के एनोटेशन को छोड़ा जा सकता है और संकलक द्वारा प्राप्त किया जाएगा। टाइप एनोटेशन के बिना पुनर्लेखित, उदाहरण इस तरह दिखता है:

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> फन फैक 0 = 1 | एफएसी एन = एन * एफएसी (एन - 1) 

फ़ंक्शन पैटर्न मिलान पर भी निर्भर करता है, जो एमएल प्रोग्रामिंग का एक महत्वपूर्ण हिस्सा है। ध्यान दें कि किसी फ़ंक्शन के पैरामीटर आवश्यक रूप से कोष्ठक में नहीं हैं बल्कि रिक्त स्थान द्वारा अलग किए गए हैं। जब फ़ंक्शन का तर्क 0 (शून्य) होता है तो यह पूर्णांक 1 (एक) लौटाएगा। अन्य सभी मामलों के लिए दूसरी पंक्ति की कोशिश की जाती है। यह रिकर्सन (कंप्यूटर विज्ञान) है, और बेस केस तक पहुंचने तक फ़ंक्शन को फिर से निष्पादित करता है।

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

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> मजेदार तथ्य एन = चलो फन फैक 0 = 1 | एफएसी एन = एन * एफएसी (एन - 1) में अगर (n < 0) तो डोमेन और पहलू n बढ़ाएँ अंत 

समस्याग्रस्त मामला (जब n ऋणात्मक होता है) ML की अपवाद प्रणाली के उपयोग को प्रदर्शित करता है।

इसके आंतरिक लूप को टेल कॉल के रूप में लिखकर फ़ंक्शन को और बेहतर बनाया जा सकता है, जैसे कि कॉल स्टैक को फ़ंक्शन कॉल की संख्या के अनुपात में बढ़ने की आवश्यकता नहीं है। यह आंतरिक फ़ंक्शन में एक अतिरिक्त, संचायक, पैरामीटर जोड़कर प्राप्त किया जाता है। अंत में, हम पहुंचे

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> मजेदार तथ्य एन = चलो मज़ा एफ ए सी 0 ए सी सी = ए सी सी | एफएसी एन एसीसी = एफएसी (एन - 1) (एन * एसीसी) में if (n < 0) तो Domain else fac n 1 बढ़ाएं अंत 

उलटी सूची
निम्न फ़ंक्शन किसी सूची में तत्वों को उलट देता है। अधिक सटीक रूप से, यह एक नई सूची देता है जिसके तत्व दी गई सूची की तुलना में उल्टे क्रम में होते हैं।

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> फन रिवर्स [] = [] | रिवर्स (x :: xs) = (रिवर्स xs) @ [x] 

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

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

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

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> हस्ताक्षर एरिथ = हस्ताक्षर टी टाइप करें वैल शून्य: टी वैल सफलता: टी -> टी वैल योग: टी * टी -> टी अंत 

<वाक्यविन्यास प्रकाश लैंग = एसएमएल> संरचना परिमेय : ARITH = struct डेटाटाइप टी = इंट का चूहा * इंट वैल शून्य = चूहा (0, 1) मज़ा सफलता (चूहा (ए, बी)) = चूहा (ए + बी, बी) मज़ा योग (चूहा (ए, बी), चूहा (सी, डी)) = चूहा (ए * डी + सी * बी, बी * डी) अंत 

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

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

यह भी देखें

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

अग्रिम पठन

 * The Definition of Standard ML, 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 ML (Revised).
 * Commentary on Standard ML, Robin Milner, Mads Tofte, MIT Press 1997, ISBN 0-262-63137-7.
 * ML for the Working Programmer, Lawrence Paulson, Cambridge University Press 1991, 1996, ISBN 0-521-57050-6.
 * Elements of ML Programming, Jeffrey D. Ullman, Prentice-Hall 1994, 1998, ISBN 0-13-790387-1.
 * Elements of ML Programming, Jeffrey D. Ullman, Prentice-Hall 1994, 1998, ISBN 0-13-790387-1.

बाहरी संबंध

 * Standard ML of New Jersey, another popular implementation
 * F#, an ML implementation using the Microsoft .NET framework
 * MLton, a whole-program optimizing Standard ML compiler
 * CakeML, a read-eval-print loop version of ML with formally verified runtime and translation to assembler