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

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

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

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

एजेंट
एक एजेंट एक प्रक्रिया है जिसमें कथनों का एक सेट और संभवतः अन्य एजेंटों की नेस्टेड परिभाषाएँ शामिल हैं। एक एजेंट गतिशील रूप से उप-एजेंट सक्रिय कर सकता है जो उनके निर्माता के साथ समवर्ती रूप से निष्पादित होते हैं। एक एजेंट तभी समाप्त हो सकता है जब उसके सभी उप-एजेंट भी समाप्त हो गए हों। उदाहरण के लिए, एक एजेंट  को सक्रिय करता है  : <वाक्यविन्यास लैंग = पास्कल लाइन हाइलाइट = 1,6> एजेंट प्रक्रिया 1 (एक्स, वाई: पूर्णांक); शुरू ... अंत;

एजेंट प्रक्रिया 2 ; प्रक्रिया 1 का प्रयोग करें; शुरू प्रक्रिया 1 (9, 17); अंत; 

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

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

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

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

उदाहरण कार्यक्रम
निम्नलिखित एक पूर्ण उदाहरण कार्यक्रम है, जो जॉयस प्रोग्रामिंग भाषा को प्रस्तुत करने वाले मूल पेपर से लिया गया है, अभाज्य संख्याएँ उत्पन्न करने के लिए छानने की तकनीक के आधार पर अभाज्य संख्याएँ उत्पन्न करने के लिए एक एल्गोरिथ्म को लागू करना। ए  एजेंट को अपने पूर्ववर्ती से पूर्णांकों की एक धारा भेजी जाती है, जो पहले अभाज्य है। यह इस प्राइम के सभी गुणकों को धारा से हटा देता है और एक उत्तराधिकारी को सक्रिय करता है। यह तब तक जारी रहता है जब तक   सिग्नल चलनी के सेट के साथ प्रचारित किया जाता है। <वाक्यविन्यास हाइलाइट लैंग = पास्कल हाइलाइट = 1> एजेंट छलनी (इनप, आउट: स्ट्रीम); वर अधिक: बूलियन; एक्स, वाई: पूर्णांक; सफलता: धारा; शुरू मतदान inp?int(x) -> +succ; चलनी (सक्सेस, आउट); अधिक := सत्य | inp?eos -> out!eos; अधिक := असत्य अंत; जबकि अधिक करते हैं मतदान inp? int(y) -> अगर y mod x <> 0 तो succ!int(y) | inp?eos -> out!int(x); सफलता; अधिक := असत्य अंत; अंत;  निम्नलिखित एजेंट छलनी एजेंटों के सेट को इनिशियलाइज़ करता है और उनमें 3 और 9999 के बीच पूर्णांकों की एक धारा डालता है। <वाक्यविन्यास हाइलाइट लैंग = पास्कल हाइलाइट = 1> एजेंट प्राइम्स; जनरेट, चलनी, प्रिंट का उपयोग करें; वर ए, बी: धारा; शुरू + ए; + बी; उत्पन्न (ए, 3, 2, 4999); चलनी (ए, बी); प्रिंट (बी) अंत; 

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

बाहरी संबंध
, Brinch Hansen Archive, a set of his papers