ओकैमल: Difference between revisions
(Created page with "{{Short description|Programming language}} {{distinguish|occam (programming language)}} {{Use dmy dates|date=November 2022}} {{Infobox programming language | name...") |
No edit summary |
||
| (10 intermediate revisions by 5 users not shown) | |||
| Line 1: | Line 1: | ||
{{Short description|Programming language}} | {{Short description|Programming language}} | ||
{{Infobox programming language | {{Infobox programming language | ||
| name = | | name = ओकैमल | ||
| logo = OCaml Logo.svg | | logo = OCaml Logo.svg | ||
| logo caption = | | logo caption = | ||
| Line 30: | Line 29: | ||
| wikibooks = Objective Caml | | wikibooks = Objective Caml | ||
}} | }} | ||
ओकैमल ({{IPAc-en|oʊ|ˈ|k|æ|m|əl}} {{respell|oh|KAM|əl}}, पूर्व में ऑब्जेक्टिव [[कैमल]]) एक सामान्य-उद्देश्यीय प्रोग्रामिंग | '''ओकैमल'''/OCaml ({{IPAc-en|oʊ|ˈ|k|æ|m|əl}} {{respell|oh|KAM|əl}}, पूर्व में ऑब्जेक्टिव [[कैमल]]) एक सामान्य-उद्देश्यीय प्रोग्रामिंग लैंग्वेज है|सामान्य-उद्देश्य, उच्च-स्तरीय प्रोग्रामिंग लैंग्वेज|उच्च-स्तरीय [[बहु-प्रतिमान प्रोग्रामिंग भाषा|बहु-प्रतिमान प्रोग्रामिंग लैंग्वेज]] जो [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]]|ऑब्जेक्ट के साथ [[एमएल (प्रोग्रामिंग भाषा)|एमएल (प्रोग्रामिंग लैंग्वेज)]] की कैमल बोली का विस्तार करती है। -उन्मुख विशेषताएं. ओकैमल को 1996 में [[जेवियर लेरॉय]], जेरोम वोइलन, [[डेमियन डोलिगेज़]], डिडिएर रेमी, एस्केंडर सुआरेज़ और अन्य द्वारा बनाया गया था। | ||
ओकैमल [[औज़ारश्रृंखला]] में एक इंटरएक्टिव टॉप-लेवल [[ दुभाषिया (कंप्यूटिंग) ]], एक[[ बाईटकोड ]][[ संकलक | संकलक]], एक ऑप्टिमाइज़िंग [[ देसी कोड |नेटिव कोड]] कंपाइलर, एक रिवर्सिबल [[डिबगर]] और एक पैकेज मैनेजर (ओपीएएम) सम्मिलित है। ओकैमल को प्रारम्भ में स्वचालित प्रमेय सिद्ध करने के संदर्भ में विकसित किया गया था, और [[स्थैतिक कार्यक्रम विश्लेषण]] और औपचारिक तरीकों के सॉफ्टवेयर में इसकी बड़ी उपस्थिति है। इन क्षेत्रों से परे, इसे अन्य एप्लिकेशन डोमेन के अलावा [[सिस्टम प्रोग्रामिंग]], [[वेब विकास]] और विशिष्ट वित्तीय उपयोगिताओं में गंभीर उपयोग मिला है। | |||
संक्षिप्त नाम | संक्षिप्त नाम सीएएमएलमूल रूप से ''श्रेणीबद्ध सार मशीन लैंग्वेज'' के लिए था, लेकिन ओकैमल इस [[अमूर्त मशीन]] को छोड़ देता है।<ref>{{cite web|url= http://ocaml.org/learn/history.html|title= ओकैमल का इतिहास|access-date= 24 December 2016}}</ref> ओकैमल एक [[मुफ़्त और ओपन-सोर्स सॉफ़्टवेयर]] प्रोजेक्ट है जिसका प्रबंधन और मुख्य रूप से [[कंप्यूटर विज्ञान और स्वचालन में अनुसंधान के लिए फ्रेंच संस्थान]] (इनरिया) द्वारा रखरखाव किया जाता है। 2000 के दशक की प्रारम्भ में, ओकैमल के तत्वों को कई लैंग्वेज द्वारा अपनाया गया, विशेष रूप से F शार्प (प्रोग्रामिंग लैंग्वेज)|F# और [[स्काला (प्रोग्रामिंग भाषा)|स्काला (प्रोग्रामिंग लैंग्वेज)]]। | ||
==दर्शन== | ==दर्शन== | ||
एमएल (प्रोग्रामिंग | एमएल (प्रोग्रामिंग लैंग्वेज)-व्युत्पन्न लैंग्वेजएं अपने स्थिर प्रकार के सिस्टम और प्रकार अनुमान|प्रकार-अनुमानित कंपाइलरों के लिए सबसे अच्छी तरह से जानी जाती हैं। ओकैमल एक एमएल-जैसी [[प्रकार प्रणाली]] के तहत [[कार्यात्मक प्रोग्रामिंग]], [[अनिवार्य प्रोग्रामिंग]] और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को एकीकृत करता है। इस प्रकार, प्रोग्रामर को ओकैमल का उपयोग करने के लिए शुद्ध कार्यात्मक लैंग्वेज प्रतिमान से अत्यधिक परिचित होने की आवश्यकता नहीं है। | ||
प्रोग्रामर को अपने स्थिर प्रकार सिस्टम की बाधाओं के भीतर काम करने की आवश्यकता देकर, | प्रोग्रामर को अपने स्थिर प्रकार सिस्टम की बाधाओं के भीतर काम करने की आवश्यकता देकर, ओकैमल गतिशील रूप से टाइप की गई लैंग्वेज से जुड़ी कई प्रकार-संबंधित [[रन-टाइम प्रकार की जानकारी]] समस्याओं को समाप्त कर देता है। साथ ही, ओकैमल का टाइप-इनफ़रिंग कंपाइलर मैन्युअल प्रकार के एनोटेशन की आवश्यकता को बहुत कम कर देता है जो अधिकांश स्थिर रूप से टाइप की गई लैंग्वेज में आवश्यक होते हैं। उदाहरण के लिए, चर के [[डेटा प्रकार]] और फ़ंक्शन के प्रकार हस्ताक्षरों को आमतौर पर स्पष्ट रूप से घोषित करने की आवश्यकता नहीं होती है, जैसा कि वे [[जावा (प्रोग्रामिंग भाषा)|जावा (प्रोग्रामिंग लैंग्वेज)]] और सी शार्प (प्रोग्रामिंग लैंग्वेज)|C# जैसी लैंग्वेज में करते हैं, क्योंकि उनका अनुमान ऑपरेटरों से लगाया जा सकता है। और अन्य फ़ंक्शन जो कोड में वेरिएबल्स और अन्य मानों पर लागू होते हैं। ओकैमल प्रकार की प्रणाली के प्रभावी उपयोग के लिए प्रोग्रामर की ओर से कुछ परिष्कार की आवश्यकता हो सकती है, लेकिन इस अनुशासन को विश्वसनीय, उच्च-प्रदर्शन सॉफ़्टवेयर से पुरस्कृत किया जाता है। | ||
ओकैमल अपने प्रदर्शन पर जोर देने के कारण शायद अकादमिक क्षेत्र में उत्पन्न होने वाली अन्य लैंग्वेज से सबसे अलग है। इसकी स्थिर प्रकार प्रणाली रनटाइम प्रकार के बेमेल को रोकती है और इस प्रकार रनटाइम प्रकार और सुरक्षा जांच को रोकती है जो गतिशील रूप से टाइप की गई लैंग्वेज के प्रदर्शन पर बोझ डालती है, साथ ही रनटाइम सुरक्षा की गारंटी देती है, सिवाय इसके कि जब सरणी सीमा जांच बंद हो जाती है या जब [[क्रमबद्धता]] जैसी कुछ प्रकार-असुरक्षित सुविधाओं का उपयोग किया जाता है . ये इतने दुर्लभ हैं कि व्यवहार में इनसे बचना काफी संभव है। | |||
टाइप-चेकिंग ओवरहेड के अलावा, फ़नार्ग समस्या जैसे मुद्दों के कारण, कार्यात्मक प्रोग्रामिंग | टाइप-चेकिंग ओवरहेड के अलावा, फ़नार्ग समस्या जैसे मुद्दों के कारण, कार्यात्मक प्रोग्रामिंग लैंग्वेजएं, सामान्य तौर पर, कुशल मशीन लैंग्वेज कोड में संकलित करने के लिए चुनौतीपूर्ण होती हैं। मानक लूप, रजिस्टर और इंस्ट्रक्शन [[संकलक अनुकूलन]] के साथ, ओकैमल का ऑप्टिमाइज़िंग कंपाइलर वैल्यू [[ बॉक्सिंग (कंप्यूटर विज्ञान) ]] और [[ समापन (कंप्यूटर विज्ञान) ]] आवंटन को अनुकूलित करने के लिए स्थैतिक प्रोग्राम विश्लेषण विधियों को नियोजित करता है, जिससे परिणामी कोड के प्रदर्शन को अधिकतम करने में मदद मिलती है, भले ही यह व्यापक हो कार्यात्मक प्रोग्रामिंग संरचनाओं का उपयोग। | ||
जेवियर लेरॉय ने कहा है कि | जेवियर लेरॉय ने कहा है कि ओकैमल एक अच्छे C कंपाइलर का कम से कम 50% प्रदर्शन प्रदान करता है,<ref name = "LWN">[https://lwn.net/Articles/19378/ Linux Weekly News].</ref> हालाँकि सीधी तुलना असंभव है. ओकैमल मानक लाइब्रेरीज में कुछ फ़ंक्शन अन्य लैंग्वेज के मानक लाइब्रेरीजों में समकक्ष कार्यों की तुलना में तेज़ एल्गोरिदम के साथ कार्यान्वित किए जाते हैं। उदाहरण के लिए, सिद्धांत रूप में ओकैमल मानक लाइब्रेरीज में सेट यूनियन का कार्यान्वयन अनिवार्य लैंग्वेज (जैसे, C++, जावा) के मानक लाइब्रेरीजों में समतुल्य फ़ंक्शन की तुलना में तेज है क्योंकि ओकैमल कार्यान्वयन इनपुट के कुछ हिस्सों का पुन: उपयोग करने के लिए सेट की अपरिवर्तनीयता का फायदा उठाता है। आउटपुट में सेट ([[लगातार डेटा संरचना]] देखें)। | ||
== इतिहास == | == इतिहास == | ||
=== एमएल (मेटा | === एमएल (मेटा लैंग्वेज) का विकास === | ||
1970 और 1980 के दशक के बीच, ब्रिटिश कंप्यूटर वैज्ञानिक और [[ट्यूरिंग पुरस्कार]] विजेता [[रॉबिन मिलनर]] ने कंप्यूटर विज्ञान की नींव के लिए [[एडिनबर्ग विश्वविद्यालय]] की प्रयोगशाला में काम किया।<ref>{{Cite web |title=ए जे मिलनर - ए.एम. ट्यूरिंग पुरस्कार विजेता|url=https://amturing.acm.org/award_winners/milner_1569367.cfm |access-date=2022-10-06 |website=amturing.acm.org}}</ref><ref name=":0">{{Cite web |last=al. |first=Michael Clarkson et |title=1.2. OCaml · Functional Programming in OCaml |url=https://courses.cs.cornell.edu/cs3110/2021sp/textbook/intro/ocaml.html |access-date=2022-10-06 |website=courses.cs.cornell.edu}}</ref> मिलनर और अन्य स्वचालित प्रमेय सिद्ध करने पर काम कर रहे थे, जो ऐतिहासिक रूप से [[लिस्प (प्रोग्रामिंग भाषा)]] जैसी | 1970 और 1980 के दशक के बीच, ब्रिटिश कंप्यूटर वैज्ञानिक और [[ट्यूरिंग पुरस्कार]] विजेता [[रॉबिन मिलनर]] ने कंप्यूटर विज्ञान की नींव के लिए [[एडिनबर्ग विश्वविद्यालय]] की प्रयोगशाला में काम किया।<ref>{{Cite web |title=ए जे मिलनर - ए.एम. ट्यूरिंग पुरस्कार विजेता|url=https://amturing.acm.org/award_winners/milner_1569367.cfm |access-date=2022-10-06 |website=amturing.acm.org}}</ref><ref name=":0">{{Cite web |last=al. |first=Michael Clarkson et |title=1.2. OCaml · Functional Programming in OCaml |url=https://courses.cs.cornell.edu/cs3110/2021sp/textbook/intro/ocaml.html |access-date=2022-10-06 |website=courses.cs.cornell.edu}}</ref> मिलनर और अन्य स्वचालित प्रमेय सिद्ध करने पर काम कर रहे थे, जो ऐतिहासिक रूप से [[लिस्प (प्रोग्रामिंग भाषा)|लिस्प (प्रोग्रामिंग लैंग्वेज)]] जैसी लैंग्वेज में विकसित किए गए थे। मिलनर ने बार-बार इस मुद्दे का सामना किया कि प्रमेय सिद्धकर्ता गैर-प्रमाणों को एक साथ रखकर यह दावा करने का प्रयास करेंगे कि [[प्रमाण (सत्य)]] वैध है।<ref name=":0" />परिणामस्वरूप, उन्होंने कंप्यूटेबल फ़ंक्शंस के लिए अपने लॉजिक के लिए एमएल (प्रोग्रामिंग लैंग्वेज) विकसित की, एक ऐसी लैंग्वेज जो लेखक को केवल अपने बहुरूपी प्रकार प्रणाली के साथ वैध प्रमाण बनाने की अनुमति देगी।<ref name=":1">{{Cite web |title=प्रस्तावना - वास्तविक दुनिया ओकैमल|url=https://dev.realworldocaml.org/prologue.html#a-brief-history |access-date=2022-10-06 |website=dev.realworldocaml.org}}</ref> विभिन्न मशीनों पर एलसीएफ के उपयोग को सरल बनाने के लिए एमएल को एक कंपाइलर में बदल दिया गया था, और 1980 के दशक तक, इसे अपनी खुद की एक पूरी प्रणाली में बदल दिया गया था।<ref name=":1" />एमएल अंततः ओकैमल के निर्माण के लिए आधार के रूप में काम करेगा। | ||
1980 के दशक की प्रारम्भ में, कुछ ऐसे विकास हुए जिन्होंने फ्रेंच इंस्टीट्यूट फॉर रिसर्च इन कंप्यूटर साइंस एंड ऑटोमेशन की फॉर्मेल टीम को एमएल लैंग्वेज में रुचि लेने के लिए प्रेरित किया। [[ऑक्सफोर्ड विश्वविद्यालय]] के एक शोध प्रोफेसर [[लुका कार्डेली]] ने एमएल के तेजी से कार्यान्वयन को विकसित करने के लिए अपनी [[कार्यात्मक सार मशीन]] का उपयोग किया, और रॉबिन मिलनर ने विभिन्न कार्यान्वयनों के बीच विचलन से बचने के लिए एमएल की एक नई परिलैंग्वेज प्रस्तावित की। इसके साथ ही, [[पेरिस डाइडरॉट विश्वविद्यालय]] के एक वरिष्ठ शोधकर्ता [[पियरे-लुई क्यूरियन]] ने श्रेणीबद्ध कॉम्बिनेटरों का एक कैलकुलस विकसित किया और इसे [[लैम्ब्डा कैलकुलस]] से जोड़ा, जिससे [[श्रेणीबद्ध अमूर्त मशीन]] (सीएएम) की परिलैंग्वेज सामने आई। पेरिस डाइडरॉट विश्वविद्यालय के एक शोधकर्ता गाइ कूसिनेउ (कंप्यूटर वैज्ञानिक) ने माना कि इसे एमएल के लिए एक संकलन तकनीक के रूप में लागू किया जा सकता है।<ref name=":2">{{Cite web |title=A History of OCaml – OCaml |url=https://v2.ocaml.org/learn/history.html |access-date=2022-10-07 |website=v2.ocaml.org}}</ref> | |||
=== पहला कार्यान्वयन === | === पहला कार्यान्वयन === | ||
कैमल को | कैमल को प्रारम्भ में जेरार्ड ह्यूट की अध्यक्षता वाली आईएनआरआईए की फॉर्मेल टीम द्वारा डिजाइन और विकसित किया गया था। कैमल का पहला कार्यान्वयन 1987 में बनाया गया था और 1992 तक इसे और विकसित किया गया था। हालांकि इसका नेतृत्व एस्केंडर सुआरेज़ ने किया था, 1988 में उनके जाने के बाद पियरे वीस (कंप्यूटर वैज्ञानिक) और [[मिशेल मौनी (कंप्यूटर विज्ञान)]] ने विकास जारी रखा।<ref name=":2" /> | ||
गाइ कूसिनेउ को यह याद करते हुए उद्धृत किया गया है कि प्रोग्रामिंग लैंग्वेज कार्यान्वयन के साथ उनका अनुभव प्रारम्भ में बहुत सीमित था, और इसमें कई अपर्याप्तताएं थीं जिनके लिए वह जिम्मेदार हैं। इसके अतिरिक्त, उनका मानना है कि एस्केंडर, पियरे और मिशेल ने काफी अच्छा काम किया है।''<ref name=":2" /> | |||
=== कैमल लाइट === | === कैमल लाइट === | ||
1990 और 1991 के बीच, जेवियर लेरॉय ने [[सी (प्रोग्रामिंग भाषा)]] में लिखे गए [[बाइटकोड दुभाषिया]] के आधार पर कैमल का एक नया कार्यान्वयन डिजाइन किया। इसके अलावा, डेमियन डोलिगेज़ ने इस कार्यान्वयन के लिए एक मेमोरी प्रबंधन प्रणाली लिखी, जिसे अनुक्रमिक कचरा संग्रह (कंप्यूटर विज्ञान) के रूप में भी जाना जाता है।<ref name=":1" />[[कैमल लाइट]] के नाम से जाना जाने वाला यह नया कार्यान्वयन, पुराने कैमल कार्यान्वयन को प्रतिस्थापित करता है और छोटी डेस्कटॉप मशीनों पर चलता है।<ref name=":2" />बाद के वर्षों में, मिशेल मौनी के वाक्यविन्यास हेरफेर उपकरण जैसे | 1990 और 1991 के बीच, जेवियर लेरॉय ने [[सी (प्रोग्रामिंग भाषा)|सी (प्रोग्रामिंग लैंग्वेज)]] में लिखे गए [[बाइटकोड दुभाषिया]] के आधार पर कैमल का एक नया कार्यान्वयन डिजाइन किया। इसके अलावा, डेमियन डोलिगेज़ ने इस कार्यान्वयन के लिए एक मेमोरी प्रबंधन प्रणाली लिखी, जिसे अनुक्रमिक कचरा संग्रह (कंप्यूटर विज्ञान) के रूप में भी जाना जाता है।<ref name=":1" />[[कैमल लाइट]] के नाम से जाना जाने वाला यह नया कार्यान्वयन, पुराने कैमल कार्यान्वयन को प्रतिस्थापित करता है और छोटी डेस्कटॉप मशीनों पर चलता है।<ref name=":2" />बाद के वर्षों में, मिशेल मौनी के वाक्यविन्यास हेरफेर उपकरण जैसे लाइब्रेरीज दिखाई दिए और शैक्षिक और अनुसंधान टीमों में कैमल के उपयोग को बढ़ावा देने में मदद की।<ref name=":1" /> | ||
=== कैमल स्पेशल लाइट === | === कैमल स्पेशल लाइट === | ||
1995 में, जेवियर लेरॉय ने कैमल स्पेशल लाइट जारी की, जो कैमल का एक उन्नत संस्करण था।<ref name=":2" />बाइटकोड कंपाइलर में एक ऑप्टिमाइज़िंग नेटिव कोड | नेटिव-कोड कंपाइलर जोड़ा गया, जिसने [[C++]] जैसी मुख्यधारा की | 1995 में, जेवियर लेरॉय ने कैमल स्पेशल लाइट जारी की, जो कैमल का एक उन्नत संस्करण था।<ref name=":2" />बाइटकोड कंपाइलर में एक ऑप्टिमाइज़िंग नेटिव कोड | नेटिव-कोड कंपाइलर जोड़ा गया, जिसने [[C++]] जैसी मुख्यधारा की लैंग्वेज के साथ तुलनीय स्तर तक प्रदर्शन को काफी बढ़ा दिया।<ref name=":1" /><ref name=":2" />इसके अतिरिक्त, लेरॉय ने स्टैंडर्ड एमएल के मॉड्यूल सिस्टम से प्रेरित एक उच्च स्तरीय मॉड्यूल सिस्टम डिजाइन किया, जो अमूर्तता और पैरामीटराइजेशन के लिए शक्तिशाली सुविधाएं प्रदान करता है और बड़े पैमाने के कार्यक्रमों के निर्माण को आसान बनाता है।<ref name=":1" /> | ||
=== उद्देश्य कैमल === | === उद्देश्य कैमल === | ||
डिडिएर रेमी और जेरोम वोइलन ने वस्तुओं और वर्गों के लिए एक अभिव्यंजक प्रकार की प्रणाली डिजाइन की, जिसे कैमल स्पेशल लाइट के भीतर एकीकृत किया गया था। इससे ऑब्जेक्टिव कैमल | डिडिएर रेमी और जेरोम वोइलन ने वस्तुओं और वर्गों के लिए एक अभिव्यंजक प्रकार की प्रणाली डिजाइन की, जिसे कैमल स्पेशल लाइट के भीतर एकीकृत किया गया था। इससे ऑब्जेक्टिव कैमल लैंग्वेज का उदय हुआ, जिसे पहली बार 1996 में जारी किया गया और बाद में 2011 में इसका नाम बदलकर ओकैमल कर दिया गया। इस ऑब्जेक्ट सिस्टम ने कई प्रचलित ऑब्जेक्ट-ओरिएंटेड मुहावरों को सांख्यिकीय रूप से सुरक्षित तरीके से समर्थन दिया, जबकि उन्हीं मुहावरों ने अस्वस्थता या आवश्यकता उन्नत की। C++ या जावा (प्रोग्रामिंग लैंग्वेज) जैसी लैंग्वेज में रनटाइम जाँच। 2000 में, जैक्स गैरिग्यू ने ऑब्जेक्टिव कैमल को कई नई सुविधाओं जैसे बहुरूपी तरीकों, वेरिएंट और लेबल और वैकल्पिक तर्कों के साथ विस्तारित किया।<ref name=":1" /><ref name=":2" /> | ||
=== सतत विकास === | === सतत विकास === | ||
ओकैमल में बढ़ते व्यावसायिक और शैक्षणिक कोडबेस का समर्थन करने के लिए पिछले दो दशकों में लैंग्वेज सुधारों को क्रमिक रूप से जोड़ा गया है।<ref name=":1" />2012 में ओकैमल 4.0 रिलीज़ में लैंग्वेज के लचीलेपन को बढ़ाने के लिए सामान्यीकृत बीजगणितीय डेटा प्रकार (जीएडीटी) और प्रथम श्रेणी के मॉड्यूल जोड़े गए।<ref name=":1" />ओकैमल 5.0.0 2022 में रिलीज़ होगा<ref>{{Cite web |title=Release of OCaml 5.0.0 OCaml Package |url=https://ocaml.org/news/ocaml-5.0 |access-date=2022-12-16 |website=OCaml |language=en}}</ref> लैंग्वेज रनटाइम का पूर्ण पुनर्लेखन है, [[वैश्विक दुभाषिया लॉक]] को हटाना और [[सीमांकित निरंतरता]] के माध्यम से प्रभाव प्रणाली को जोड़ना। ये परिवर्तन क्रमशः समानांतर_प्रोग्रामिंग_मॉडल#साझा_मेमोरी|साझा-मेमोरी समानता और [[रंग-अंधा समवर्ती]] के लिए समर्थन सक्षम करते हैं। | |||
ओकैमल का विकास 2005 तक आईएनआरआईए में क्रिस्टाल टीम के भीतर जारी रहा, जब गैलियम टीम ने इसका स्थान लिया।<ref>{{Cite web |title=क्रिस्टल प्रोजेक्ट|url=http://cristal.inria.fr/ |access-date=2022-10-07 |website=cristal.inria.fr}}</ref> इसके बाद, गैलियम को 2019 में कैम्बियम टीम द्वारा सफल बनाया गया।<ref>{{Cite web |title=गैलियम टीम - होम|url=http://gallium.inria.fr/ |access-date=2022-10-07 |website=gallium.inria.fr}}</ref><ref>{{Cite web |title=घर|url=http://cambium.inria.fr/ |access-date=2022-10-07 |website=cambium.inria.fr |language=en}}</ref> | ओकैमल का विकास 2005 तक आईएनआरआईए में क्रिस्टाल टीम के भीतर जारी रहा, जब गैलियम टीम ने इसका स्थान लिया।<ref>{{Cite web |title=क्रिस्टल प्रोजेक्ट|url=http://cristal.inria.fr/ |access-date=2022-10-07 |website=cristal.inria.fr}}</ref> इसके बाद, गैलियम को 2019 में कैम्बियम टीम द्वारा सफल बनाया गया।<ref>{{Cite web |title=गैलियम टीम - होम|url=http://gallium.inria.fr/ |access-date=2022-10-07 |website=gallium.inria.fr}}</ref><ref>{{Cite web |title=घर|url=http://cambium.inria.fr/ |access-date=2022-10-07 |website=cambium.inria.fr |language=en}}</ref> | ||
==सुविधाएँ== | ==सुविधाएँ== | ||
ओकैमल में [[सिमेंटिक विश्लेषण (कंप्यूटर विज्ञान)]] प्रकार प्रणाली, प्रकार अनुमान, [[पैरामीट्रिक बहुरूपता]], पूंछ पुनरावृत्ति, [[पैटर्न मिलान]], प्रथम श्रेणी लेक्सिकल क्लोजर (कंप्यूटर विज्ञान), फ़ंक्शन ऑब्जेक्ट#अन्य अर्थ|फ़ंक्टर (पैरामीट्रिक मॉड्यूल), अपवाद हैंडलिंग, प्रभाव प्रणाली की सुविधा है। , और वृद्धिशील पीढ़ीगत कचरा संग्रहण (कंप्यूटर विज्ञान)। | |||
ओकैमल एक सामान्य-उद्देश्य वाली लैंग्वेज में ऑब्जेक्ट सिस्टम में एमएल-शैली प्रकार के अनुमान को विस्तारित करने के लिए उल्लेखनीय है। यह संरचनात्मक उपटाइपिंग की अनुमति देता है, जहां ऑब्जेक्ट प्रकार संगत होते हैं यदि उनके विधि हस्ताक्षर संगत होते हैं, चाहे उनकी घोषित विरासत (सांख्यिकीय रूप से टाइप की गई लैंग्वेज में एक असामान्य विशेषता) कुछ भी हो। | |||
[[लिंकर (कंप्यूटिंग)]] से सी (प्रोग्रामिंग | [[लिंकर (कंप्यूटिंग)]] से सी (प्रोग्रामिंग लैंग्वेज) प्राइमेटिव के लिए एक [[विदेशी फ़ंक्शन इंटरफ़ेस]] प्रदान किया गया है, जिसमें सी और [[फोरट्रान]] दोनों के साथ संगत प्रारूपों में कुशल संख्यात्मक ऐरे डेटा संरचना के लिए लैंग्वेज समर्थन सम्मिलित है। ओकैमल ओकैमल फ़ंक्शंस की लाइब्रेरी बनाने का भी समर्थन करता है जिन्हें देशीC में एक मुख्य प्रोग्राम से जोड़ा जा सकता है, ताकि ओकैमल लाइब्रेरी को C प्रोग्रामर्स को वितरित किया जा सके जिनके पास ओकैमल का कोई ज्ञान या स्थापना नहीं है। | ||
ओकैमल वितरण में सम्मिलित हैं: | |||
* [[शाब्दिक विश्लेषण]] और [[ पदच्छेद ]] उपकरण जिन्हें | * [[शाब्दिक विश्लेषण]] और [[ पदच्छेद ]] उपकरण जिन्हें ओकॉम्लेक्स (ओकॉम्लेक्स) और ओकामलयक (ओकामलयक) कहा जाता है | ||
* डिबगर जो त्रुटियों की जांच करने के लिए पीछे की ओर जाने का समर्थन करता है | * डिबगर जो त्रुटियों की जांच करने के लिए पीछे की ओर जाने का समर्थन करता है | ||
* [[दस्तावेज़ीकरण जनरेटर]] | * [[दस्तावेज़ीकरण जनरेटर]] | ||
* [[प्रोफाइलर (कंप्यूटर विज्ञान)]] - प्रदर्शन को मापने के लिए | * [[प्रोफाइलर (कंप्यूटर विज्ञान)]] - प्रदर्शन को मापने के लिए | ||
* कई सामान्य प्रयोजन | * कई सामान्य प्रयोजन लाइब्रेरीज (कंप्यूटिंग) | ||
नेटिव कोड कंपाइलर [[यूनिक्स]], [[ माइक्रोसॉफ़्ट विंडोज़ ]] और एप्पल इंक. मैकओएस सहित कई प्लेटफार्मों के लिए उपलब्ध है। प्रमुख आर्किटेक्चर के लिए मूल [[कोड जनरेशन (कंपाइलर)]] समर्थन के माध्यम से पोर्टेबिलिटी हासिल की जाती है: | नेटिव कोड कंपाइलर [[यूनिक्स]], [[ माइक्रोसॉफ़्ट विंडोज़ ]] और एप्पल इंक. मैकओएस सहित कई प्लेटफार्मों के लिए उपलब्ध है। प्रमुख आर्किटेक्चर के लिए मूल [[कोड जनरेशन (कंपाइलर)]] समर्थन के माध्यम से पोर्टेबिलिटी हासिल की जाती है: | ||
* [[X86-64]] ( | * [[X86-64]] (एएमडी64), [[RISC-V|आरआईएससी-वी]], और [[ARM64|एआरएम64]] (ओकैमल 5.0.0 और उच्चतर में)<ref>{{cite web|url=https://github.com/ocaml/ocaml/tree/trunk/asmcomp|title=ocaml/asmcomp at trunk · ocaml/ocaml · GitHub|work=GitHub|access-date=2 May 2015}}</ref> | ||
* पावर | * पावर आईएसए, [[IBM Z|आईबीएम जेड]] (ओकैमल 5.0.0 से पहले, और भविष्य में 5.x रिलीज़ में पुनः प्रदर्शित होने के कारण) | ||
* [[IA-32]] और [[एआरएम वास्तुकला]] ( | * [[IA-32|आईए-32]] और [[एआरएम वास्तुकला]] (ओकैमल 5.0.0 से पहले) | ||
* [[SPARC]] ( | * [[SPARC|स्पार्क]] (ओकैमल 4.06.0 से पहले) | ||
* [[डीईसी अल्फा]], [[एचपीपीए]], आईए64 और [[एमआईपीएस वास्तुकला]] (ओकैमल 4.00.0 से पहले) | * [[डीईसी अल्फा]], [[एचपीपीए]], आईए64 और [[एमआईपीएस वास्तुकला]] (ओकैमल 4.00.0 से पहले) | ||
जब मूल कोड जनरेशन उपलब्ध नहीं होता है, तो बाइटकोड कंपाइलर किसी भी 32- या 64-बिट आर्किटेक्चर पर ऑपरेशन का समर्थन करता है, जिसके लिए केवल सी कंपाइलर की आवश्यकता होती है। | जब मूल कोड जनरेशन उपलब्ध नहीं होता है, तो बाइटकोड कंपाइलर किसी भी 32- या 64-बिट आर्किटेक्चर पर ऑपरेशन का समर्थन करता है, जिसके लिए केवल सी कंपाइलर की आवश्यकता होती है। | ||
ओकैमल बाइटकोड और नेटिव कोड प्रोग्राम को प्रीमेप्टिव संदर्भ स्विचिंग के साथ [[थ्रेड (कंप्यूटर विज्ञान)]] शैली में लिखा जा सकता है। एक ही डोमेन में ओकैमल थ्रेड्स<ref>A domain is a unit of parallelism in OCaml, a domain usually corresponds to a CPU core</ref> केवल टाइम शेयरिंग द्वारा निष्पादित करें। हालाँकि, एक ओकैमल प्रोग्राम में कई डोमेन हो सकते हैं। वितरित कंप्यूटिंग के लिए कई लाइब्रेरी हैं जैसे [http://functory.lri.fr/About.html फंक्टरी] और [http://projects.camlcity.org/projects/ocamlnet.html ओकैमलनेट/प्लाज्मा]। | |||
==विकास का माहौल== | ==विकास का माहौल== | ||
2011 से, | 2011 से, ओकैमल विकास परिवेश में कई नए टूल और लाइब्रेरी का योगदान दिया गया है: | ||
* विकास उपकरण | * विकास उपकरण | ||
** [https://opam.ocaml.org/ opam] | ** [https://opam.ocaml.org/ opam] ओकैमल के लिए एक पैकेज मैनेजर है। | ||
** [https://github.com/ocaml/merlin मर्लिन] कई संपादकों के लिए आईडीई जैसी कार्यक्षमता प्रदान करता है, जिसमें टाइप थ्रोबैक, गो-टू-डेफिनिशन और ऑटो-कम्प्लीशन | ** [https://github.com/ocaml/merlin मर्लिन] कई संपादकों के लिए आईडीई जैसी कार्यक्षमता प्रदान करता है, जिसमें टाइप थ्रोबैक, गो-टू-डेफिनिशन और ऑटो-कम्प्लीशन सम्मिलित है। | ||
** [https://github.com/ocaml/dune Dune] | ** [https://github.com/ocaml/dune Dune] ओकैमल के लिए एक कंपोज़ेबल बिल्ड-सिस्टम है। | ||
** [https://github.com/ocaml-ppx/ocamlformat OCamlformat] | ** [https://github.com/ocaml-ppx/ocamlformat OCamlformat] ओकैमल के लिए एक ऑटो-फॉर्मेटर है। | ||
**[https://github.com/ocaml/ocaml-lsp ocaml-lsp-server] | **[https://github.com/ocaml/ocaml-lsp ocaml-lsp-server] ओकैमल [[एकीकृत विकास पर्यावरण]] एकीकरण के लिए एक [[भाषा सर्वर प्रोटोकॉल|लैंग्वेज सर्वर प्रोटोकॉल]] है। | ||
* वेब साइटें: | * वेब साइटें: | ||
** [https://ocaml.org/ OCaml.org] | ** [https://ocaml.org/ OCaml.org] लैंग्वेज के लिए प्राथमिक साइट है। | ||
** [https://discuss.ocaml.org/ | ** [https://discuss.ocaml.org/ discuss.ocaml.org] [[ प्रवचन (सॉफ्टवेयर) ]] का एक उदाहरण है जो ओकैमल के लिए प्राथमिक चर्चा साइट के रूप में कार्य करता है। | ||
** [https://watch.ocaml.org/ watch.ocaml.org] [[PeerTube]] का एक उदाहरण है जो | ** [https://watch.ocaml.org/ watch.ocaml.org] [[PeerTube|पियरट्यूब]] का एक उदाहरण है जो ओकैमल विषयों के बारे में वीडियो होस्ट करता है। | ||
* | * ओकैमल के लिए वैकल्पिक कंपाइलर: | ||
** [https://github.com/ocsigen/js_of_ocaml js_of_ocaml], | ** [https://github.com/ocsigen/js_of_ocaml js_of_ocaml], ओसीजन टीम द्वारा विकसित, ओकैमल से [[जावास्क्रिप्ट]] के लिए एक अनुकूलन कंपाइलर है। | ||
** [https://bucklescript.github.io/ BuckleScript], जो पठनीय, मुहावरेदार जावास्क्रिप्ट आउटपुट उत्पन्न करने पर ध्यान देने के साथ जावास्क्रिप्ट को भी लक्षित करता है। | ** [https://bucklescript.github.io/ BuckleScript], जो पठनीय, मुहावरेदार जावास्क्रिप्ट आउटपुट उत्पन्न करने पर ध्यान देने के साथ जावास्क्रिप्ट को भी लक्षित करता है। | ||
** | ** ओकामलक्स असमर्थित प्लेटफार्मों के लिए मूल कोड कंपाइलर को पूरक करने के लिए ओकैमल से C तक एक कंपाइलर है। | ||
** | ** ओकैमलजावा, आईएनआरआईए द्वारा विकसित, ओकैमल से [[जावा वर्चुअल मशीन]] (जेवीएम) का एक कंपाइलर है। | ||
** लिप6 द्वारा विकसित | ** लिप6 द्वारा विकसित ओकोकपीस, [[पीआईसी माइक्रोकंट्रोलर]] के लिए एक ओकैमल कंपाइलर है। | ||
==कोड उदाहरण== | ==कोड उदाहरण== | ||
ओकैमल कोड के स्निपेट को शीर्ष-स्तरीय रीड-ईवल-प्रिंट लूप में दर्ज करके सबसे आसानी से अध्ययन किया जाता है। यह एक इंटरैक्टिव ओकैमल सत्र है जो अनुमानित प्रकार के परिणामी या परिभाषित अभिव्यक्तियों को प्रिंट करता है।<ref>{{Cite web|title=OCaml - टॉपलेवल सिस्टम या REPL (ocaml)|url=https://ocaml.org/manual/toplevel.html|access-date=2021-05-17|website=ocaml.org}}</ref> ओकैमल शीर्ष-स्तर की प्रारम्भ केवल ओकैमल प्रोग्राम को निष्पादित करके की जाती है: | |||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
| Line 139: | Line 125: | ||
- : int = 7 | - : int = 7 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ओकैमल अभिव्यक्ति के प्रकार को int (एक [[ शब्द (कंप्यूटर वास्तुकला) ]]|मशीन-प्रिसिजन इंटीजर (कंप्यूटर विज्ञान)) मानता है और परिणाम 7 देता है। | |||
===हैलो वर्ल्ड=== | ===हैलो वर्ल्ड=== | ||
| Line 162: | Line 148: | ||
$ | $ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ओकामलक का पहला तर्क, hello.ml, संकलित करने के लिए स्रोत फ़ाइल को निर्दिष्ट करता है और -o hello ध्वज आउटपुट फ़ाइल को निर्दिष्ट करता है।<ref>{{Cite web|url=https://caml.inria.fr/pub/docs/manual-ocaml/comp.html|title = OCaml - Batch compilation (Ocamlc)}}</ref> | |||
=== विकल्प === | === विकल्प === | ||
ओकैमल में विकल्प प्रकार का कंस्ट्रक्टर, हास्केल में शायद प्रकार के समान, किसी दिए गए डेटा प्रकार को या तो दिए गए डेटा प्रकार के कुछ मान को वापस करने के लिए, या कुछ भी नहीं लौटाने के लिए बढ़ाता है।<ref>{{Cite web |title=3.7. Options — OCaml Programming: Correct + Efficient + Beautiful |url=https://cs3110.github.io/textbook/chapters/data/options.html |access-date=2022-10-07 |website=cs3110.github.io}}</ref> इसका उपयोग यह व्यक्त करने के लिए किया जाता है कि कोई मान मौजूद हो भी सकता है और नहीं भी।<syntaxhighlight lang="ocaml"> | |||
# Some 42;; | # Some 42;; | ||
- : int option = Some 42 | - : int option = Some 42 | ||
| Line 182: | Line 166: | ||
- : string = "" | - : string = "" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===पूर्णांकों की सूची का सारांश=== | ===पूर्णांकों की सूची का सारांश=== | ||
सूचियाँ | सूचियाँ ओकैमल में मूलभूत डेटा प्रकारों में से एक हैं। निम्नलिखित कोड उदाहरण एक [[रिकर्सन (कंप्यूटर विज्ञान)]] फ़ंक्शन योग को परिभाषित करता है जो एक तर्क, पूर्णांक को स्वीकार करता है, जिसे पूर्णांकों की एक सूची माना जाता है। कीवर्ड नोट करें <code>rec</code> जो दर्शाता है कि फ़ंक्शन पुनरावर्ती है। फ़ंक्शन पूर्णांकों की दी गई सूची को पुनरावर्ती रूप से दोहराता है और तत्वों का योग प्रदान करता है। मैच स्टेटमेंट में सी (प्रोग्रामिंग लैंग्वेज) के [[ कथन बदलें ]] तत्व की समानताएं हैं, हालांकि यह कहीं अधिक सामान्य है। | ||
<syntaxhighlight lang="ocaml"> | <syntaxhighlight lang="ocaml"> | ||
| Line 225: | Line 207: | ||
List.fold_left (+) 0 | List.fold_left (+) 0 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===क्विकसॉर्ट=== | ===क्विकसॉर्ट=== | ||
ओकैमल पुनरावर्ती एल्गोरिदम को संक्षिप्त रूप से व्यक्त करने में सक्षम है। निम्नलिखित कोड उदाहरण [[जल्दी से सुलझाएं]] के समान एक एल्गोरिदम लागू करता है जो बढ़ते क्रम में एक सूची को सॉर्ट करता है। | |||
<syntaxhighlight lang="OCaml"> | <syntaxhighlight lang="OCaml"> | ||
| Line 248: | Line 228: | ||
qsort left @ [pivot] @ qsort right | qsort left @ [pivot] @ qsort right | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===[[जन्मदिन की समस्या|बर्थडे समस्या]]=== | |||
निम्नलिखित प्रोग्राम एक कमरे में उन लोगों की सबसे छोटी संख्या की गणना करता है जिनके लिए पूरी तरह से अद्वितीय बर्थडे की संभावना 50% से कम है (बर्थडे की समस्या, जहां 1 व्यक्ति के लिए संभावना 365/365 (या 100%) है, 2 के लिए यह है 364/365, 3 के लिए यह 364/365 × 363/365, आदि है) (उत्तर = 23)। | |||
===[[जन्मदिन की समस्या]]=== | |||
निम्नलिखित प्रोग्राम एक कमरे में उन लोगों की सबसे छोटी संख्या की गणना करता है जिनके लिए पूरी तरह से अद्वितीय | |||
<syntaxhighlight lang="OCaml"> | <syntaxhighlight lang="OCaml"> | ||
| Line 266: | Line 244: | ||
birthday_paradox 1.0 1 | birthday_paradox 1.0 1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===चर्च अंक=== | ===चर्च अंक=== | ||
निम्नलिखित कोड उत्तराधिकारी (सक्स) और जोड़ (ऐड) के साथ, [[प्राकृतिक संख्या]]ओं के [[चर्च एन्कोडिंग]] को परिभाषित करता है। एक चर्च अंक {{OCaml|n}} एक उच्च-क्रम वाला फ़ंक्शन है जो किसी फ़ंक्शन को स्वीकार करता है {{OCaml|f}} और एक मान {{OCaml|x}} और लागू होता है {{OCaml|f}} को {{OCaml|x}} बिल्कुल {{OCaml|n}} बार. चर्च अंक को एक कार्यात्मक मान से एक स्ट्रिंग में बदलने के लिए, हम इसे एक फ़ंक्शन पास करते हैं जो स्ट्रिंग को जोड़ता है {{OCaml|"S"}} इसके इनपुट और स्थिर स्ट्रिंग के लिए {{OCaml|"0"}}. | निम्नलिखित कोड उत्तराधिकारी (सक्स) और जोड़ (ऐड) के साथ, [[प्राकृतिक संख्या]]ओं के [[चर्च एन्कोडिंग]] को परिभाषित करता है। एक चर्च अंक {{OCaml|n}} एक उच्च-क्रम वाला फ़ंक्शन है जो किसी फ़ंक्शन को स्वीकार करता है {{OCaml|f}} और एक मान {{OCaml|x}} और लागू होता है {{OCaml|f}} को {{OCaml|x}} बिल्कुल {{OCaml|n}} बार. चर्च अंक को एक कार्यात्मक मान से एक स्ट्रिंग में बदलने के लिए, हम इसे एक फ़ंक्शन पास करते हैं जो स्ट्रिंग को जोड़ता है {{OCaml|"S"}} इसके इनपुट और स्थिर स्ट्रिंग के लिए {{OCaml|"0"}}. | ||
| Line 280: | Line 256: | ||
let _ = to_string (add (succ two) two) | let _ = to_string (add (succ two) two) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===स्वेच्छाचारी-सटीक फैक्टोरियल फ़ंक्शन (लाइब्रेरीज)=== | |||
ओकैमल से विभिन्न प्रकार की लाइब्रेरियों तक सीधे पहुंचा जा सकता है। उदाहरण के लिए, ओकैमल में [[मनमाना-सटीक अंकगणित|स्वेच्छाचारी-सटीक अंकगणित]] के लिए एक अंतर्निहित लाइब्रेरी है। जैसे-जैसे फैक्टोरियल फ़ंक्शन बहुत तेजी से बढ़ता है, यह मशीन-सटीक संख्याओं (आमतौर पर 32- या 64-बिट्स) को जल्दी से ओवरफ्लो कर देता है। इस प्रकार, फैक्टोरियल स्वेच्छाचारी-सटीक अंकगणित के लिए एक उपयुक्त उम्मीदवार है। | |||
ओकैमल में, Num मॉड्यूल (अब ZArith मॉड्यूल द्वारा प्रतिस्थापित) स्वेच्छाचारी-सटीक अंकगणित प्रदान करता है और इसका उपयोग करके इसे चालू शीर्ष-स्तर में लोड किया जा सकता है: | |||
<syntaxhighlight lang=ocaml> | <syntaxhighlight lang=ocaml> | ||
# #use "topfind";; | # #use "topfind";; | ||
| Line 291: | Line 265: | ||
# open Num;; | # open Num;; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
फैक्टोरियल फ़ंक्शन को तब | फैक्टोरियल फ़ंक्शन को तब स्वेच्छाचारी-सटीक संख्यात्मक ऑपरेटरों का उपयोग करके लिखा जा सकता है {{mono|{{=}}/}}, {{mono|*/}} और {{mono|-/}} : | ||
<syntaxhighlight lang="OCaml"> | <syntaxhighlight lang="OCaml"> | ||
| Line 307: | Line 281: | ||
8481114389650005964960521256960000000000000000000000000000" | 8481114389650005964960521256960000000000000000000000000000" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===त्रिकोण (ग्राफिक्स)=== | ===त्रिकोण (ग्राफिक्स)=== | ||
| Line 331: | Line 304: | ||
Glut.mainLoop () | Glut.mainLoop () | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ओपनजीएल के लिए लैबलजीएल बाइंडिंग आवश्यक है। इसके बाद प्रोग्राम को बाइटकोड में संकलित किया जा सकता है: | |||
$ ocamlc -I + lablGL lablग्लूट.cma lablgl.cma Simple.ml -o सरल | $ ocamlc -I + lablGL lablग्लूट.cma lablgl.cma Simple.ml -o सरल | ||
| Line 346: | Line 319: | ||
$ ./सरल | $ ./सरल | ||
ओकैमल में कहीं अधिक परिष्कृत, उच्च-प्रदर्शन वाले 2D और 3D ग्राफिकल प्रोग्राम विकसित किए जा सकते हैं। ओपनजीएल और ओकैमल के उपयोग के लिए धन्यवाद, परिणामी प्रोग्राम कई प्रमुख प्लेटफार्मों पर बिना किसी बदलाव के संकलित करके क्रॉस-प्लेटफ़ॉर्म हो सकते हैं। | |||
===फाइबोनैचि अनुक्रम=== | ===फाइबोनैचि अनुक्रम=== | ||
| Line 358: | Line 331: | ||
in fib_aux n 0 1 | in fib_aux n 0 1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===उच्च-क्रम के कार्य=== | ===उच्च-क्रम के कार्य=== | ||
फ़ंक्शंस इनपुट के रूप में फ़ंक्शंस ले सकते हैं और परिणाम के रूप में रिटर्न फ़ंक्शंस ले सकते हैं। उदाहरण के लिए, किसी फ़ंक्शन f पर दो बार लागू करने से एक फ़ंक्शन प्राप्त होता है जो f को उसके तर्क पर दो बार लागू करता है। | फ़ंक्शंस इनपुट के रूप में फ़ंक्शंस ले सकते हैं और परिणाम के रूप में रिटर्न फ़ंक्शंस ले सकते हैं। उदाहरण के लिए, किसी फ़ंक्शन f पर दो बार लागू करने से एक फ़ंक्शन प्राप्त होता है जो f को उसके तर्क पर दो बार लागू करता है। | ||
| Line 374: | Line 345: | ||
# add_str टेस्ट ;; | # add_str टेस्ट ;; | ||
- : स्ट्रिंग = टेस्ट टेस्ट टेस्ट टेस्ट | - : स्ट्रिंग = टेस्ट टेस्ट टेस्ट टेस्ट | ||
फ़ंक्शन दो बार टाइप वेरिएबल 'a' का उपयोग यह इंगित करने के लिए करता है कि इसे केवल int->int फ़ंक्शंस के बजाय किसी भी फ़ंक्शन f मैपिंग पर टाइप 'a' से लागू किया जा सकता है। विशेष रूप से, दो बार स्वयं पर भी लागू किया जा सकता है। | फ़ंक्शन दो बार टाइप वेरिएबल 'a' का उपयोग यह इंगित करने के लिए करता है कि इसे केवल int->int फ़ंक्शंस के बजाय किसी भी फ़ंक्शन f मैपिंग पर टाइप 'a' से लागू किया जा सकता है। विशेष रूप से, दो बार स्वयं पर भी लागू किया जा सकता है। | ||
# मान लीजिए चार गुना f = (दो बार दो बार) f;; | # मान लीजिए चार गुना f = (दो बार दो बार) f;; | ||
वैल चार बार : ('ए -> 'ए) -> 'ए -> 'ए = <मजेदार> | वैल चार बार : ('ए -> 'ए) -> 'ए -> 'ए = <मजेदार> | ||
| Line 385: | Line 354: | ||
</सिंटैक्सहाइलाइट> | </सिंटैक्सहाइलाइट> | ||
==व्युत्पन्न | ==व्युत्पन्न लैंग्वेजएँ== | ||
=== | ===मेटा (Meta) ओकैमल=== | ||
मेटा ओकैमल<ref name = "Meta">{{cite web|url=http://okmij.org/ftp/ML/MetaOCaml.html|title=बीईआर मेटाओकैमल|last=oleg-at-okmij.org|website=okmij.org}}</ref> ओकैमल का एक [[मल्टी-स्टेज प्रोग्रामिंग]] एक्सटेंशन है जो रनटाइम के दौरान नए [[मशीन कोड]] के वृद्धिशील संकलन को सक्षम बनाता है। कुछ परिस्थितियों में, मल्टीस्टेज प्रोग्रामिंग का उपयोग करके महत्वपूर्ण स्पीडअप संभव है, क्योंकि संसाधित किए जाने वाले डेटा के बारे में अधिक विस्तृत जानकारी नियमित संकलन समय की तुलना में रनटाइम पर उपलब्ध होती है, इसलिए वृद्धिशील कंपाइलर स्थिति जांच आदि के कई मामलों को अनुकूलित कर सकता है। | |||
उदाहरण के तौर पर: यदि संकलन के समय यह ज्ञात हो कि कुछ [[घातांक]] {{OCaml|x -> x^n}} की | उदाहरण के तौर पर: यदि संकलन के समय यह ज्ञात हो कि कुछ [[घातांक]] {{OCaml|x -> x^n}} की प्रायः आवश्यकता होती है, लेकिन इसका मूल्य {{OCaml|n}} केवल रनटाइम पर ही ज्ञात होता है, मेटा ओकैमल में दो-चरण पावर फ़ंक्शन का उपयोग किया जा सकता है: | ||
<syntaxhighlight lang="OCaml"> | <syntaxhighlight lang="OCaml"> | ||
| Line 417: | Line 386: | ||
नया फ़ंक्शन स्वचालित रूप से संकलित होता है. | नया फ़ंक्शन स्वचालित रूप से संकलित होता है. | ||
===अन्य व्युत्पन्न | ===अन्य व्युत्पन्न लैंग्वेजएँ=== | ||
* | * एटमकैमल कोड के परमाणु (लेन-देन संबंधी) निष्पादन के लिए एक सिंक्रोनाइज़ेशन प्रिमिटिव प्रदान करता है। | ||
* [http://wiki.erights.org/wiki/Emily एमिली] (2006) | * [http://wiki.erights.org/wiki/Emily एमिली] (2006) ओकैमल 3.08 का एक उपसमुच्चय है जो ऑब्जेक्ट-क्षमता मॉडल क्षमता-आधारित सुरक्षा सिद्धांतों को लागू करने के लिए एक डिज़ाइन नियम सत्यापनकर्ता का उपयोग करता है। | ||
* F शार्प (प्रोग्रामिंग | * F शार्प (प्रोग्रामिंग लैंग्वेज)|F# ओकैमल पर आधारित एक .NET फ्रेमवर्क लैंग्वेज है। | ||
* ताजा | * ताजा ओकैमल नामों और बाइंडरों में हेरफेर करने की सुविधा देता है। | ||
* | * जीकैमल ओकैमल में विस्तारित बहुरूपता जोड़ता है, इस प्रकार ओवरलोडिंग और टाइप-सुरक्षित मार्शलिंग की अनुमति देता है। | ||
* [[JoCaml]] समवर्ती और वितरित कार्यक्रमों के विकास के लिए निर्माणों को एकीकृत करता है। | * [[JoCaml|जोकैमल]] समवर्ती और वितरित कार्यक्रमों के विकास के लिए निर्माणों को एकीकृत करता है। | ||
* | * ओकैमल ड्यूस एक्सएमएलL एक्सप्रेशन और रेगुर-एक्सप्रेशन प्रकार जैसी सुविधाओं के साथ ओकैमल का विस्तार करता है। | ||
* | * ओकैमलP3l ओकैमल और P3L लैंग्वेज पर आधारित एक [[समानांतर प्रोग्रामिंग]] प्रणाली है। | ||
* रीज़न (प्रोग्रामिंग | * रीज़न (प्रोग्रामिंग लैंग्वेज) [[फेसबुक]] पर बनाई गई ओकैमल के लिए एक वैकल्पिक ओकैमल सिंटैक्स (प्रोग्रामिंग लैंग्वेजएं) और टूलचेन है, जो मूल कोड और जावास्क्रिप्ट दोनों को संकलित कर सकता है। | ||
* [[रीस्क्रिप्ट (प्रोग्रामिंग भाषा)]] रीज़न/बकलस्क्रिप्ट टूलचेन से एक रीब्रांडिंग और नई | * [[रीस्क्रिप्ट (प्रोग्रामिंग भाषा)|रीस्क्रिप्ट (प्रोग्रामिंग लैंग्वेज)]] रीज़न/बकलस्क्रिप्ट टूलचेन से एक रीब्रांडिंग और नई लैंग्वेज है, जिसका सिंटैक्स अलग है और केवल जावास्क्रिप्ट में संकलित होता है। | ||
== | ==ओकैमल में लिखा गया सॉफ्टवेयर== | ||
* [[शून्य स्थापना]], एक मल्टी-प्लेटफॉर्म पैकेज मैनेजर। | * [[शून्य स्थापना]], एक मल्टी-प्लेटफॉर्म पैकेज मैनेजर। | ||
* | * कैमलपीडीएफ, पीडीएफ फाइलों को पढ़ने, लिखने और संशोधित करने के लिए एक ओकैमल लाइब्रेरी<ref>{{cite web|url=https://github.com/johnwhitington/camlpdf|title=GitHub - johnwhitington/camlpdf|website=[[GitHub]] |date=14 December 2022 }}</ref> | ||
* कोकिनेले (सॉफ्टवेयर), सी (प्रोग्रामिंग | * कोकिनेले (सॉफ्टवेयर), सी (प्रोग्रामिंग लैंग्वेज) प्रोग्राम के स्रोत कोड को बदलने के लिए एक उपयोगिता। | ||
* [[कॉक]], एक [[औपचारिक प्रमाण]] प्रबंधन प्रणाली। | * [[कॉक]], एक [[औपचारिक प्रमाण]] प्रबंधन प्रणाली। | ||
* [[एफएफटीडब्ल्यू]], असतत फूरियर परिवर्तनों की गणना के लिए एक | * [[एफएफटीडब्ल्यू]], असतत फूरियर परिवर्तनों की गणना के लिए एक लाइब्रेरीज (कंप्यूटिंग)। नाम के ओकैमल प्रोग्राम द्वारा कई C रूटीन तैयार किए गए हैं {{OCaml|genfft}}. | ||
* [[ फेसबुक संदेशवाहक ]] का वेब संस्करण।<ref>{{cite web|title=Messenger.com Now 50% Converted to Reason · Reason|url=https://reasonml.github.io/blog/2017/09/08/messenger-50-reason.html|website=reasonml.github.io|access-date=2018-02-27}}</ref> | * [[ फेसबुक संदेशवाहक | फेसबुक मैसेंजर]] का वेब संस्करण।<ref>{{cite web|title=Messenger.com Now 50% Converted to Reason · Reason|url=https://reasonml.github.io/blog/2017/09/08/messenger-50-reason.html|website=reasonml.github.io|access-date=2018-02-27}}</ref> | ||
* फ्लो, फेसबुक पर बनाया गया एक स्थिर प्रोग्राम विश्लेषण जो टाइप सिस्टम | * फ्लो, फेसबुक पर बनाया गया एक स्थिर प्रोग्राम विश्लेषण जो टाइप सिस्टम जावास्क्रिप्ट के लिए स्टेटिक प्रकार की जांच का अनुमान लगाता है और जांचता है।<ref>{{cite web|url=https://flow.org/en/|title=Flow: A Static Type Checker for JavaScript|website=Flow}}</ref> | ||
* [[उल्लू वैज्ञानिक कंप्यूटिंग]], वैज्ञानिक और इंजीनियरिंग कंप्यूटिंग के लिए एक समर्पित प्रणाली। | * [[उल्लू वैज्ञानिक कंप्यूटिंग|आउल वैज्ञानिक कंप्यूटिंग]], वैज्ञानिक और इंजीनियरिंग कंप्यूटिंग के लिए एक समर्पित प्रणाली। | ||
* [[सामने-सी]], | * [[सामने-सी|फ्रामा- C]], C कार्यक्रमों के विश्लेषण के लिए एक रूपरेखा। | ||
* [[जीनवेब]], मुफ़्त और ओपन-सोर्स मल्टी-प्लेटफ़ॉर्म वंशावली सॉफ़्टवेयर। | * [[जीनवेब]], मुफ़्त और ओपन-सोर्स मल्टी-प्लेटफ़ॉर्म वंशावली सॉफ़्टवेयर। | ||
* फेसबुक पर बनाया गया [[ हैक (प्रोग्रामिंग भाषा) ]] प्रोग्रामिंग लैंग्वेज कंपाइलर, स्थिर प्रकारों के साथ [[PHP]] का विस्तार करता है। | * फेसबुक पर बनाया गया [[ हैक (प्रोग्रामिंग भाषा) | हैक (प्रोग्रामिंग लैंग्वेज)]] प्रोग्रामिंग लैंग्वेज कंपाइलर, स्थिर प्रकारों के साथ [[PHP|पीएचपी]] का विस्तार करता है। | ||
* [[ मिला हुआ ]] प्रोग्रामिंग | * [[ मिला हुआ | हेक्से]] प्रोग्रामिंग लैंग्वेज कंपाइलर। | ||
* [[एचओएल लाइट]], एक औपचारिक प्रमाण सहायक। | * [[एचओएल लाइट]], एक औपचारिक प्रमाण सहायक। | ||
* इनफ़र, जावा (प्रोग्रामिंग | * इनफ़र, जावा (प्रोग्रामिंग लैंग्वेज), सी, सी++ और [[ उद्देश्य सी ]] के लिए फेसबुक पर बनाया गया एक स्थिर विश्लेषक है, जिसका उपयोग [[आईओएस]] और [[एंड्रॉइड (ऑपरेटिंग सिस्टम)]] ऐप्स में बग का पता लगाने के लिए किया जाता है।<ref>{{cite web|url=https://fbinfer.com/|title=स्थैतिक विश्लेषक का अनुमान लगाएं|website=Infer}}</ref> | ||
* [https://www.lexifi.com/apropos/ | * [https://www.lexifi.com/apropos/ लेक्सिफ़ी एप्रोपोस], जटिल डेरिवेटिव मॉडलिंग के लिए एक प्रणाली। | ||
* मिराजओएस, शुद्ध ओकैमल में लिखा गया एक [[unikernel]] प्रोग्रामिंग फ्रेमवर्क। | * मिराजओएस, शुद्ध ओकैमल में लिखा गया एक [[unikernel|यूनिकर्नेल]] प्रोग्रामिंग फ्रेमवर्क। | ||
* [[MLdonkey]], | * [[MLdonkey|एमएलडोंकी]], इडोंकी नेटवर्क पर आधारित एक [[पीयर-टू-पीयर फ़ाइल साझाकरण]] एप्लिकेशन। | ||
* | * ओसीजन, एक ओकैमल [[ वेब ढाँचा ]]। | ||
* [[ओपा (प्रोग्रामिंग भाषा)]], वेब विकास के लिए एक स्वतंत्र और ओपन-सोर्स प्रोग्रामिंग | * [[ओपा (प्रोग्रामिंग भाषा)|ओपा (प्रोग्रामिंग लैंग्वेज)]], वेब विकास के लिए एक स्वतंत्र और ओपन-सोर्स प्रोग्रामिंग लैंग्वेज। | ||
* पायर-चेक, फेसबुक पर [[पायथन (प्रोग्रामिंग भाषा)]] के लिए एक प्रकार का चेकर बनाया गया।<ref>{{cite web|url=https://github.com/facebook/pyre-check|title=GitHub - facebook/pyre-check: Performant type-checking for python.|date=9 February 2019|via=GitHub}}</ref> | * पायर-चेक, फेसबुक पर [[पायथन (प्रोग्रामिंग भाषा)|पायथन (प्रोग्रामिंग लैंग्वेज)]] के लिए एक प्रकार का चेकर बनाया गया।<ref>{{cite web|url=https://github.com/facebook/pyre-check|title=GitHub - facebook/pyre-check: Performant type-checking for python.|date=9 February 2019|via=GitHub}}</ref> | ||
* [https://semgrep.dev/ सेमग्रेप], एक बग-फाइंडिंग टूल जो कई प्रोग्रामिंग | * [https://semgrep.dev/ सेमग्रेप], एक बग-फाइंडिंग टूल जो कई प्रोग्रामिंग लैंग्वेज का समर्थन करता है। | ||
* [[Tezos]], एक स्व-संशोधित स्मार्ट अनुबंध प्लेटफ़ॉर्म जो | * [[Tezos|तेज़ोस]], एक स्व-संशोधित स्मार्ट अनुबंध प्लेटफ़ॉर्म जो एक्सटीजेड को मूल मुद्रा के रूप में उपयोग करता है। | ||
* [https://github.com/bcpierce00/unison Unison], दो निर्देशिकाओं के बीच फ़ाइलों को सिंक्रनाइज़ करने के लिए एक [[फ़ाइल सिंक्रनाइज़ेशन]] प्रोग्राम। | * [https://github.com/bcpierce00/unison Unison], दो निर्देशिकाओं के बीच फ़ाइलों को सिंक्रनाइज़ करने के लिए एक [[फ़ाइल सिंक्रनाइज़ेशन]] प्रोग्राम। | ||
* [[WebAssembly]] के लिए संदर्भ दुभाषिया, [[वेब ब्राउज़र]] के अंदर निष्पादन के लिए एक निम्न-स्तरीय बाइटकोड।<ref>{{cite web|url=https://github.com/WebAssembly/spec|title=WebAssembly/spec: WebAssembly specification, reference interpreter, and test suite.|date=5 December 2019|publisher=[[World Wide Web Consortium]]|access-date=2021-05-14|via=GitHub}}</ref> | * [[WebAssembly|वेबअसेंबली]] के लिए संदर्भ दुभाषिया, [[वेब ब्राउज़र]] के अंदर निष्पादन के लिए एक निम्न-स्तरीय बाइटकोड।<ref>{{cite web|url=https://github.com/WebAssembly/spec|title=WebAssembly/spec: WebAssembly specification, reference interpreter, and test suite.|date=5 December 2019|publisher=[[World Wide Web Consortium]]|access-date=2021-05-14|via=GitHub}}</ref> | ||
* [[[[ एक्सईएन ]] क्लाउड प्लेटफ़ॉर्म]] (एक्ससीपी), ज़ेन [[सूत्र]] के लिए एक [[टर्नकी]] [[वर्चुअलाइजेशन]] समाधान। | * [[[[ एक्सईएन ]] क्लाउड प्लेटफ़ॉर्म]] (एक्ससीपी), ज़ेन [[सूत्र]] के लिए एक [[टर्नकी]] [[वर्चुअलाइजेशन]] समाधान। | ||
==उपयोगकर्ता== | ==उपयोगकर्ता== | ||
कई दर्जन कंपनियाँ कुछ हद तक | कई दर्जन कंपनियाँ कुछ हद तक ओकैमल का उपयोग करती हैं।<ref name="ocaml.org-companies">{{Cite web|url=https://ocaml.org/learn/companies.html|title=OCaml का उपयोग करने वाली कंपनियाँ|access-date=2021-05-14|publisher=OCaml.org}}</ref> उल्लेखनीय उदाहरणों में सम्मिलित हैं: | ||
* ब्लूमबर्ग एल.पी., जिसने जावास्क्रिप्ट को लक्षित करने वाला एक | * ब्लूमबर्ग एल.पी., जिसने जावास्क्रिप्ट को लक्षित करने वाला एक ओकैमल कंपाइलर बैकएंड [https://bucklescript.github.io/ BuckleScript] बनाया।<ref>{{cite web|url=https://www.techatbloomberg.com/blog/bucklescript-1-0-release-arrived/|title=BuckleScript: The 1.0 release has arrived! {{!}} Tech at Bloomberg|date=8 September 2016|website=Tech at Bloomberg|ref=12|access-date=21 May 2017}}</ref> | ||
* [[Citrix Systems]], जो | * [[Citrix Systems|सिट्रिक्स सिस्टम्स]], जो सिट्रिक्स सिस्टम#नेटवर्किंग और क्लाउड में ओकैमल का उपयोग करता है (2018 के दौरान सिट्रिक्स हाइपरवाइज़र के रूप में पुनः ब्रांडेड)। | ||
* फेसबुक, जिसने | * फेसबुक, जिसने ओकैमल में फ्लो, हैक, इनफर, पीएफएफ और रीज़न विकसित किया। | ||
* [[जेन स्ट्रीट कैपिटल]], एक मालिकाना व्यापारिक फर्म, जिसने अपने | * [[जेन स्ट्रीट कैपिटल]], एक मालिकाना व्यापारिक फर्म, जिसने अपने प्रारम्भी दिनों में ओकैमल को अपनी पसंदीदा लैंग्वेज के रूप में अपनाया।<ref>{{cite web|url=http://cacm.acm.org/magazines/2011/11/138203-ocaml-for-the-masses/fulltext|title=जनता के लिए OCaml|author=Yaron Minsky|date=1 November 2011|access-date=2 May 2015}}</ref> | ||
==संदर्भ== | ==संदर्भ== | ||
{{Reflist}} | {{Reflist}} | ||
==बाहरी संबंध== | ==बाहरी संबंध== | ||
* [https://v2.ocaml.org/manual/ ओकैमल manual] | |||
* [https://opam.ocaml.org/ ओकैमल Package Manager] | |||
* [https://v2.ocaml.org/manual/ | * [https://dev.realworldocaml.org/ Real World ओकैमल] | ||
* [https://opam.ocaml.org/ | |||
* [https://dev.realworldocaml.org/ Real World | |||
[[Category: | [[Category:CS1 English-language sources (en)]] | ||
[[Category:Created On 08/07/2023]] | [[Category:Created On 08/07/2023]] | ||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:OCaml प्रोग्रामिंग भाषा परिवार]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Short description with empty Wikidata description]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:उदाहरण OCaml कोड वाले लेख]] | |||
[[Category:उदाहरण कोड वाले लेख]] | |||
[[Category:एक्स्टेंसिबल सिंटैक्स प्रोग्रामिंग भाषाएँ]] | |||
[[Category:एमएल प्रोग्रामिंग भाषा परिवार]] | |||
[[Category:ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाएँ]] | |||
[[Category:ओकैमल सॉफ्टवेयर]] | |||
[[Category:कार्यात्मक भाषाएँ]] | |||
[[Category:क्रॉस-प्लेटफ़ॉर्म मुफ़्त सॉफ़्टवेयर]] | |||
[[Category:पैटर्न मिलान प्रोग्रामिंग भाषाएँ]] | |||
[[Category:प्रोग्रामिंग भाषाएँ 1996 में बनाई गईं]] | |||
[[Category:मुफ़्त संकलक और दुभाषिए]] | |||
[[Category:स्थिर रूप से टाइप की गई प्रोग्रामिंग भाषाएँ]] | |||
Latest revision as of 15:55, 29 August 2023
| File:OCaml Logo.svg | |
| Paradigm | Multi-paradigm: functional, imperative, modular,[1] object-oriented |
|---|---|
| परिवार | ML |
| द्वारा डिज़ाइन किया गया | Xavier Leroy, Jérôme Vouillon, Damien Doligez, Didier Rémy, Ascánder Suárez |
| Developer | Inria |
| पहली प्रस्तुति | 1996 |
| Stable release | Script error: The module returned a nil value. It is supposed to return an export table.
/ Script error: The module returned a nil value. It is supposed to return an export table. |
| टाइपिंग अनुशासन | Inferred, static, strong, structural |
| कार्यान्वयन भाषा | OCaml, C |
| प्लेटफॉर्म | IA-32, x86-64, Power, SPARC, ARM 32-64, RISC-V |
| ओएस | Cross-platform: Unix, macOS, Windows |
| लाइसेंस | LGPLv2.1 |
| फ़ाइल नाम एक्सटेंशनएस | .ml, .mli |
| Influenced by | |
| C, Caml, Modula-3, Pascal, Standard ML | |
| Influenced | |
| ATS, Coq, Elm, F#, F*, Haxe, Opa, Rust, Scala | |
| |
ओकैमल/OCaml (/oʊˈkæməl/ oh-KAM-əl, पूर्व में ऑब्जेक्टिव कैमल) एक सामान्य-उद्देश्यीय प्रोग्रामिंग लैंग्वेज है|सामान्य-उद्देश्य, उच्च-स्तरीय प्रोग्रामिंग लैंग्वेज|उच्च-स्तरीय बहु-प्रतिमान प्रोग्रामिंग लैंग्वेज जो ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट के साथ एमएल (प्रोग्रामिंग लैंग्वेज) की कैमल बोली का विस्तार करती है। -उन्मुख विशेषताएं. ओकैमल को 1996 में जेवियर लेरॉय, जेरोम वोइलन, डेमियन डोलिगेज़, डिडिएर रेमी, एस्केंडर सुआरेज़ और अन्य द्वारा बनाया गया था।
ओकैमल औज़ारश्रृंखला में एक इंटरएक्टिव टॉप-लेवल दुभाषिया (कंप्यूटिंग) , एकबाईटकोड संकलक, एक ऑप्टिमाइज़िंग नेटिव कोड कंपाइलर, एक रिवर्सिबल डिबगर और एक पैकेज मैनेजर (ओपीएएम) सम्मिलित है। ओकैमल को प्रारम्भ में स्वचालित प्रमेय सिद्ध करने के संदर्भ में विकसित किया गया था, और स्थैतिक कार्यक्रम विश्लेषण और औपचारिक तरीकों के सॉफ्टवेयर में इसकी बड़ी उपस्थिति है। इन क्षेत्रों से परे, इसे अन्य एप्लिकेशन डोमेन के अलावा सिस्टम प्रोग्रामिंग, वेब विकास और विशिष्ट वित्तीय उपयोगिताओं में गंभीर उपयोग मिला है।
संक्षिप्त नाम सीएएमएलमूल रूप से श्रेणीबद्ध सार मशीन लैंग्वेज के लिए था, लेकिन ओकैमल इस अमूर्त मशीन को छोड़ देता है।[2] ओकैमल एक मुफ़्त और ओपन-सोर्स सॉफ़्टवेयर प्रोजेक्ट है जिसका प्रबंधन और मुख्य रूप से कंप्यूटर विज्ञान और स्वचालन में अनुसंधान के लिए फ्रेंच संस्थान (इनरिया) द्वारा रखरखाव किया जाता है। 2000 के दशक की प्रारम्भ में, ओकैमल के तत्वों को कई लैंग्वेज द्वारा अपनाया गया, विशेष रूप से F शार्प (प्रोग्रामिंग लैंग्वेज)|F# और स्काला (प्रोग्रामिंग लैंग्वेज)।
दर्शन
एमएल (प्रोग्रामिंग लैंग्वेज)-व्युत्पन्न लैंग्वेजएं अपने स्थिर प्रकार के सिस्टम और प्रकार अनुमान|प्रकार-अनुमानित कंपाइलरों के लिए सबसे अच्छी तरह से जानी जाती हैं। ओकैमल एक एमएल-जैसी प्रकार प्रणाली के तहत कार्यात्मक प्रोग्रामिंग, अनिवार्य प्रोग्रामिंग और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को एकीकृत करता है। इस प्रकार, प्रोग्रामर को ओकैमल का उपयोग करने के लिए शुद्ध कार्यात्मक लैंग्वेज प्रतिमान से अत्यधिक परिचित होने की आवश्यकता नहीं है।
प्रोग्रामर को अपने स्थिर प्रकार सिस्टम की बाधाओं के भीतर काम करने की आवश्यकता देकर, ओकैमल गतिशील रूप से टाइप की गई लैंग्वेज से जुड़ी कई प्रकार-संबंधित रन-टाइम प्रकार की जानकारी समस्याओं को समाप्त कर देता है। साथ ही, ओकैमल का टाइप-इनफ़रिंग कंपाइलर मैन्युअल प्रकार के एनोटेशन की आवश्यकता को बहुत कम कर देता है जो अधिकांश स्थिर रूप से टाइप की गई लैंग्वेज में आवश्यक होते हैं। उदाहरण के लिए, चर के डेटा प्रकार और फ़ंक्शन के प्रकार हस्ताक्षरों को आमतौर पर स्पष्ट रूप से घोषित करने की आवश्यकता नहीं होती है, जैसा कि वे जावा (प्रोग्रामिंग लैंग्वेज) और सी शार्प (प्रोग्रामिंग लैंग्वेज)|C# जैसी लैंग्वेज में करते हैं, क्योंकि उनका अनुमान ऑपरेटरों से लगाया जा सकता है। और अन्य फ़ंक्शन जो कोड में वेरिएबल्स और अन्य मानों पर लागू होते हैं। ओकैमल प्रकार की प्रणाली के प्रभावी उपयोग के लिए प्रोग्रामर की ओर से कुछ परिष्कार की आवश्यकता हो सकती है, लेकिन इस अनुशासन को विश्वसनीय, उच्च-प्रदर्शन सॉफ़्टवेयर से पुरस्कृत किया जाता है।
ओकैमल अपने प्रदर्शन पर जोर देने के कारण शायद अकादमिक क्षेत्र में उत्पन्न होने वाली अन्य लैंग्वेज से सबसे अलग है। इसकी स्थिर प्रकार प्रणाली रनटाइम प्रकार के बेमेल को रोकती है और इस प्रकार रनटाइम प्रकार और सुरक्षा जांच को रोकती है जो गतिशील रूप से टाइप की गई लैंग्वेज के प्रदर्शन पर बोझ डालती है, साथ ही रनटाइम सुरक्षा की गारंटी देती है, सिवाय इसके कि जब सरणी सीमा जांच बंद हो जाती है या जब क्रमबद्धता जैसी कुछ प्रकार-असुरक्षित सुविधाओं का उपयोग किया जाता है . ये इतने दुर्लभ हैं कि व्यवहार में इनसे बचना काफी संभव है।
टाइप-चेकिंग ओवरहेड के अलावा, फ़नार्ग समस्या जैसे मुद्दों के कारण, कार्यात्मक प्रोग्रामिंग लैंग्वेजएं, सामान्य तौर पर, कुशल मशीन लैंग्वेज कोड में संकलित करने के लिए चुनौतीपूर्ण होती हैं। मानक लूप, रजिस्टर और इंस्ट्रक्शन संकलक अनुकूलन के साथ, ओकैमल का ऑप्टिमाइज़िंग कंपाइलर वैल्यू बॉक्सिंग (कंप्यूटर विज्ञान) और समापन (कंप्यूटर विज्ञान) आवंटन को अनुकूलित करने के लिए स्थैतिक प्रोग्राम विश्लेषण विधियों को नियोजित करता है, जिससे परिणामी कोड के प्रदर्शन को अधिकतम करने में मदद मिलती है, भले ही यह व्यापक हो कार्यात्मक प्रोग्रामिंग संरचनाओं का उपयोग।
जेवियर लेरॉय ने कहा है कि ओकैमल एक अच्छे C कंपाइलर का कम से कम 50% प्रदर्शन प्रदान करता है,[3] हालाँकि सीधी तुलना असंभव है. ओकैमल मानक लाइब्रेरीज में कुछ फ़ंक्शन अन्य लैंग्वेज के मानक लाइब्रेरीजों में समकक्ष कार्यों की तुलना में तेज़ एल्गोरिदम के साथ कार्यान्वित किए जाते हैं। उदाहरण के लिए, सिद्धांत रूप में ओकैमल मानक लाइब्रेरीज में सेट यूनियन का कार्यान्वयन अनिवार्य लैंग्वेज (जैसे, C++, जावा) के मानक लाइब्रेरीजों में समतुल्य फ़ंक्शन की तुलना में तेज है क्योंकि ओकैमल कार्यान्वयन इनपुट के कुछ हिस्सों का पुन: उपयोग करने के लिए सेट की अपरिवर्तनीयता का फायदा उठाता है। आउटपुट में सेट (लगातार डेटा संरचना देखें)।
इतिहास
एमएल (मेटा लैंग्वेज) का विकास
1970 और 1980 के दशक के बीच, ब्रिटिश कंप्यूटर वैज्ञानिक और ट्यूरिंग पुरस्कार विजेता रॉबिन मिलनर ने कंप्यूटर विज्ञान की नींव के लिए एडिनबर्ग विश्वविद्यालय की प्रयोगशाला में काम किया।[4][5] मिलनर और अन्य स्वचालित प्रमेय सिद्ध करने पर काम कर रहे थे, जो ऐतिहासिक रूप से लिस्प (प्रोग्रामिंग लैंग्वेज) जैसी लैंग्वेज में विकसित किए गए थे। मिलनर ने बार-बार इस मुद्दे का सामना किया कि प्रमेय सिद्धकर्ता गैर-प्रमाणों को एक साथ रखकर यह दावा करने का प्रयास करेंगे कि प्रमाण (सत्य) वैध है।[5]परिणामस्वरूप, उन्होंने कंप्यूटेबल फ़ंक्शंस के लिए अपने लॉजिक के लिए एमएल (प्रोग्रामिंग लैंग्वेज) विकसित की, एक ऐसी लैंग्वेज जो लेखक को केवल अपने बहुरूपी प्रकार प्रणाली के साथ वैध प्रमाण बनाने की अनुमति देगी।[6] विभिन्न मशीनों पर एलसीएफ के उपयोग को सरल बनाने के लिए एमएल को एक कंपाइलर में बदल दिया गया था, और 1980 के दशक तक, इसे अपनी खुद की एक पूरी प्रणाली में बदल दिया गया था।[6]एमएल अंततः ओकैमल के निर्माण के लिए आधार के रूप में काम करेगा।
1980 के दशक की प्रारम्भ में, कुछ ऐसे विकास हुए जिन्होंने फ्रेंच इंस्टीट्यूट फॉर रिसर्च इन कंप्यूटर साइंस एंड ऑटोमेशन की फॉर्मेल टीम को एमएल लैंग्वेज में रुचि लेने के लिए प्रेरित किया। ऑक्सफोर्ड विश्वविद्यालय के एक शोध प्रोफेसर लुका कार्डेली ने एमएल के तेजी से कार्यान्वयन को विकसित करने के लिए अपनी कार्यात्मक सार मशीन का उपयोग किया, और रॉबिन मिलनर ने विभिन्न कार्यान्वयनों के बीच विचलन से बचने के लिए एमएल की एक नई परिलैंग्वेज प्रस्तावित की। इसके साथ ही, पेरिस डाइडरॉट विश्वविद्यालय के एक वरिष्ठ शोधकर्ता पियरे-लुई क्यूरियन ने श्रेणीबद्ध कॉम्बिनेटरों का एक कैलकुलस विकसित किया और इसे लैम्ब्डा कैलकुलस से जोड़ा, जिससे श्रेणीबद्ध अमूर्त मशीन (सीएएम) की परिलैंग्वेज सामने आई। पेरिस डाइडरॉट विश्वविद्यालय के एक शोधकर्ता गाइ कूसिनेउ (कंप्यूटर वैज्ञानिक) ने माना कि इसे एमएल के लिए एक संकलन तकनीक के रूप में लागू किया जा सकता है।[7]
पहला कार्यान्वयन
कैमल को प्रारम्भ में जेरार्ड ह्यूट की अध्यक्षता वाली आईएनआरआईए की फॉर्मेल टीम द्वारा डिजाइन और विकसित किया गया था। कैमल का पहला कार्यान्वयन 1987 में बनाया गया था और 1992 तक इसे और विकसित किया गया था। हालांकि इसका नेतृत्व एस्केंडर सुआरेज़ ने किया था, 1988 में उनके जाने के बाद पियरे वीस (कंप्यूटर वैज्ञानिक) और मिशेल मौनी (कंप्यूटर विज्ञान) ने विकास जारी रखा।[7]
गाइ कूसिनेउ को यह याद करते हुए उद्धृत किया गया है कि प्रोग्रामिंग लैंग्वेज कार्यान्वयन के साथ उनका अनुभव प्रारम्भ में बहुत सीमित था, और इसमें कई अपर्याप्तताएं थीं जिनके लिए वह जिम्मेदार हैं। इसके अतिरिक्त, उनका मानना है कि एस्केंडर, पियरे और मिशेल ने काफी अच्छा काम किया है।[7]
कैमल लाइट
1990 और 1991 के बीच, जेवियर लेरॉय ने सी (प्रोग्रामिंग लैंग्वेज) में लिखे गए बाइटकोड दुभाषिया के आधार पर कैमल का एक नया कार्यान्वयन डिजाइन किया। इसके अलावा, डेमियन डोलिगेज़ ने इस कार्यान्वयन के लिए एक मेमोरी प्रबंधन प्रणाली लिखी, जिसे अनुक्रमिक कचरा संग्रह (कंप्यूटर विज्ञान) के रूप में भी जाना जाता है।[6]कैमल लाइट के नाम से जाना जाने वाला यह नया कार्यान्वयन, पुराने कैमल कार्यान्वयन को प्रतिस्थापित करता है और छोटी डेस्कटॉप मशीनों पर चलता है।[7]बाद के वर्षों में, मिशेल मौनी के वाक्यविन्यास हेरफेर उपकरण जैसे लाइब्रेरीज दिखाई दिए और शैक्षिक और अनुसंधान टीमों में कैमल के उपयोग को बढ़ावा देने में मदद की।[6]
कैमल स्पेशल लाइट
1995 में, जेवियर लेरॉय ने कैमल स्पेशल लाइट जारी की, जो कैमल का एक उन्नत संस्करण था।[7]बाइटकोड कंपाइलर में एक ऑप्टिमाइज़िंग नेटिव कोड | नेटिव-कोड कंपाइलर जोड़ा गया, जिसने C++ जैसी मुख्यधारा की लैंग्वेज के साथ तुलनीय स्तर तक प्रदर्शन को काफी बढ़ा दिया।[6][7]इसके अतिरिक्त, लेरॉय ने स्टैंडर्ड एमएल के मॉड्यूल सिस्टम से प्रेरित एक उच्च स्तरीय मॉड्यूल सिस्टम डिजाइन किया, जो अमूर्तता और पैरामीटराइजेशन के लिए शक्तिशाली सुविधाएं प्रदान करता है और बड़े पैमाने के कार्यक्रमों के निर्माण को आसान बनाता है।[6]
उद्देश्य कैमल
डिडिएर रेमी और जेरोम वोइलन ने वस्तुओं और वर्गों के लिए एक अभिव्यंजक प्रकार की प्रणाली डिजाइन की, जिसे कैमल स्पेशल लाइट के भीतर एकीकृत किया गया था। इससे ऑब्जेक्टिव कैमल लैंग्वेज का उदय हुआ, जिसे पहली बार 1996 में जारी किया गया और बाद में 2011 में इसका नाम बदलकर ओकैमल कर दिया गया। इस ऑब्जेक्ट सिस्टम ने कई प्रचलित ऑब्जेक्ट-ओरिएंटेड मुहावरों को सांख्यिकीय रूप से सुरक्षित तरीके से समर्थन दिया, जबकि उन्हीं मुहावरों ने अस्वस्थता या आवश्यकता उन्नत की। C++ या जावा (प्रोग्रामिंग लैंग्वेज) जैसी लैंग्वेज में रनटाइम जाँच। 2000 में, जैक्स गैरिग्यू ने ऑब्जेक्टिव कैमल को कई नई सुविधाओं जैसे बहुरूपी तरीकों, वेरिएंट और लेबल और वैकल्पिक तर्कों के साथ विस्तारित किया।[6][7]
सतत विकास
ओकैमल में बढ़ते व्यावसायिक और शैक्षणिक कोडबेस का समर्थन करने के लिए पिछले दो दशकों में लैंग्वेज सुधारों को क्रमिक रूप से जोड़ा गया है।[6]2012 में ओकैमल 4.0 रिलीज़ में लैंग्वेज के लचीलेपन को बढ़ाने के लिए सामान्यीकृत बीजगणितीय डेटा प्रकार (जीएडीटी) और प्रथम श्रेणी के मॉड्यूल जोड़े गए।[6]ओकैमल 5.0.0 2022 में रिलीज़ होगा[8] लैंग्वेज रनटाइम का पूर्ण पुनर्लेखन है, वैश्विक दुभाषिया लॉक को हटाना और सीमांकित निरंतरता के माध्यम से प्रभाव प्रणाली को जोड़ना। ये परिवर्तन क्रमशः समानांतर_प्रोग्रामिंग_मॉडल#साझा_मेमोरी|साझा-मेमोरी समानता और रंग-अंधा समवर्ती के लिए समर्थन सक्षम करते हैं।
ओकैमल का विकास 2005 तक आईएनआरआईए में क्रिस्टाल टीम के भीतर जारी रहा, जब गैलियम टीम ने इसका स्थान लिया।[9] इसके बाद, गैलियम को 2019 में कैम्बियम टीम द्वारा सफल बनाया गया।[10][11]
सुविधाएँ
ओकैमल में सिमेंटिक विश्लेषण (कंप्यूटर विज्ञान) प्रकार प्रणाली, प्रकार अनुमान, पैरामीट्रिक बहुरूपता, पूंछ पुनरावृत्ति, पैटर्न मिलान, प्रथम श्रेणी लेक्सिकल क्लोजर (कंप्यूटर विज्ञान), फ़ंक्शन ऑब्जेक्ट#अन्य अर्थ|फ़ंक्टर (पैरामीट्रिक मॉड्यूल), अपवाद हैंडलिंग, प्रभाव प्रणाली की सुविधा है। , और वृद्धिशील पीढ़ीगत कचरा संग्रहण (कंप्यूटर विज्ञान)।
ओकैमल एक सामान्य-उद्देश्य वाली लैंग्वेज में ऑब्जेक्ट सिस्टम में एमएल-शैली प्रकार के अनुमान को विस्तारित करने के लिए उल्लेखनीय है। यह संरचनात्मक उपटाइपिंग की अनुमति देता है, जहां ऑब्जेक्ट प्रकार संगत होते हैं यदि उनके विधि हस्ताक्षर संगत होते हैं, चाहे उनकी घोषित विरासत (सांख्यिकीय रूप से टाइप की गई लैंग्वेज में एक असामान्य विशेषता) कुछ भी हो।
लिंकर (कंप्यूटिंग) से सी (प्रोग्रामिंग लैंग्वेज) प्राइमेटिव के लिए एक विदेशी फ़ंक्शन इंटरफ़ेस प्रदान किया गया है, जिसमें सी और फोरट्रान दोनों के साथ संगत प्रारूपों में कुशल संख्यात्मक ऐरे डेटा संरचना के लिए लैंग्वेज समर्थन सम्मिलित है। ओकैमल ओकैमल फ़ंक्शंस की लाइब्रेरी बनाने का भी समर्थन करता है जिन्हें देशीC में एक मुख्य प्रोग्राम से जोड़ा जा सकता है, ताकि ओकैमल लाइब्रेरी को C प्रोग्रामर्स को वितरित किया जा सके जिनके पास ओकैमल का कोई ज्ञान या स्थापना नहीं है।
ओकैमल वितरण में सम्मिलित हैं:
- शाब्दिक विश्लेषण और पदच्छेद उपकरण जिन्हें ओकॉम्लेक्स (ओकॉम्लेक्स) और ओकामलयक (ओकामलयक) कहा जाता है
- डिबगर जो त्रुटियों की जांच करने के लिए पीछे की ओर जाने का समर्थन करता है
- दस्तावेज़ीकरण जनरेटर
- प्रोफाइलर (कंप्यूटर विज्ञान) - प्रदर्शन को मापने के लिए
- कई सामान्य प्रयोजन लाइब्रेरीज (कंप्यूटिंग)
नेटिव कोड कंपाइलर यूनिक्स, माइक्रोसॉफ़्ट विंडोज़ और एप्पल इंक. मैकओएस सहित कई प्लेटफार्मों के लिए उपलब्ध है। प्रमुख आर्किटेक्चर के लिए मूल कोड जनरेशन (कंपाइलर) समर्थन के माध्यम से पोर्टेबिलिटी हासिल की जाती है:
- X86-64 (एएमडी64), आरआईएससी-वी, और एआरएम64 (ओकैमल 5.0.0 और उच्चतर में)[12]
- पावर आईएसए, आईबीएम जेड (ओकैमल 5.0.0 से पहले, और भविष्य में 5.x रिलीज़ में पुनः प्रदर्शित होने के कारण)
- आईए-32 और एआरएम वास्तुकला (ओकैमल 5.0.0 से पहले)
- स्पार्क (ओकैमल 4.06.0 से पहले)
- डीईसी अल्फा, एचपीपीए, आईए64 और एमआईपीएस वास्तुकला (ओकैमल 4.00.0 से पहले)
जब मूल कोड जनरेशन उपलब्ध नहीं होता है, तो बाइटकोड कंपाइलर किसी भी 32- या 64-बिट आर्किटेक्चर पर ऑपरेशन का समर्थन करता है, जिसके लिए केवल सी कंपाइलर की आवश्यकता होती है।
ओकैमल बाइटकोड और नेटिव कोड प्रोग्राम को प्रीमेप्टिव संदर्भ स्विचिंग के साथ थ्रेड (कंप्यूटर विज्ञान) शैली में लिखा जा सकता है। एक ही डोमेन में ओकैमल थ्रेड्स[13] केवल टाइम शेयरिंग द्वारा निष्पादित करें। हालाँकि, एक ओकैमल प्रोग्राम में कई डोमेन हो सकते हैं। वितरित कंप्यूटिंग के लिए कई लाइब्रेरी हैं जैसे फंक्टरी और ओकैमलनेट/प्लाज्मा।
विकास का माहौल
2011 से, ओकैमल विकास परिवेश में कई नए टूल और लाइब्रेरी का योगदान दिया गया है:
- विकास उपकरण
- opam ओकैमल के लिए एक पैकेज मैनेजर है।
- मर्लिन कई संपादकों के लिए आईडीई जैसी कार्यक्षमता प्रदान करता है, जिसमें टाइप थ्रोबैक, गो-टू-डेफिनिशन और ऑटो-कम्प्लीशन सम्मिलित है।
- Dune ओकैमल के लिए एक कंपोज़ेबल बिल्ड-सिस्टम है।
- OCamlformat ओकैमल के लिए एक ऑटो-फॉर्मेटर है।
- ocaml-lsp-server ओकैमल एकीकृत विकास पर्यावरण एकीकरण के लिए एक लैंग्वेज सर्वर प्रोटोकॉल है।
- वेब साइटें:
- OCaml.org लैंग्वेज के लिए प्राथमिक साइट है।
- discuss.ocaml.org प्रवचन (सॉफ्टवेयर) का एक उदाहरण है जो ओकैमल के लिए प्राथमिक चर्चा साइट के रूप में कार्य करता है।
- watch.ocaml.org पियरट्यूब का एक उदाहरण है जो ओकैमल विषयों के बारे में वीडियो होस्ट करता है।
- ओकैमल के लिए वैकल्पिक कंपाइलर:
- js_of_ocaml, ओसीजन टीम द्वारा विकसित, ओकैमल से जावास्क्रिप्ट के लिए एक अनुकूलन कंपाइलर है।
- BuckleScript, जो पठनीय, मुहावरेदार जावास्क्रिप्ट आउटपुट उत्पन्न करने पर ध्यान देने के साथ जावास्क्रिप्ट को भी लक्षित करता है।
- ओकामलक्स असमर्थित प्लेटफार्मों के लिए मूल कोड कंपाइलर को पूरक करने के लिए ओकैमल से C तक एक कंपाइलर है।
- ओकैमलजावा, आईएनआरआईए द्वारा विकसित, ओकैमल से जावा वर्चुअल मशीन (जेवीएम) का एक कंपाइलर है।
- लिप6 द्वारा विकसित ओकोकपीस, पीआईसी माइक्रोकंट्रोलर के लिए एक ओकैमल कंपाइलर है।
कोड उदाहरण
ओकैमल कोड के स्निपेट को शीर्ष-स्तरीय रीड-ईवल-प्रिंट लूप में दर्ज करके सबसे आसानी से अध्ययन किया जाता है। यह एक इंटरैक्टिव ओकैमल सत्र है जो अनुमानित प्रकार के परिणामी या परिभाषित अभिव्यक्तियों को प्रिंट करता है।[14] ओकैमल शीर्ष-स्तर की प्रारम्भ केवल ओकैमल प्रोग्राम को निष्पादित करके की जाती है:
$ ocaml
Objective Caml version 3.09.0
#
फिर कोड को # प्रॉम्प्ट पर दर्ज किया जा सकता है। उदाहरण के लिए, 1+2*3 की गणना करने के लिए:
# 1 + 2 * 3;;
- : int = 7
ओकैमल अभिव्यक्ति के प्रकार को int (एक शब्द (कंप्यूटर वास्तुकला) |मशीन-प्रिसिजन इंटीजर (कंप्यूटर विज्ञान)) मानता है और परिणाम 7 देता है।
हैलो वर्ल्ड
निम्नलिखित प्रोग्राम hello.ml :
print_endline "Hello World!"
एक बाइटकोड निष्पादन योग्य में संकलित किया जा सकता है:
$ ocamlc hello.ml -o नमस्ते
या एक अनुकूलित देशी-कोड निष्पादन योग्य में संकलित:
$ ocamlopt hello.ml -o नमस्ते
और निष्पादित:
$ ./hello
Hello World!
$
ओकामलक का पहला तर्क, hello.ml, संकलित करने के लिए स्रोत फ़ाइल को निर्दिष्ट करता है और -o hello ध्वज आउटपुट फ़ाइल को निर्दिष्ट करता है।[15]
विकल्प
ओकैमल में विकल्प प्रकार का कंस्ट्रक्टर, हास्केल में शायद प्रकार के समान, किसी दिए गए डेटा प्रकार को या तो दिए गए डेटा प्रकार के कुछ मान को वापस करने के लिए, या कुछ भी नहीं लौटाने के लिए बढ़ाता है।[16] इसका उपयोग यह व्यक्त करने के लिए किया जाता है कि कोई मान मौजूद हो भी सकता है और नहीं भी।
# Some 42;;
- : int option = Some 42
# None;;
- : 'a option = None
यह एक फ़ंक्शन का उदाहरण है जो या तो किसी विकल्प से एक इंट निकालता है, यदि अंदर कोई है, और इसे एक स्ट्रिंग में परिवर्तित करता है, या यदि नहीं, तो एक खाली स्ट्रिंग लौटाता है:
let extract o =
match o with
| Some i -> string_of_int i
| None -> "";;
# extract (Some 42);;
- : string = "42"
# extract None;;
- : string = ""
पूर्णांकों की सूची का सारांश
सूचियाँ ओकैमल में मूलभूत डेटा प्रकारों में से एक हैं। निम्नलिखित कोड उदाहरण एक रिकर्सन (कंप्यूटर विज्ञान) फ़ंक्शन योग को परिभाषित करता है जो एक तर्क, पूर्णांक को स्वीकार करता है, जिसे पूर्णांकों की एक सूची माना जाता है। कीवर्ड नोट करें rec जो दर्शाता है कि फ़ंक्शन पुनरावर्ती है। फ़ंक्शन पूर्णांकों की दी गई सूची को पुनरावर्ती रूप से दोहराता है और तत्वों का योग प्रदान करता है। मैच स्टेटमेंट में सी (प्रोग्रामिंग लैंग्वेज) के कथन बदलें तत्व की समानताएं हैं, हालांकि यह कहीं अधिक सामान्य है।
let rec sum integers = (* Keyword rec means 'recursive'. *)
match integers with
| [] -> 0 (* Yield 0 if integers is the empty
list []. *)
| first :: rest -> first + sum rest;; (* Recursive call if integers is a non-
empty list; first is the first
element of the list, and rest is a
list of the rest of the elements,
possibly []. *)
# sum [1;2;3;4;5];;
- : int = 15
दूसरा तरीका मानक फ़ोल्ड फ़ंक्शन का उपयोग करना है जो सूचियों के साथ काम करता है।
let sum integers =
List.fold_left (fun accumulator x -> accumulator + x) 0 integers;;
# sum [1;2;3;4;5];;
- : int = 15
चूँकि अनाम फ़ंक्शन केवल + ऑपरेटर का अनुप्रयोग है, इसे छोटा किया जा सकता है:
let sum integers =
List.fold_left (+) 0 integers
इसके अलावा, कोई आंशिक एप्लिकेशन का उपयोग करके सूची तर्क को छोड़ सकता है:
let sum =
List.fold_left (+) 0
क्विकसॉर्ट
ओकैमल पुनरावर्ती एल्गोरिदम को संक्षिप्त रूप से व्यक्त करने में सक्षम है। निम्नलिखित कोड उदाहरण जल्दी से सुलझाएं के समान एक एल्गोरिदम लागू करता है जो बढ़ते क्रम में एक सूची को सॉर्ट करता है।
let rec qsort = function
| [] -> []
| pivot :: rest ->
let is_less x = x < pivot in
let left, right = List.partition is_less rest in
qsort left @ [pivot] @ qsort right
या >= ऑपरेटर के आंशिक अनुप्रयोग का उपयोग कर रहे हैं।
let rec qsort = function
| [] -> []
| pivot :: rest ->
let is_less = (>=) pivot in
let left, right = List.partition is_less rest in
qsort left @ [pivot] @ qsort right
बर्थडे समस्या
निम्नलिखित प्रोग्राम एक कमरे में उन लोगों की सबसे छोटी संख्या की गणना करता है जिनके लिए पूरी तरह से अद्वितीय बर्थडे की संभावना 50% से कम है (बर्थडे की समस्या, जहां 1 व्यक्ति के लिए संभावना 365/365 (या 100%) है, 2 के लिए यह है 364/365, 3 के लिए यह 364/365 × 363/365, आदि है) (उत्तर = 23)।
let year_size = 365.
let rec birthday_paradox prob people =
let prob = (year_size -. float people) /. year_size *. prob in
if prob < 0.5 then
Printf.printf "answer = %d\n" (people+1)
else
birthday_paradox prob (people+1)
;;
birthday_paradox 1.0 1
चर्च अंक
निम्नलिखित कोड उत्तराधिकारी (सक्स) और जोड़ (ऐड) के साथ, प्राकृतिक संख्याओं के चर्च एन्कोडिंग को परिभाषित करता है। एक चर्च अंक n एक उच्च-क्रम वाला फ़ंक्शन है जो किसी फ़ंक्शन को स्वीकार करता है f और एक मान x और लागू होता है f को x बिल्कुल n बार. चर्च अंक को एक कार्यात्मक मान से एक स्ट्रिंग में बदलने के लिए, हम इसे एक फ़ंक्शन पास करते हैं जो स्ट्रिंग को जोड़ता है "S" इसके इनपुट और स्थिर स्ट्रिंग के लिए "0".
let zero f x = x
let succ n f x = f (n f x)
let one = succ zero
let two = succ (succ zero)
let add n1 n2 f x = n1 f (n2 f x)
let to_string n = n (fun k -> "S" ^ k) "0"
let _ = to_string (add (succ two) two)
स्वेच्छाचारी-सटीक फैक्टोरियल फ़ंक्शन (लाइब्रेरीज)
ओकैमल से विभिन्न प्रकार की लाइब्रेरियों तक सीधे पहुंचा जा सकता है। उदाहरण के लिए, ओकैमल में स्वेच्छाचारी-सटीक अंकगणित के लिए एक अंतर्निहित लाइब्रेरी है। जैसे-जैसे फैक्टोरियल फ़ंक्शन बहुत तेजी से बढ़ता है, यह मशीन-सटीक संख्याओं (आमतौर पर 32- या 64-बिट्स) को जल्दी से ओवरफ्लो कर देता है। इस प्रकार, फैक्टोरियल स्वेच्छाचारी-सटीक अंकगणित के लिए एक उपयुक्त उम्मीदवार है।
ओकैमल में, Num मॉड्यूल (अब ZArith मॉड्यूल द्वारा प्रतिस्थापित) स्वेच्छाचारी-सटीक अंकगणित प्रदान करता है और इसका उपयोग करके इसे चालू शीर्ष-स्तर में लोड किया जा सकता है:
# #use "topfind";;
# #require "num";;
# open Num;;
फैक्टोरियल फ़ंक्शन को तब स्वेच्छाचारी-सटीक संख्यात्मक ऑपरेटरों का उपयोग करके लिखा जा सकता है =/, */ और -/ :
# let rec fact n =
if n =/ Int 0 then Int 1 else n */ fact(n -/ Int 1);;
val fact : Num.num -> Num.num = <fun>
यह फ़ंक्शन बहुत बड़े फैक्टोरियल की गणना कर सकता है, जैसे 120!:
# string_of_num (fact (Int 120));;
- : string =
"6689502913449127057588118054090372586752746333138029810295671352301633
55724496298936687416527198498130815763789321409055253440858940812185989
8481114389650005964960521256960000000000000000000000000000"
त्रिकोण (ग्राफिक्स)
निम्नलिखित प्रोग्राम ओपनजीएल का उपयोग करके 2डी में एक घूमने वाला त्रिकोण प्रस्तुत करता है:
let () =
ignore (Glut.init Sys.argv);
Glut.initDisplayMode ~double_buffer:true ();
ignore (Glut.createWindow ~title:"OpenGL Demo");
let angle t = 10. *. t *. t in
let render () =
GlClear.clear [ `color ];
GlMat.load_identity ();
GlMat.rotate ~angle: (angle (Sys.time ())) ~z:1. ();
GlDraw.begins `triangles;
List.iter GlDraw.vertex2 [-1., -1.; 0., 1.; 1., -1.];
GlDraw.ends ();
Glut.swapBuffers () in
GlMat.mode `modelview;
Glut.displayFunc ~cb:render;
Glut.idleFunc ~cb:(Some Glut.postRedisplay);
Glut.mainLoop ()
ओपनजीएल के लिए लैबलजीएल बाइंडिंग आवश्यक है। इसके बाद प्रोग्राम को बाइटकोड में संकलित किया जा सकता है:
$ ocamlc -I + lablGL lablग्लूट.cma lablgl.cma Simple.ml -o सरल
या इसके साथ मूल कोड के लिए:
$ ocamlopt -I + lablGL lablग्लूट.cmxa lablgl.cmxa Simple.ml -o सरल
या, अधिक सरलता से, ocamlfind बिल्ड कमांड का उपयोग करना
$ ocamlfind ऑप्ट सिंपल.एमएल -पैकेज लैबलग्ल.ग्लूट -लिंकपीकेजी -ओ सिंपल
और भाग खड़ा हुआ:
$ ./सरल
ओकैमल में कहीं अधिक परिष्कृत, उच्च-प्रदर्शन वाले 2D और 3D ग्राफिकल प्रोग्राम विकसित किए जा सकते हैं। ओपनजीएल और ओकैमल के उपयोग के लिए धन्यवाद, परिणामी प्रोग्राम कई प्रमुख प्लेटफार्मों पर बिना किसी बदलाव के संकलित करके क्रॉस-प्लेटफ़ॉर्म हो सकते हैं।
फाइबोनैचि अनुक्रम
निम्नलिखित कोड इनपुट किए गए किसी संख्या n की फाइबोनैचि संख्या की गणना करता है। यह टेल रिकर्सन और पैटर्न मिलान का उपयोग करता है।
let fib n =
let rec fib_aux m a b =
match m with
| 0 -> a
| _ -> fib_aux (m - 1) b (a + b)
in fib_aux n 0 1
उच्च-क्रम के कार्य
फ़ंक्शंस इनपुट के रूप में फ़ंक्शंस ले सकते हैं और परिणाम के रूप में रिटर्न फ़ंक्शंस ले सकते हैं। उदाहरण के लिए, किसी फ़ंक्शन f पर दो बार लागू करने से एक फ़ंक्शन प्राप्त होता है जो f को उसके तर्क पर दो बार लागू करता है।
let twice (f : 'a -> 'a) = fun (x : 'a) -> f (f x);;
let inc (x : int) : int = x + 1;;
let add2 = twice inc;;
let inc_str (x : string) : string = x ^ " " ^ x;;
let add_str = twice(inc_str);;
<सिंटैक्सहाइलाइट लैंग = ओकैमल हाइलाइट= 1,3 >
# add2 98;; - : पूर्णांक = 100 # add_str टेस्ट ;; - : स्ट्रिंग = टेस्ट टेस्ट टेस्ट टेस्ट
फ़ंक्शन दो बार टाइप वेरिएबल 'a' का उपयोग यह इंगित करने के लिए करता है कि इसे केवल int->int फ़ंक्शंस के बजाय किसी भी फ़ंक्शन f मैपिंग पर टाइप 'a' से लागू किया जा सकता है। विशेष रूप से, दो बार स्वयं पर भी लागू किया जा सकता है।
# मान लीजिए चार गुना f = (दो बार दो बार) f;;
वैल चार बार : ('ए -> 'ए) -> 'ए -> 'ए = <मजेदार>
# चलो add4 = चार गुना inc;;
वैल ऐड4 : int -> int = <fun>
# add4 98;;
- : पूर्णांक = 102
</सिंटैक्सहाइलाइट>
व्युत्पन्न लैंग्वेजएँ
मेटा (Meta) ओकैमल
मेटा ओकैमल[17] ओकैमल का एक मल्टी-स्टेज प्रोग्रामिंग एक्सटेंशन है जो रनटाइम के दौरान नए मशीन कोड के वृद्धिशील संकलन को सक्षम बनाता है। कुछ परिस्थितियों में, मल्टीस्टेज प्रोग्रामिंग का उपयोग करके महत्वपूर्ण स्पीडअप संभव है, क्योंकि संसाधित किए जाने वाले डेटा के बारे में अधिक विस्तृत जानकारी नियमित संकलन समय की तुलना में रनटाइम पर उपलब्ध होती है, इसलिए वृद्धिशील कंपाइलर स्थिति जांच आदि के कई मामलों को अनुकूलित कर सकता है।
उदाहरण के तौर पर: यदि संकलन के समय यह ज्ञात हो कि कुछ घातांक x -> x^n की प्रायः आवश्यकता होती है, लेकिन इसका मूल्य n केवल रनटाइम पर ही ज्ञात होता है, मेटा ओकैमल में दो-चरण पावर फ़ंक्शन का उपयोग किया जा सकता है:
let rec power n x =
if n = 0
then .<1>.
else
if even n
then sqr (power (n/2) x)
else .<.~x *. .~(power (n - 1) x)>.
अस सून अस n रनटाइम पर ज्ञात है, एक विशेष और बहुत तेज़ पावर फ़ंक्शन बनाया जा सकता है:
.<fun x -> .~(power 5 .<x>.)>.
परिणाम है:
fun x_1 -> (x_1 *
let y_3 =
let y_2 = (x_1 * 1)
in (y_2 * y_2)
in (y_3 * y_3))
नया फ़ंक्शन स्वचालित रूप से संकलित होता है.
अन्य व्युत्पन्न लैंग्वेजएँ
- एटमकैमल कोड के परमाणु (लेन-देन संबंधी) निष्पादन के लिए एक सिंक्रोनाइज़ेशन प्रिमिटिव प्रदान करता है।
- एमिली (2006) ओकैमल 3.08 का एक उपसमुच्चय है जो ऑब्जेक्ट-क्षमता मॉडल क्षमता-आधारित सुरक्षा सिद्धांतों को लागू करने के लिए एक डिज़ाइन नियम सत्यापनकर्ता का उपयोग करता है।
- F शार्प (प्रोग्रामिंग लैंग्वेज)|F# ओकैमल पर आधारित एक .NET फ्रेमवर्क लैंग्वेज है।
- ताजा ओकैमल नामों और बाइंडरों में हेरफेर करने की सुविधा देता है।
- जीकैमल ओकैमल में विस्तारित बहुरूपता जोड़ता है, इस प्रकार ओवरलोडिंग और टाइप-सुरक्षित मार्शलिंग की अनुमति देता है।
- जोकैमल समवर्ती और वितरित कार्यक्रमों के विकास के लिए निर्माणों को एकीकृत करता है।
- ओकैमल ड्यूस एक्सएमएलL एक्सप्रेशन और रेगुर-एक्सप्रेशन प्रकार जैसी सुविधाओं के साथ ओकैमल का विस्तार करता है।
- ओकैमलP3l ओकैमल और P3L लैंग्वेज पर आधारित एक समानांतर प्रोग्रामिंग प्रणाली है।
- रीज़न (प्रोग्रामिंग लैंग्वेज) फेसबुक पर बनाई गई ओकैमल के लिए एक वैकल्पिक ओकैमल सिंटैक्स (प्रोग्रामिंग लैंग्वेजएं) और टूलचेन है, जो मूल कोड और जावास्क्रिप्ट दोनों को संकलित कर सकता है।
- रीस्क्रिप्ट (प्रोग्रामिंग लैंग्वेज) रीज़न/बकलस्क्रिप्ट टूलचेन से एक रीब्रांडिंग और नई लैंग्वेज है, जिसका सिंटैक्स अलग है और केवल जावास्क्रिप्ट में संकलित होता है।
ओकैमल में लिखा गया सॉफ्टवेयर
- शून्य स्थापना, एक मल्टी-प्लेटफॉर्म पैकेज मैनेजर।
- कैमलपीडीएफ, पीडीएफ फाइलों को पढ़ने, लिखने और संशोधित करने के लिए एक ओकैमल लाइब्रेरी[18]
- कोकिनेले (सॉफ्टवेयर), सी (प्रोग्रामिंग लैंग्वेज) प्रोग्राम के स्रोत कोड को बदलने के लिए एक उपयोगिता।
- कॉक, एक औपचारिक प्रमाण प्रबंधन प्रणाली।
- एफएफटीडब्ल्यू, असतत फूरियर परिवर्तनों की गणना के लिए एक लाइब्रेरीज (कंप्यूटिंग)। नाम के ओकैमल प्रोग्राम द्वारा कई C रूटीन तैयार किए गए हैं
genfft. - फेसबुक मैसेंजर का वेब संस्करण।[19]
- फ्लो, फेसबुक पर बनाया गया एक स्थिर प्रोग्राम विश्लेषण जो टाइप सिस्टम जावास्क्रिप्ट के लिए स्टेटिक प्रकार की जांच का अनुमान लगाता है और जांचता है।[20]
- आउल वैज्ञानिक कंप्यूटिंग, वैज्ञानिक और इंजीनियरिंग कंप्यूटिंग के लिए एक समर्पित प्रणाली।
- फ्रामा- C, C कार्यक्रमों के विश्लेषण के लिए एक रूपरेखा।
- जीनवेब, मुफ़्त और ओपन-सोर्स मल्टी-प्लेटफ़ॉर्म वंशावली सॉफ़्टवेयर।
- फेसबुक पर बनाया गया हैक (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज कंपाइलर, स्थिर प्रकारों के साथ पीएचपी का विस्तार करता है।
- हेक्से प्रोग्रामिंग लैंग्वेज कंपाइलर।
- एचओएल लाइट, एक औपचारिक प्रमाण सहायक।
- इनफ़र, जावा (प्रोग्रामिंग लैंग्वेज), सी, सी++ और उद्देश्य सी के लिए फेसबुक पर बनाया गया एक स्थिर विश्लेषक है, जिसका उपयोग आईओएस और एंड्रॉइड (ऑपरेटिंग सिस्टम) ऐप्स में बग का पता लगाने के लिए किया जाता है।[21]
- लेक्सिफ़ी एप्रोपोस, जटिल डेरिवेटिव मॉडलिंग के लिए एक प्रणाली।
- मिराजओएस, शुद्ध ओकैमल में लिखा गया एक यूनिकर्नेल प्रोग्रामिंग फ्रेमवर्क।
- एमएलडोंकी, इडोंकी नेटवर्क पर आधारित एक पीयर-टू-पीयर फ़ाइल साझाकरण एप्लिकेशन।
- ओसीजन, एक ओकैमल वेब ढाँचा ।
- ओपा (प्रोग्रामिंग लैंग्वेज), वेब विकास के लिए एक स्वतंत्र और ओपन-सोर्स प्रोग्रामिंग लैंग्वेज।
- पायर-चेक, फेसबुक पर पायथन (प्रोग्रामिंग लैंग्वेज) के लिए एक प्रकार का चेकर बनाया गया।[22]
- सेमग्रेप, एक बग-फाइंडिंग टूल जो कई प्रोग्रामिंग लैंग्वेज का समर्थन करता है।
- तेज़ोस, एक स्व-संशोधित स्मार्ट अनुबंध प्लेटफ़ॉर्म जो एक्सटीजेड को मूल मुद्रा के रूप में उपयोग करता है।
- Unison, दो निर्देशिकाओं के बीच फ़ाइलों को सिंक्रनाइज़ करने के लिए एक फ़ाइल सिंक्रनाइज़ेशन प्रोग्राम।
- वेबअसेंबली के लिए संदर्भ दुभाषिया, वेब ब्राउज़र के अंदर निष्पादन के लिए एक निम्न-स्तरीय बाइटकोड।[23]
- [[एक्सईएन क्लाउड प्लेटफ़ॉर्म]] (एक्ससीपी), ज़ेन सूत्र के लिए एक टर्नकी वर्चुअलाइजेशन समाधान।
उपयोगकर्ता
कई दर्जन कंपनियाँ कुछ हद तक ओकैमल का उपयोग करती हैं।[24] उल्लेखनीय उदाहरणों में सम्मिलित हैं:
- ब्लूमबर्ग एल.पी., जिसने जावास्क्रिप्ट को लक्षित करने वाला एक ओकैमल कंपाइलर बैकएंड BuckleScript बनाया।[25]
- सिट्रिक्स सिस्टम्स, जो सिट्रिक्स सिस्टम#नेटवर्किंग और क्लाउड में ओकैमल का उपयोग करता है (2018 के दौरान सिट्रिक्स हाइपरवाइज़र के रूप में पुनः ब्रांडेड)।
- फेसबुक, जिसने ओकैमल में फ्लो, हैक, इनफर, पीएफएफ और रीज़न विकसित किया।
- जेन स्ट्रीट कैपिटल, एक मालिकाना व्यापारिक फर्म, जिसने अपने प्रारम्भी दिनों में ओकैमल को अपनी पसंदीदा लैंग्वेज के रूप में अपनाया।[26]
संदर्भ
- ↑ "Modules". Retrieved 22 February 2020.
- ↑ "ओकैमल का इतिहास". Retrieved 24 December 2016.
- ↑ Linux Weekly News.
- ↑ "ए जे मिलनर - ए.एम. ट्यूरिंग पुरस्कार विजेता". amturing.acm.org. Retrieved 2022-10-06.
- ↑ 5.0 5.1 al., Michael Clarkson et. "1.2. OCaml · Functional Programming in OCaml". courses.cs.cornell.edu. Retrieved 2022-10-06.
- ↑ 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 "प्रस्तावना - वास्तविक दुनिया ओकैमल". dev.realworldocaml.org. Retrieved 2022-10-06.
- ↑ 7.0 7.1 7.2 7.3 7.4 7.5 7.6 "A History of OCaml – OCaml". v2.ocaml.org. Retrieved 2022-10-07.
- ↑ "Release of OCaml 5.0.0 OCaml Package". OCaml (in English). Retrieved 2022-12-16.
- ↑ "क्रिस्टल प्रोजेक्ट". cristal.inria.fr. Retrieved 2022-10-07.
- ↑ "गैलियम टीम - होम". gallium.inria.fr. Retrieved 2022-10-07.
- ↑ "घर". cambium.inria.fr (in English). Retrieved 2022-10-07.
- ↑ "ocaml/asmcomp at trunk · ocaml/ocaml · GitHub". GitHub. Retrieved 2 May 2015.
- ↑ A domain is a unit of parallelism in OCaml, a domain usually corresponds to a CPU core
- ↑ "OCaml - टॉपलेवल सिस्टम या REPL (ocaml)". ocaml.org. Retrieved 2021-05-17.
- ↑ "OCaml - Batch compilation (Ocamlc)".
- ↑ "3.7. Options — OCaml Programming: Correct + Efficient + Beautiful". cs3110.github.io. Retrieved 2022-10-07.
- ↑ oleg-at-okmij.org. "बीईआर मेटाओकैमल". okmij.org.
- ↑ "GitHub - johnwhitington/camlpdf". GitHub. 14 December 2022.
- ↑ "Messenger.com Now 50% Converted to Reason · Reason". reasonml.github.io. Retrieved 2018-02-27.
- ↑ "Flow: A Static Type Checker for JavaScript". Flow.
- ↑ "स्थैतिक विश्लेषक का अनुमान लगाएं". Infer.
- ↑ "GitHub - facebook/pyre-check: Performant type-checking for python". 9 February 2019 – via GitHub.
- ↑ "WebAssembly/spec: WebAssembly specification, reference interpreter, and test suite". World Wide Web Consortium. 5 December 2019. Retrieved 2021-05-14 – via GitHub.
- ↑ "OCaml का उपयोग करने वाली कंपनियाँ". OCaml.org. Retrieved 2021-05-14.
- ↑ "BuckleScript: The 1.0 release has arrived! | Tech at Bloomberg". Tech at Bloomberg. 8 September 2016. Retrieved 21 May 2017.
- ↑ Yaron Minsky (1 November 2011). "जनता के लिए OCaml". Retrieved 2 May 2015.