ओज (प्रोग्रामिंग भाषा)

ओज एक बहु-प्रतिमान प्रोग्रामिंग भाषा है, जिसे प्रोग्रामिंग भाषा शिक्षा के लिए यूनिवर्सिटी कैथोलिक डी लोवेन में प्रोग्रामिंग सिस्टम लैब में विकसित किया गया है। इसकी एक प्रामाणिक पाठ्यपुस्तक कंप्यूटर प्रोग्रामिंग की अवधारणा, तकनीक और मॉडल है।

ओज को पहली बार 1991 में गर्ट स्मोल्का और उनके छात्रों द्वारा डिजाइन किया गया था। 1996 में, ओज का विकास स्वीडिश इंस्टीट्यूट ऑफ कंप्यूटर साइंस में सेफ हरीदी और पीटर वान रॉय के अनुसंधान समूह के सहयोग से जारी रहा। 1999 के बाद से, ओज को एक अंतरराष्ट्रीय समूह, मोजार्ट कंसोर्टियम द्वारा लगातार विकसित किया गया है, जिसमें मूल रूप से सारलैंड विश्वविद्यालय, स्वीडिश इंस्टीट्यूट ऑफ कंप्यूटर साइंस और यूनिवर्सिटी कैथोलिक डी लौवेन सम्मिलित थे। 2005 में, मोजार्ट विकास के प्रबंधन की जिम्मेदारी मोजार्ट विकास को एक बड़े समुदाय के लिए खोलने के व्यक्त उद्देश्य के साथ एक कोर ग्रुप, मोजार्ट बोर्ड को स्थानांतरित कर दी गई थी।

मोज़ार्ट प्रोग्रामिंग सिस्टम ओज का प्राथमिक कार्यान्वयन है। इसे मोजार्ट कंसोर्टियम द्वारा एक ओपन सोर्स लाइसेंस के साथ जारी किया गया है। मोजार्ट को यूनिक्स, फ्रीबीएसडी, लिनक्स, विंडोज और मैकओएस पर पोर्ट किया गया है।

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

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

डेटा संरचना
ओज एक कोर भाषा पर आधारित है जिसमें बहुत कम संख्या में डेटा प्रकार होते हैं जिन्हें सिंटैक्टिक शुगर के माध्यम से अधिक व्यावहारिक में बढ़ाया जा सकता है।

मूल डेटा संरचनाएँ: वे डेटा संरचनाएं मान (स्थिर), प्रथम श्रेणी की वस्तु और गतिशील टाइपिंग हैं। ओज में परिवर्तनीय नाम उन्हें शाब्दिक (कंप्यूटर प्रोग्रामिंग) से अलग करने के लिए एक बड़े अक्षर से प्रारम्भ होते हैं जो हमेशा छोटे अक्षर से प्रारम्भ होता है।
 * संख्याएँ: फ़्लोटिंग पॉइंट या पूर्णांक (वास्तविक पूर्णांक)
 * रिकॉर्ड्स: डेटा को समूहीकृत करने के लिए:  यहाँ पद x, y, त्रिज्या आदि को विशेषताएँ कहा जाता है और सुविधाओं से संबद्ध डेटा (इस स्थिति में 0,1,3 आदि) मान हैं।
 * टुपल्स: आरोही क्रम में पूर्णांक विशेषताओं वाले रिकॉर्ड:.
 * सूची: एक सरल रैखिक संरचना

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

उच्च क्रम प्रोग्रामिंग
फंक्शन्स अन्य ओज ऑब्जेक्ट्स की तरह हैं। एक फ़ंक्शन को अन्य फ़ंक्शंस की विशेषता के रूप में पास किया जा सकता है या किसी फ़ंक्शन में लौटाया जा सकता है।

एनोनिमस फंक्शन
कई अन्य कार्यात्मक भाषाओं की तरह, ओज उच्च क्रम प्रोग्रामिंग के साथ अज्ञात कार्यों (अर्थात् ऐसे कार्य जिनके नाम नहीं हैं) के उपयोग का समर्थन करता है। इनको दर्शाने के लिए प्रतीक $ का प्रयोग किया जाता है।

निम्नलिखित में, स्क्वायर फ़ंक्शन को अज्ञात रूप से परिभाषित किया गया है और पास किया गया है, जिससे ब्राउज़ किया जा सकता है। चूंकि एनोनिमस फंक्शन के नाम नहीं हैं, इसलिए पुनरावर्ती अज्ञात कार्यों को परिभाषित करना संभव नहीं है।

