सुपरपास्कल
Paradigm | concurrent, imperative, structured |
---|---|
परिवार | Wirth Pascal |
द्वारा डिज़ाइन किया गया | Per Brinch Hansen |
पहली प्रस्तुति | 1993 |
Stable release | 1
/ 1993 |
टाइपिंग अनुशासन | Strong |
वेबसाइट | brinch-hansen |
Influenced by | |
Communicating sequential processes, Pascal, Concurrent Pascal, Joyce, occam |
सुपरपास्कल आदेशात्मक, समवर्ती कंप्यूटिंग प्रोग्रामिंग लैंग्वेज है जिसे पर ब्रिन्च हैनसेन द्वारा विकसित किया गया है।[1] यह प्रकाशन लैंग्वेज के रूप में डिजाइन किया गया था समानांतर प्रोग्रामिंग में अवधारणाओं की स्पष्ट और संक्षिप्त अभिव्यक्ति को सक्षम करने के लिए विचार उपकरण। यह कार्यान्वयन लैंग्वेज के विपरीत है जो अधिकांशतः मशीन विवरण और ऐतिहासिक सम्मेलनों से जटिल होती हैं। यह समानांतर प्रकाशन लैंग्वेज के समय की आवश्यकता को पूरा करने के लिए बनाया गया था। यकीनन, आज कुछ लैंग्वेज अभिव्यंजक और संक्षिप्त हैं जिनका उपयोग विचार उपकरण के रूप में किया जा सकता है।
इतिहास और विकास
सुपरपास्कल निक्लॉस विर्थ की अनुक्रमिक लैंग्वेज पास्कल पर आधारित है, इसे सुरक्षित और कुशल संगामिति के लिए सुविधाओं के साथ विस्तारित किया गया है। 1970 के दशक में खुद पास्कल का प्रकाशन लैंग्वेज के रूप में बहुत अधिक इस्तेमाल किया गया था। इसका उपयोग संरचित प्रोग्रामिंग प्रथाओं को सिखाने के लिए किया गया था और पाठ्य पुस्तकों में चित्रित किया गया था, उदाहरण के लिए, संकलनकर्ता[2] और प्रोग्रामिंग लैंग्वेज।[3] हैनसेन ने पहले समवर्ती पास्कल लैंग्वेज विकसित की थी,[4] ऑपरेटिंग सिस्टम और रीयल-टाइम नियंत्रण प्रणाली के डिजाइन के लिए सबसे प्रारम्भी समवर्ती लैंग्वेज में से एक।
सुपरपास्कल की आवश्यकताएँ मॉडल समानांतर कार्यक्रमों के सेट को विकसित करने में हैनसेन द्वारा प्राप्त अनुभव पर आधारित थीं, जिसने कंप्यूटर विज्ञान में सामान्य समस्याओं के लिए विधियों को लागू किया।[5] इस प्रयोग ने उन्हें वैज्ञानिक समांतर कंप्यूटिंग के भविष्य के बारे में निम्नलिखित निष्कर्ष निकालने की अनुमति दी
- भविष्य के समानांतर कंप्यूटर सामान्य-उद्देश्य वाले होंगे, जिससे प्रोग्रामर समस्या-उन्मुख प्रक्रिया विन्यास के संदर्भ में सोच सकेंगे। यह ट्रांसप्यूटर्स के प्रोग्रामिंग नेटवर्क के अनुभव पर आधारित था, जो सामान्य-उद्देश्य वाले प्रोसेसर थे जो ऐरे डेटा संरचना, ट्री या हाइपरक्यूब में जुड़े होने में सक्षम थे।
- कम्प्यूटेशनल विज्ञान में नियमित समस्याओं के लिए केवल नियतात्मक समानता की आवश्यकता होती है, अर्थात, कई चैनलों के बजाय विशेष चैनल से संचार की अपेक्षा करना।
- समानांतर वैज्ञानिक कलन विधि को एक सुरुचिपूर्ण प्रकाशन लैंग्वेज में विकसित किया जा सकता है और अनुक्रमिक कलन विधि कंप्यूटर पर परीक्षण किया जा सकता है। जब यह स्थापित हो जाता है तो एल्गोरिदम काम करता है, इसे समानांतर कार्यान्वयन लैंग्वेज में आसानी से कार्यान्वयन किया जा सकता है।
इसके बाद समानांतर प्रकाशन लैंग्वेज के लिए निम्नलिखित आवश्यकताओं का नेतृत्व किया गया
- लैंग्वेज को नियतात्मक समानता और संदेश संचार के साथ व्यापक रूप से इस्तेमाल की जाने वाली मानक लैंग्वेज का विस्तार करना चाहिए। विस्तार मानक लैंग्वेज की भावना में होना चाहिए।
- लैंग्वेज को संचार चैनलों से जुड़े समांतर प्रक्रियाओं के मनमाना विन्यास प्रोग्राम करना संभव बनाना चाहिए। इन विन्यासों को पुनरावृत्ति या पुनरावर्ती रूप से परिभाषित किया जा सकता है और गतिशील रूप से बनाया जा सकता है।
- लैंग्वेज को सिंगल-पास संकलक को यह जांचने में सक्षम बनाना चाहिए कि समांतर प्रक्रियाएं समय-निर्भर तरीके से हस्तक्षेप नहीं करती हैं।
सुविधाएँ
सुपरपास्कल के डिजाइन में प्रमुख विचार समानता के लिए अमूर्त अवधारणाओं के साथ सुरक्षित प्रोग्रामिंग प्रदान करना था।[6][7]
सुरक्षा
सुपरपास्कल इस मायने में सुरक्षित है कि इसे अपने कंपाइलर और क्रम प्रणाली को अधिक से अधिक मामलों का पता लगाने में सक्षम बनाना चाहिए जिसमें लैंग्वेज की अवधारणाएं टूट जाती हैं और अर्थहीन परिणाम उत्पन्न करती हैं।[8] सुपरपास्कल चर के उपयोग पर प्रतिबंध लगाता है जो सिंगल-पास संकलक को यह जांचने में सक्षम बनाता है कि समांतर प्रक्रियाएं अलग-अलग हैं, भले ही प्रक्रियाएं वैश्विक चर के साथ प्रक्रियाओं का उपयोग करती हैं, समय-निर्भर त्रुटियों को समाप्त करती हैं। पास्कल में कई विशेषताएं अस्पष्ट या असुरक्षित थीं और सुपरपास्कल से हटा दी गई थीं, जैसे लेबल और goto
विवरण, संकेत और आगे की घोषणा।[6]
समानता
सुपरपास्कल की समानांतर विशेषताएं गतिशील प्रक्रिया सरणियों और पुनरावर्ती समानांतर प्रक्रियाओं की अतिरिक्त सामान्यता के साथ ओकैम 2 का एक उपसमूह हैं।[7]
parallel
विवरण यह दर्शाता है कि इसमें सम्मिलित बयानों की निश्चित संख्या को समानांतर में निष्पादित किया जाना चाहिए। उदाहरण के लिए
parallel
source() |
sink()
end
forall
विवरण प्रक्रियाओं की गतिशील संख्या द्वारा बयान के समानांतर निष्पादन को दर्शाता है, उदाहरण के लिए
forall i := 0 to 10 do
something()
चैनल और संचार
समानांतर प्रक्रियाएं गतिशील रूप से बनाए गए चैनलों के माध्यम से टाइप किए गए संदेशों को भेजकर संचार करती हैं। चैनल अपने आप में चर नहीं हैं, लेकिन चैनल संदर्भ के रूप में ज्ञात अद्वितीय मान द्वारा पहचाने जाते हैं, जो चैनल चर द्वारा आयोजित किए जाते हैं। चैनल घोषित किया जाता है, उदाहरण के लिए, घोषणा द्वारा
type channel = *(boolean, integer);
var c: channel;
जो एक नए (मिश्रित) प्रकार के नाम वाले चैनल और इस प्रकार के चर को परिभाषित करता है जिसका नाम सी है। मिश्रित प्रकार का चैनल केवल निर्दिष्ट प्रकारों को प्रसारित करने के लिए प्रतिबंधित है, इस मामले में बूलियन और पूर्णांक मान। चैनल सी द्वारा आरंभ किया गया है
open(c)
संदेश संचार तब send(channel, value)
और receive(channel, variable)
के साथ हासिल किया जाता है send
के लिए मान प्रदान करने वाला व्यंजक या चर , और receive
करने में चर , दोनों पहले चैनल तर्क के समान प्रकार के होने चाहिए। निम्न उदाहरण इन कार्यों के उपयोग को प्रक्रिया में दिखाता है जो बाएं चैनल से मान प्राप्त करता है और इसे दाईं ओर आउटपुट करता है।
var left, right: channel; a: number;
receive(left, a);
send(right, a)
send
और receive
करने वाले कार्य दोनों क्रमशः कई इनपुट और आउटपुट तर्क ले सकते हैं:
send(channel, e1, e2,..., en);
receive(channel, v1, v2,..., vn)
निम्नलिखित रनटाइम संचार त्रुटियाँ हो सकती हैं:
- चैनल विवाद तब होता है जब दो समानांतर प्रक्रियाएं एक ही चैनल पर एक साथ भेजने या प्राप्त करने का प्रयास करती हैं।
- संदेश प्रकार त्रुटि तब होती है जब दो समानांतर प्रक्रियाएं एक ही चैनल के माध्यम से संचार करने का प्रयास करती हैं और आउटपुट अभिव्यक्ति और इनपुट चर विभिन्न प्रकार के होते हैं।
- गतिरोध तब होता है जब कोई भेजने या प्राप्त करने का ऑपरेशन पूरा होने के लिए अनिश्चित काल तक प्रतीक्षा करता है।
समानांतर पुनरावर्तन
समानांतर पुनरावर्ती प्रक्रियाओं को बनाने के लिए पुनरावर्ती प्रक्रियाओं को parallel
और forall
के साथ जोड़ा जा सकता है। निम्नलिखित उदाहरण दिखाता है कि parallel
कथन का उपयोग करके कैसे प्रक्रियाओं की पाइपलाइन को पुनरावर्ती रूप से कैसे परिभाषित किया जा सकता है ।
procedure pipeline(min, max: integer; left, right: channel);
var middle: channel;
begin
if min < max then
begin
open(middle);
parallel
node(min, left, middle) |
pipeline(min + 1, max, middle, right)
end
end
else node(min, left, right)
end;
अन्य उदाहरण प्रक्रिया ट्री की पुनरावर्ती परिभाषा है:
procedure tree(depth: integer, bottom: channel);
var left, right: channel;
begin
if depth > 0 then
begin
open(left, right);
parallel
tree(depth - 1, left) |
tree(depth - 1, right) |
root(bottom, left, right)
end
end
else leaf(bottom)
हस्तक्षेप नियंत्रण
समवर्ती प्रोग्रामिंग का सबसे कठिन पहलू अप्रत्याशित या गैर-पुनरुत्पादन योग्य व्यवहार है जो समय-निर्भर त्रुटियों के कारण होता है। समय-निर्भर त्रुटियाँ चर अद्यतनों या चैनल विरोधों के कारण समानांतर प्रक्रियाओं के बीच हस्तक्षेप के कारण होती हैं। यदि प्रक्रियाएं चर साझा करती हैं, तो इसे अप्रत्याशित समय पर अपडेट करें, कार्यक्रम का परिणामी व्यवहार समय-निर्भर है। इसी तरह, यदि दो प्रक्रियाएं एक साथ साझा चैनल पर भेजने या प्राप्त करने का प्रयास करती हैं, तो परिणामी प्रभाव समय-निर्भर होता है।
सुपरपास्कल समय-निर्भर त्रुटियों को कम करने या समाप्त करने के लिए चर और संचार के उपयोग पर कुछ प्रतिबंध लागू करता है। चर के साथ, एक सरल नियम की आवश्यकता होती है: समानांतर प्रक्रियाएं केवल चर के असंबद्ध सेट को अद्यतन कर सकती हैं।[1] उदाहरण के लिए, parallel
बयान में लक्ष्य चर को एक से अधिक प्रक्रियाओं द्वारा अद्यतन नहीं किया जा सकता है, लेकिन एक अभिव्यक्ति चर (जिसे अद्यतन नहीं किया जा सकता है) का उपयोग कई प्रक्रियाओं द्वारा किया जा सकता है। कुछ परिस्थितियों में, जब एक चर जैसे कि एक सरणी कई समानांतर प्रक्रियाओं का लक्ष्य होता है, और प्रोग्रामर जानता है कि इसका तत्व-वार उपयोग असंबद्ध है, तो विसंबद्धता प्रतिबंध को पूर्ववर्ती [sic]
कथन से ओवरराइड किया जा सकता है ।
संरचना और वाक्य रचना
सुपरपास्कल ब्लॉक संरचित लैंग्वेज है, जिसमें पास्कल के समान मूल सिंटैक्स है। प्रोग्राम में हेडर, वैश्विक चर परिभाषाएँ, कार्य या प्रक्रिया परिभाषाएँ और मुख्य प्रक्रिया होती है। कार्यों और प्रक्रियाओं में ब्लॉक होते हैं, जहां ब्लॉक स्टेटमेंट का एक सेट होता है। सी या जावा जैसी लैंग्वेज के विपरीत, जहां उन्हें अर्धविरामों द्वारा अलग किया जाता है।
निम्नलिखित पूर्ण सुपरपास्कल प्रोग्राम का उदाहरण है, जो 100 नोड्स के साथ पाइपलाइन संचार संरचना का निर्माण करता है। मास्टर नोड पहले नोड को एक पूर्णांक प्रतीक भेजता है, फिर इसे पाइपलाइन के साथ पारित किया जाता है और प्रत्येक चरण में वृद्धि की जाती है, और अंत में मास्टर नोड द्वारा प्राप्त किया जाता है और प्रिंट आउट किया जाता है।
program pipeline;
const
len = 100;
type
channel = *(integer);
var
left, right: channel;
value: integer;
procedure node(i: integer; left, right: channel);
var value: integer;
begin
receive(left, value);
send(right, value+1)
end;
procedure create(left, right: channel);
type row = array [0..len] of channel;
var c: row; i: integer;
begin
c[0] := left;
c[len] := right;
for i := 1 to len-1 do
open(c[i]);
forall i := 1 to len do
node(i, c[i-1], c[i])
end;
begin
open(left, right);
parallel
send(left, 0) |
create(left, right) |
receive(right, value)
end;
writeln('The resulting value is ', value)
end.
कार्यान्वयन
सुपरपास्कल सॉफ्टवेयर को ब्रिन्च हैनसेन आर्काइव से स्वतंत्र रूप से एक्सेस किया जा सकता है।[9] इसमें एक संकलक और अनुवादक होता है, जो दोनों सामान्य, अनुक्रमिक पास्कल (आईएसओ स्तर 1 मानक पास्कल) में लिखे जाते हैं। यह जीएनयू पास्कल कंपाइलर और फ़्री पास्कल कंपाइलर (2.7.1+) के नए संस्करणों द्वारा -Miso
स्विच के साथ कोड में निम्नलिखित संबंधित छोटे संशोधनों के साथ समर्थित है।
जीपीसी के लिए, फाइल interpret.p
गैर-मानक clock
कार्य (पंक्ति 1786) का उपयोग करता है , जिसका उपयोग सिस्टम समय प्राप्त करने के लिए किया जाता है। इसके बजाय, विस्तारित पास्कल getTimeStamp
कार्य का उपयोग किया जा सकता है (जो जीएनयू पास्कल कंपाइलर द्वारा समर्थित है), प्रकार TimeStamp
के एक चर घोषित करके , वर्तमान समय के साथ getTimeStamp
का उपयोग करके और TimeStamp
के Second
क्षेत्र को चर t
को असाइन करके।
64-बिट ऑपरेटिंग सिस्टम पर जीपीसी के संबंध में, जीएनयू पास्कल कंपाइलर को स्रोत कोड से संकलित और स्थापित किया जाना चाहिए।[10]
नि: शुल्क पास्कल को उपरोक्त "घड़ी" समस्या के समाधान की भी आवश्यकता है (विंडोज़ पर, "घड़ी" के नाम के साथ बाहरी के रूप में gettickcount घोषित करें)। इसके अलावा, स्रोत कोड में गैर-मानक के रूप में चिह्नित रीसेट/पुनर्लेखन को असाइन/रीसेट (या पुनर्लेखन) जोड़े में बदला जाना चाहिए। (जीपीसी शायद इस पर केवल त्रुटियां हैं यदि आप सख्त झंडे सक्षम करते हैं), और सी प्रीप्रोसेसर कमांड #सम्मिलित 'xx' को {$सम्मिलित 'xx'} में बदला जाना चाहिए।
{ Time code for readtime in Freepascal on unix systems }
Function FpTime(var tloc : integer): integer; external name 'FPC_SYSC_TIME';
procedure readtime(
var t: integer);
begin
{ A nonstandard function reads
the processor time in ms }
t:=fptime(t);
end;
संदर्भ
- ↑ 1.0 1.1 Hansen, Per Brinch (1993), SuperPascal: a publication language for parallel scientific computing
- ↑ Welsh, Jim (1980). संरचित सिस्टम प्रोग्रामिंग. Upper Saddle River, NJ, USA: Prentice-Hall. ISBN 0-13-854562-6.
- ↑ Tennent, R. D. (1981). प्रोग्रामिंग भाषाओं के सिद्धांत. Upper Saddle River, NJ, USA: Prentice-Hall. ISBN 0-13-709873-1.
- ↑ Hansen, Brinch (1977). समवर्ती कार्यक्रमों की वास्तुकला. Prentice-Hall. ISBN 978-0130446282.
- ↑ Hansen, Brinch (May 1993), "Model programs for computational science: A programming methodology for multicomputers", Concurrency: Practice and Experience, pp. 407–423
- ↑ 6.0 6.1 Hansen, Brinch (1994). "प्रोग्रामिंग भाषा सुपरपास्कल". Software: Practice and Experience. 24, 5: 399–406.
- ↑ 7.0 7.1 Hansen, Brinch (1977). समवर्ती प्रोग्रामिंग का आविष्कार. New York: Springer-Verlag. ISBN 0-387-95401-5.
- ↑ Hoare, C. A. R. (1974). "प्रोग्रामिंग भाषा डिजाइन पर संकेत". Computer System Reliability: 505–534.
- ↑ Hayden, C.C. (2008-06-11). "प्रति ब्रिन्च हैनसेन आर्काइव". Retrieved 2020-03-03.
- ↑ "4.3 Compiling GPC". GNU Pascal. 1996–2005. Retrieved 2020-03-03.
बाहरी संबंध
- Official website, Brinch Hansen Archive, a set of his papers and the SuperPascal software which can be downloaded in a compressed file; contains the full language specification and useful documentation.
- superpascal on GitHub, Christopher Long's modified version of the original SuperPascal implementation; compiles and runs under modern Free Pascal; program execution is faster than Perl 5 or 6, nearly as fast as Python 3