ओकैमल
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 | |
|
ओकैमल (/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 ओकैमल के लिए एक कंपोज़ेबल बिल्ड-सिस्टम है।
- ओकैमलformat ओकैमल के लिए एक ऑटो-फॉर्मेटर है।
- ocaml-lsp-server ओकैमल एकीकृत विकास पर्यावरण एकीकरण के लिए एक भाषा सर्वर प्रोटोकॉल है।
- वेब साइटें:
- ओकैमल.org भाषा के लिए प्राथमिक साइट है।
- चर्चा.ocaml.org प्रवचन (सॉफ्टवेयर) का एक उदाहरण है जो ओकैमल के लिए प्राथमिक चर्चा साइट के रूप में कार्य करता है।
- watch.ocaml.org PeerTube का एक उदाहरण है जो ओकैमल विषयों के बारे में वीडियो होस्ट करता है।
- ओकैमल के लिए वैकल्पिक कंपाइलर:
- js_of_ocaml, Ocsigen टीम द्वारा विकसित, ओकैमल से जावास्क्रिप्ट के लिए एक अनुकूलन कंपाइलर है।
- 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 ()
OpenGL के लिए LablGL बाइंडिंग आवश्यक है। इसके बाद प्रोग्राम को बाइटकोड में संकलित किया जा सकता है:
$ ocamlc -I + lablGL lablग्लूट.cma lablgl.cma Simple.ml -o सरल
या इसके साथ मूल कोड के लिए:
$ ocamlopt -I + lablGL lablग्लूट.cmxa lablgl.cmxa Simple.ml -o सरल
या, अधिक सरलता से, ocamlfind बिल्ड कमांड का उपयोग करना
$ ocamlfind ऑप्ट सिंपल.एमएल -पैकेज लैबलग्ल.ग्लूट -लिंकपीकेजी -ओ सिंपल
और भाग खड़ा हुआ:
$ ./सरल
ओकैमल में कहीं अधिक परिष्कृत, उच्च-प्रदर्शन वाले 2D और 3D ग्राफिकल प्रोग्राम विकसित किए जा सकते हैं। OpenGL और ओकैमल के उपयोग के लिए धन्यवाद, परिणामी प्रोग्राम कई प्रमुख प्लेटफार्मों पर बिना किसी बदलाव के संकलित करके क्रॉस-प्लेटफ़ॉर्म हो सकते हैं।
फाइबोनैचि अनुक्रम
निम्नलिखित कोड इनपुट किए गए किसी संख्या 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 फ्रेमवर्क भाषा है।
- ताजा ओकैमल नामों और बाइंडरों में हेरफेर करने की सुविधा देता है।
- GCaml ओकैमल में विस्तारित बहुरूपता जोड़ता है, इस प्रकार ओवरलोडिंग और टाइप-सुरक्षित मार्शलिंग की अनुमति देता है।
- JoCaml समवर्ती और वितरित कार्यक्रमों के विकास के लिए निर्माणों को एकीकृत करता है।
- ओकैमलDuce XML एक्सप्रेशन और रेगुलर-एक्सप्रेशन प्रकार जैसी सुविधाओं के साथ ओकैमल का विस्तार करता है।
- ओकैमलP3l ओकैमल और P3L भाषा पर आधारित एक समानांतर प्रोग्रामिंग प्रणाली है।
- रीज़न (प्रोग्रामिंग भाषा) फेसबुक पर बनाई गई ओकैमल के लिए एक वैकल्पिक ओकैमल सिंटैक्स (प्रोग्रामिंग भाषाएं) और टूलचेन है, जो मूल कोड और जावास्क्रिप्ट दोनों को संकलित कर सकता है।
- रीस्क्रिप्ट (प्रोग्रामिंग भाषा) रीज़न/बकलस्क्रिप्ट टूलचेन से एक रीब्रांडिंग और नई भाषा है, जिसका सिंटैक्स अलग है और केवल जावास्क्रिप्ट में संकलित होता है।
ओकैमल में लिखा गया सॉफ्टवेयर
- शून्य स्थापना, एक मल्टी-प्लेटफॉर्म पैकेज मैनेजर।
- कैमलपीडीएफ, पीडीएफ फाइलों को पढ़ने, लिखने और संशोधित करने के लिए एक ओकैमल लाइब्रेरी[18]
- कोकिनेले (सॉफ्टवेयर), सी (प्रोग्रामिंग भाषा) प्रोग्राम के स्रोत कोड को बदलने के लिए एक उपयोगिता।
- कॉक, एक औपचारिक प्रमाण प्रबंधन प्रणाली।
- एफएफटीडब्ल्यू, असतत फूरियर परिवर्तनों की गणना के लिए एक पुस्तकालय (कंप्यूटिंग)। नाम के ओकैमल प्रोग्राम द्वारा कई C रूटीन तैयार किए गए हैं
genfft
. - फेसबुक मैसेंजर का वेब संस्करण।[19]
- फ्लो, फेसबुक पर बनाया गया एक स्थिर प्रोग्राम विश्लेषण जो टाइप सिस्टम जावास्क्रिप्ट के लिए स्टेटिक प्रकार की जांच का अनुमान लगाता है और जांचता है।[20]
- आउल वैज्ञानिक कंप्यूटिंग, वैज्ञानिक और इंजीनियरिंग कंप्यूटिंग के लिए एक समर्पित प्रणाली।
- फ्रामा- C, C कार्यक्रमों के विश्लेषण के लिए एक रूपरेखा।
- जीनवेब, मुफ़्त और ओपन-सोर्स मल्टी-प्लेटफ़ॉर्म वंशावली सॉफ़्टवेयर।
- फेसबुक पर बनाया गया हैक (प्रोग्रामिंग भाषा) प्रोग्रामिंग लैंग्वेज कंपाइलर, स्थिर प्रकारों के साथ पीएचपी का विस्तार करता है।
- हेक्से प्रोग्रामिंग भाषा कंपाइलर।
- एचओएल लाइट, एक औपचारिक प्रमाण सहायक।
- इनफ़र, जावा (प्रोग्रामिंग भाषा), सी, सी++ और उद्देश्य सी के लिए फेसबुक पर बनाया गया एक स्थिर विश्लेषक है, जिसका उपयोग आईओएस और एंड्रॉइड (ऑपरेटिंग सिस्टम) ऐप्स में बग का पता लगाने के लिए किया जाता है।[21]
- लेक्सिफ़ी एप्रोपोस, जटिल डेरिवेटिव मॉडलिंग के लिए एक प्रणाली।
- मिराजओएस, शुद्ध ओकैमल में लिखा गया एक यूनिकर्नेल प्रोग्रामिंग फ्रेमवर्क।
- एमएलडोंकी, इडोंकी नेटवर्क पर आधारित एक पीयर-टू-पीयर फ़ाइल साझाकरण एप्लिकेशन।
- Ocsigen, एक ओकैमल वेब ढाँचा ।
- ओपा (प्रोग्रामिंग भाषा), वेब विकास के लिए एक स्वतंत्र और ओपन-सोर्स प्रोग्रामिंग भाषा।
- पायर-चेक, फेसबुक पर पायथन (प्रोग्रामिंग भाषा) के लिए एक प्रकार का चेकर बनाया गया।[22]
- सेमग्रेप, एक बग-फाइंडिंग टूल जो कई प्रोग्रामिंग भाषाओं का समर्थन करता है।
- Tezos, एक स्व-संशोधित स्मार्ट अनुबंध प्लेटफ़ॉर्म जो XTZ को मूल मुद्रा के रूप में उपयोग करता है।
- Unison, दो निर्देशिकाओं के बीच फ़ाइलों को सिंक्रनाइज़ करने के लिए एक फ़ाइल सिंक्रनाइज़ेशन प्रोग्राम।
- WebAssembly के लिए संदर्भ दुभाषिया, वेब ब्राउज़र के अंदर निष्पादन के लिए एक निम्न-स्तरीय बाइटकोड।[23]
- [[एक्सईएन क्लाउड प्लेटफ़ॉर्म]] (एक्ससीपी), ज़ेन सूत्र के लिए एक टर्नकी वर्चुअलाइजेशन समाधान।
उपयोगकर्ता
कई दर्जन कंपनियाँ कुछ हद तक ओकैमल का उपयोग करती हैं।[24] उल्लेखनीय उदाहरणों में सम्मिलित हैं:
- ब्लूमबर्ग एल.पी., जिसने जावास्क्रिप्ट को लक्षित करने वाला एक ओकैमल कंपाइलर बैकएंड BuckleScript बनाया।[25]
- Citrix Systems, जो Citrix Systems#Networking और क्लाउड में ओकैमल का उपयोग करता है (2018 के दौरान Citrix हाइपरवाइज़र के रूप में पुनः ब्रांडेड)।
- फेसबुक, जिसने ओकैमल में फ्लो, हैक, इनफर, पीएफएफ और रीज़न विकसित किया।
- जेन स्ट्रीट कैपिटल, एक मालिकाना व्यापारिक फर्म, जिसने अपने प्रारम्भी दिनों में ओकैमल को अपनी पसंदीदा भाषा के रूप में अपनाया।[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.