प्रक्रियाएं
ओज में फ़ंक्शंस को इसके निष्पादन के दौरान फ़ंक्शन के शरीर में आने वाले अंतिम कथन पर मान वापस करना चाहिए। नीचे दिए गए उदाहरण में, यदि X > 0 और -5 है तो फ़ंक्शन Ret 5 लौटाता है। लेकिन ओज भी एक सुविधा प्रदान करता है यदि कोई फ़ंक्शन मान वापस नहीं करना चाहिए। ऐसे कार्यों को प्रक्रिया कहा जाता है। निर्माण "प्रो" का उपयोग करते हुए प्रक्रियाओं को निम्नानुसार परिभाषित किया गया है। उपरोक्त उदाहरण कोई मान नहीं देता है, यह केवल X के चिह्न के आधार पर Oz (ओज) ब्राउज़र में 5 या -5 प्रिंट करता है।

डेटा प्रवाह चर और घोषणात्मक समरूपता
जब प्रोग्राम एक अनबाउंड वेरिएबल का सामना करता है तो यह एक मान की प्रतीक्षा करता है। उदाहरण के लिए, नीचे, थ्रेड तब तक प्रतीक्षा करेगा जब तक कि X और Y दोनों Z का मान दिखाने से पहले किसी मान से बंधे न हों। बार बाउंड होने के बाद डेटाफ़्लो वैरिएबल का मान बदला नहीं जा सकता: डेटा प्रवाह (डेटाफ्लो) चर समवर्ती स्ट्रीम एजेंट बनाना आसान बनाते हैं:

जिस तरह से डेटाफ्लो वैरिएबल काम करते हैं, उसके कारण प्रोग्राम में कहीं भी थ्रेड्स डालना संभव है और गारंटी है कि इसका परिणाम समान होगा। इससे समवर्ती प्रोग्रामिंग बहुत आसान हो जाती है। थ्रेड्स बहुत सस्ते होते हैं: एक साथ 100,000 थ्रेड्स चलाना संभव है।

उदाहरण: ट्रायल डिवीजन सीव
यह उदाहरण गैर-अभाज्य संख्याओं को फ़िल्टर करने वाले समवर्ती स्ट्रीम एजेंटों को पुनरावर्ती रूप से बनाकर ट्रायल डिवीजन एल्गोरिथ्म का उपयोग करके प्राइम नंबरों की एक धारा की गणना करता है:

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

मैसेज पासिंग कॉन्कररेन्सी (संदेश पासिंग समवर्ती)
घोषणात्मक समवर्ती (डेक्लेरेटिवे कंकररेंट ) मॉडल को सरल शब्दार्थ के माध्यम से पारित संदेश के साथ बढ़ाया जा सकता है: पोर्ट और एक थ्रेड के साथ, अतुल्यकालिक एजेंटों को परिभाषित किया जा सकता है:

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

निष्पादन की गति
मोजार्ट कंपाइलर (संस्करण 1.4.0 ओज 3 को लागू करने) द्वारा निर्मित एक प्रोग्राम की निष्पादन गति बहुत धीमी है। 2012 के बेंचमार्क के सेट पर यह C भाषा के लिए जीएनयू कंपाइलर कलेक्शन (जीसीसी) की तुलना में लगभग 50 गुना धीमा था।

यह भी देखें

 * ऐलिस (प्रोग्रामिंग भाषा), सारलैंड यूनिवर्सिटी से समवर्ती कार्यात्मक कन्सट्रैन्ट लैंग्वेज
 * डेटाफ्लो प्रोग्रामिंग
 * फंक्शनल लॉजिक प्रोग्रामिंग लैंग्वेज
 * करी (प्रोग्रामिंग भाषा)
 * मर्करी (प्रोग्रामिंग भाषा)
 * विजुअल प्रोलॉग, वस्तु-उन्मुख, कार्यात्मक, तर्क भाषा

संदर्भ

 * Peter Van Roy and Seif Haridi (2004). Concepts, Techniques, and Models of Computer Programming.  MIT Press.  There is online supporting material for this book.  The book, an introduction to the principles of programming languages, uses Oz as its preferred idiom for examples.

बाहरी संबंध

 * Tutorial of Oz
 * Programming Language Research at UCL: One of the core developers of Mozart/Oz, this group does research using Mozart/Oz as the vehicle
 * Multiparadigm Programming in Mozart/Oz: Proceedings of MOZ 2004: Conference which gives a snapshot of the work being done with Mozart/Oz
 * Programming in Oz
 * Oz Basics
 * Oz Basics