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

From Vigyanwiki

ओज
Paradigmमल्टी-पैराडाइम: लॉजिक, फंक्शनल, अनिवार्य, ऑब्जेक्ट- उन्मुख, बाधा, वितरित, समवर्ती
द्वारा डिज़ाइन किया गयागर्ट स्मोल्का, उनके छात्र
Developerमोजार्ट कंसोर्टियम
Stable release
ओज 1.4.0 (अंतिम), मोजार्ट 2.0.1 / Template:प्रारंभ तिथि और उम्र
टाइपिंग अनुशासनडाइनैमिक
लाइसेंसMIT X11[1]
वेबसाइटmozart.github.io
Major implementations
मोजार्ट प्रोग्रामिंग सिस्टम
Dialects
ओज, मोजार्ट
Influenced by
एरलांग, लिस्प, प्रोलॉग
Influenced
एलिस, स्कैला

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

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

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

भाषा सुविधाएँ

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

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

भाषा अवलोकन

डेटा संरचना

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

मूल डेटा संरचनाएँ:

  • संख्याएँ: फ़्लोटिंग पॉइंट या पूर्णांक (वास्तविक पूर्णांक)
  • रिकॉर्ड्स: डेटा को समूहीकृत करने के लिए: circle(x:0 y:1 radius:3 color:blue style:dots) यहाँ पद x, y, त्रिज्या आदि को विशेषताएँ कहा जाता है और सुविधाओं से संबद्ध डेटा (इस स्थिति में 0,1,3 आदि) मान हैं।
  • टुपल्स: आरोही क्रम में पूर्णांक विशेषताओं वाले रिकॉर्ड: circle(1:0 2:1 3:3 4:blue 5:dots) .
  • सूची: एक सरल रैखिक संरचना
'|'(2 '|'(4 '|'(6 '|'(8 nil)))) % as a record.
2|(4|(6|(8|nil))) % with some syntactic sugar
2|4|6|8|nil % more syntactic sugar
[2 4 6 8] % even more syntactic sugar

वे डेटा संरचनाएं मान (स्थिर), प्रथम श्रेणी की वस्तु और गतिशील टाइपिंग हैं। ओज में परिवर्तनीय नाम उन्हें शाब्दिक (कंप्यूटर प्रोग्रामिंग) से अलग करने के लिए एक बड़े अक्षर से प्रारम्भ होते हैं[4] जो हमेशा छोटे अक्षर से प्रारम्भ होता है।

फ़ंक्शन

फंक्शन्स [5] प्रथम श्रेणी के मूल्य हैं, जो उच्च क्रम कार्यात्मक प्रोग्रामिंग की अनुमति देते हैं:

fun {Fact N}
   if N =< 0 then 1 else N*{Fact N-1} end
end
fun {Comb N K}
   {Fact N} div ({Fact K} * {Fact N-K}) % integers can't overflow in Oz (unless no memory is left)
end

fun {SumList List}
   case List of nil then 0
   [] H|T then H+{SumList T} % pattern matching on lists
   end
end

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

उच्च क्रम प्रोग्रामिंग

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

fun {Square N}  % A general function
   N*N
end

fun {Map F Xs}  % F is a function here - higher order programming
   case Xs
      of nil then nil
      [] X|Xr then {F X}|{Map F Xr}
   end
end

%usage
{Browse {Map Square [1 2 3]}}  %browses [1 4 9]

एनोनिमस फंक्शन

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

निम्नलिखित में, स्क्वायर फ़ंक्शन को अज्ञात रूप से परिभाषित किया गया है और पास किया गया है, जिससे[1 4 9] ब्राउज़ किया जा सकता है।

{Browse {Map fun {$ N} N*N end [1 2 3]}}

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

प्रक्रियाएं

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

declare
fun {Ret X}
   if X > 0 then 5 else ~5 end
end

लेकिन ओज भी एक सुविधा प्रदान करता है यदि कोई फ़ंक्शन मान वापस नहीं करना चाहिए। ऐसे कार्यों को प्रक्रिया कहा जाता है।[7] निर्माण "प्रो" का उपयोग करते हुए प्रक्रियाओं को निम्नानुसार परिभाषित किया गया है।

declare
proc {Ret X}
   if X > 0 then {Browse 5} else {Browse ~5} end
end

उपरोक्त उदाहरण कोई मान नहीं देता है, यह केवल X के चिह्न के आधार पर Oz (ओज) ब्राउज़र में 5 या -5 प्रिंट करता है।

डेटा प्रवाह चर और घोषणात्मक समरूपता

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

thread 
   Z = X+Y
   {Browse Z}
end
thread X = 40 end
thread Y = 2 end

बार बाउंड होने के बाद डेटाफ़्लो वैरिएबल का मान बदला नहीं जा सकता:

X = 1
X = 2 % error

डेटा प्रवाह (डेटाफ्लो) चर समवर्ती स्ट्रीम एजेंट बनाना आसान बनाते हैं:

