जॉयस (प्रोग्रामिंग भाषा)

From Vigyanwiki
जॉयस
Paradigmconcurrent, imperative, structured
परिवारWirth Pascal
द्वारा डिज़ाइन किया गयाPer Brinch Hansen
पहली प्रस्तुति1987; 37 years ago (1987)
Stable release
1 / 1987; 37 years ago (1987)
टाइपिंग अनुशासनStrong
Influenced by
Communicating sequential processes, Pascal, Concurrent Pascal
Influenced
SuperPascal

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

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

विशेषताएं

जॉयस पास्कल के छोटे उपसमुच्चय पर आधारित होती है, जिसे संगामिति के लिए सीएसपी से प्रेरित सुविधाओं के साथ विस्तारित किया गया है।[2] निम्नलिखित खंड कुछ और नई विशेषताओं का वर्णन करते हैं जिन्हें प्रस्तुत किया गया था।

एजेंट

एजेंट प्रक्रिया होती है जिसमें कथनों का समूह और संभवतः अन्य एजेंटों की नेस्टेड परिभाषाएँ सम्मिलित होती हैं। इस प्रकार एजेंट गतिशील रूप से उप-एजेंट सक्रिय कर सकता है जो उनके निर्माता के साथ समवर्ती रूप से निष्पादित होते हैं। एजेंट तभी समाप्त हो सकता है जब उसके सभी उप-एजेंट भी समाप्त हो गए होते है। उदाहरण के लिए, एजेंट प्रक्रिया2 , प्रक्रिया1 को सक्रिय करता है।

agent process1(x, y: integer);
begin
    ...
end;

agent process2();
use process1;
begin
    process1(9, 17);
end;

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

संचार

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

stream = [int(integer), eos];

प्रतीक इंट(पूर्णांक) किसी भी पूर्णांक मान के इंट नामक संदेश प्रतीक को दर्शाता है। दूसरा टाइपलेस प्रतीक घोषणा ईओएस (स्रोत का अंत) को संकेत का नाम है। अतः पोर्ट प्रकार परिभाषित हो जाने के पश्चात्, उस प्रकार का पोर्ट चर घोषित किया जा सकता है।

out : stream
in  : stream

और फिर चैनल इकाई, इसे बनाने वाले एजेंट के लिए आंतरिक, निम्नानुसार सक्रिय किया जा सकता है।

+out;

प्रतीकों को तब सीएसपी-शैली इनपुट और आउटपुट ऑपरेटरों ? और ! क्रमश का उपयोग करके चैनलों पर भेजा और प्राप्त किया जा सकता है। इस प्रकार संचार तभी हो सकता है जब भेजने वाले एजेंट से मेल खाने वाला कोई प्राप्तकर्ता एजेंट होता है। अतः प्राप्त करने वाले एजेंट को भेजे जाने वाले प्रतीक प्रकार को प्राप्त करने की अपेक्षा की जाती है। उदाहरण के लिए, ईओएस प्रतीक के पश्चात् मान 9 पोर्ट आउट पर भेजा जाता है।

out ! int(9)
out ! eos

और पूर्णांक संदेश मिलान प्रकार के चर में प्राप्त होता है, उसके पश्चात् ईओएस:

received : integer
in ? int(received)
in ? eos

पोलिंग कथन

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

poll
    in ? X -> x := x + 1 |
    in ? Y -> y := y + 1
end

जहां मिलान संचार पर सिग्नल एक्स या वाई के लिए पोर्ट इन संकेतों के लिए निगरानी की जाती है, अतः संबंधित चर एक्स या वाई बढ़ाए जाते हैं।

सुरक्षा

जॉयस को इस अर्थ में सुरक्षित भाषा के रूप में डिजाइन किया गया था कि संकलक भाषा के नियमों के सभी उल्लंघनों का अनुमान लगाने में सक्षम होता है।

उदाहरण कार्यक्रम

निम्नलिखित पूर्ण उदाहरण प्रोग्राम होता है, जो जॉयस प्रोग्रामिंग भाषा को प्रस्तुत करने वाले मूल पेपर से लिया गया होता है,[1] अभाज्य संख्याएँ उत्पन्न करने के लिए छँटाई विधि के आधार पर अभाज्य संख्याएँ उत्पन्न करने के लिए एल्गोरिथ्म को प्रयुक्त किया जाता है। इस प्रकार छलनी एजेंट को उसके पूर्ववर्ती से पूर्णांकों के स्रोत भेजी जाती है, जो पहले अभाज्य होती है। यह इस प्राइम के सभी गुणकों को स्रोत से हटा देता है और उत्तराधिकारी को सक्रिय करता है। यह तब तक जारी रहता है जब तक ईओएस सिग्नल चलनी के समूह के साथ प्रसारित किया जाता है।

agent sieve(inp, out: stream);
var more: boolean; x, y: integer;
  succ: stream;
begin
    poll
        inp?int(x) -> +succ; 
            sieve(succ, out); more := true |
        inp?eos    -> out!eos; more := false
    end;
    while more do
        poll
            inp?int(y) ->
                if y mod x <> 0 then succ!int(y) |
            inp?eos    -> out!int(x);
                succ!eos; more := false
        end;
end;

निम्नलिखित एजेंट छलनी एजेंटों के समूह को आरंभ करता है और उनमें 3 और 9999 के मध्य पूर्णांकों के स्रोत डालता है।

agent primes;
use generate, sieve, print;
var a, b: stream;
begin
    +a; +b; generate(a, 3, 2, 4999);
    sieve(a, b); print(b)
end;

कार्यान्वयन

ढेर आवंटन

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

संदर्भ

  1. 1.0 1.1 Hansen, Brinch (2002). "Joyce: A programming language for distributed systems". In Hansen, Per Brinch (ed.). The Origin of Concurrent Programming: From Semaphores to Remote Procedure Calls. New York, New York: Springer. pp. 464–492. doi:10.1007/978-1-4757-3472-0. ISBN 978-1-4419-2986-0. S2CID 44909506.
  2. Hansen, Brinch (June 1989). "द जॉयस लैंग्वेज रिपोर्ट". Software: Practice and Experience. John Wiley & Sons. 19 (6): 553–578. doi:10.1002/spe.4380190606. S2CID 30474491.
  3. Hansen, Brinch (June 1989). "जॉयस का एक मल्टीप्रोसेसर कार्यान्वयन". Software: Practice and Experience. John Wiley & Sons. 19 (6): 579–592. doi:10.1002/spe.4380190606. S2CID 30474491.


बाहरी संबंध

Official website, Brinch Hansen Archive, a set of his papers