fun {Ints N Max}
   if N == Max then nil
   else 
      {Delay 1000}
      N|{Ints N+1 Max}
   end
end

fun {Sum S Stream}
   case Stream
      of nil then S
      [] H|T then S|{Sum H+S T}
   end
end

local X Y in
   thread X = {Ints 0 1000} end
   thread Y = {Sum 0 X} end
   {Browse Y}
end

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

उदाहरण: ट्रायल डिवीजन सीव

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

fun {Sieve Xs}
   case Xs of nil then nil
   [] X|Xr then Ys in
      thread Ys = {Filter Xr fun {$ Y} Y mod X \= 0 end} end
      X|{Sieve Ys}
   end
end

लेजिनेस

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

fun lazy {Fact N}
   if N =< 0 then 1 else N*{Fact N-1} end
end
local X Y in
  X = {Fact 100} 
  Y = X + 1
end

लेजी मूल्यांकन ओज में वास्तव में अनंत डेटा संरचनाओं को संग्रहीत करने की संभावना देता है। लेजी मूल्यांकन की शक्ति को निम्नलिखित कोड नमूने में देखा जा सकता है:

declare
fun lazy {Merge Xs Ys}
   case Xs#Ys
   of (X|Xr)#(Y|Yr) then
      if X < Y then X|{Merge Xr Ys}
      elseif X>Y then Y|{Merge Xs Yr}
      else X|{Merge Xr Yr}
      end
   end
end

fun lazy {Times N Xs}
   case Xs
   of nil then nil
   [] X|Xr then N*X|{Times N Xr}
   end
end

declare H
H = 1 | {Merge {Times 2 H} {Merge {Times 3 H} {Times 5 H}}}
{Browse {List.take H 6}}

ऊपर दिया गया कोड एक अनंत सूची में सभी नियमित संख्याओं[10] की सुंदर ढंग से गणना करता है। वास्तविक संख्या की गणना केवल तभी की जाती है जब उनकी आवश्यकता होती है।

मैसेज पासिंग कॉन्कररेन्सी (संदेश पासिंग समवर्ती)

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

declare
local Stream Port in
   Port = {NewPort Stream}
   {Send Port 1} % Stream is now 1|_ ('_' indicates an unbound and unnamed variable)
   {Send Port 2} % Stream is now 1|2|_ 
   ...
   {Send Port n} % Stream is now 1|2| .. |n|_
end

पोर्ट और एक थ्रेड के साथ, अतुल्यकालिक एजेंटों को परिभाषित किया जा सकता है:

fun {NewAgent Init Fun}
   Msg Out in
   thread {FoldL Msg Fun Init Out} end
   {NewPort Msg}
end

स्टेट एंड ऑब्जेक्ट्स

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

local A X in
   A = {NewCell 0}
   A := 1  % changes the value of A to 1
   X = @A  % @ is used to access the value of A
end

इन सरल सिमेंटिक परिवर्तनों के साथ, संपूर्ण वस्तु-उन्मुख प्रतिमान का समर्थन किया जा सकता है। थोड़ी सी सिंटैक्टिक शुगर के साथ, ओओपी ओज में अच्छी तरह से एकीकृत हो जाता है।

class Counter
   attr val
   meth init(Value)
      val:=Value
   end
   meth browse
      {Browse @val}
   end
   meth inc(Value)
      val :=@val+Value
   end
end

local C in
   C = {New Counter init(0)}
   {C inc(6)}
   {C browse}
end

निष्पादन की गति

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

यह भी देखें

संदर्भ

  1. "Mozart Oz License Info". 16 January 2014. Retrieved 16 January 2014.
  2. Gert Smolka (1995). "The Oz Programming Model" (PDF). Lecture Notes in Computer Science. 1000: 324–343. doi:10.1007/BFb0015252. ISBN 978-3-540-60105-0.
  3. "क्यूटीके". Archived from the original on 20 May 2013. Retrieved 6 April 2009.
  4. "3 Basics".
  5. Leif Grönqvist. "Higher Order Functions". Advanced Functional Programming in Oz. Archived from the original on 3 March 2016. Retrieved 3 November 2014.
  6. Robert Gentleman; Ross Ihaka (September 2000). "Lexical Scope in Statistical Computing" (PDF). Journal of Computational and Graphical Statistics. 9 (3, Systems and Languages): 491–508.
  7. "5 Basic Control Structures".
  8. "संग्रहीत प्रति". Archived from the original on 24 February 2015. Retrieved 29 November 2008.
  9. Paul Hudak (1989). "Conception, evolution, and application of functional programming languages". ACM Computing Surveys. 21 (3): 359–411. doi:10.1145/72551.72554. S2CID 207637854.
  10. Rao, AC & Varada Raju, D (1991). "Application of the Hamming number technique to detect isomorphism among kinematic chains and inversions". Mechanism and Machine Theory. 26 (1): 55–75. doi:10.1016/0094-114x(91)90022-v.
  11. The Computer Language Benchmarks Game


बाहरी संबंध