अनुक्रम एल

From Vigyanwiki
Revision as of 10:47, 9 June 2023 by Indicwiki (talk | contribs) (29 revisions imported from alpha:अनुक्रम_एल)
अनुक्रम एल
ParadigmsParallel computing, Functional, Purely functional, Declarative programming
द्वारा डिज़ाइन किया गयाडॉ. डेनियल कुक,
डॉ. नेल्सन रशटन,
डॉ. ब्रैड नेमनिच
Developersटेक्सास टेक विश्वविद्यालय,
टेक्सास मल्टीकोर प्रौद्योगिकियों
टाइपिंग अनुशासनस्टेटिक, टाइप अनुमान
प्लेटफॉर्मx86, पावर, एआरएम
ओएसविंडोज, मैकओएस, लिनक्स
लाइसेंसस्वामित्व[1]
वेबसाइटtexasmulticore.comTemplate:डेड लिंक

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

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

इतिहास

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

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

जैसे-जैसे भाषा विकसित हुई, शोधकर्ताओं ने उपभोग-सरलीकृत-उत्पादन (सीएसपी) सहित नए कम्प्यूटेशनल दृष्टिकोण विकसित किए।[3] 1998 में, समानांतर कंप्यूटिंग के लिए अनुक्रम एल को लागू करने के लिए अनुसंधान प्रारंभ हुआ। इसकी परिणति 2004 में हुई जब इसने सामान्यीकृत-स्थानांतरण (NT) सिमेंटिक के साथ अपना और अधिक पूर्ण रूप ले लिया,[4][5] जो केंद्रीय प्रसंस्करण इकाइयों (सीपीयू) के प्रमुख विक्रेताओं के साथ घड़ी की गति को बढ़ाने के अतिरिक्त बहु-कोर प्रोसेसर में एक प्रमुख बदलाव के साथ मेल खाता है। NT सिमेंटिक वर्क-हॉर्स है, जिसका उपयोग गामा और एनईएसएल के समान डेटा प्रवाह जैसी निष्पादन रणनीति के आधार पर संरचनाओं को सरल और विघटित करने के लिए किया जा रहा है।[6] [7] NT सिमेंटिक लैमेल और पेयटन-जोन्स के बॉयलरप्लेट उन्मूलन के समान लक्ष्य प्राप्त करता है।[8][9] भाषा की अन्य सभी विशेषताओं को इन दो नियामो से परिभाषित किया जा सकता है - जिसमें रिकर्सन (कंप्यूटर विज्ञान), सबस्क्रिप्टिंग संरचनाएं, फ़ंक्शन संदर्भ और फ़ंक्शन निकायों का मूल्यांकन सम्मलित है।[10][11]

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

डिजाइन

अनुक्रम एल को एल्गोरिथम कोड पर ध्यान केंद्रित करते हुए सीखने और उपयोग करने के लिए जितना संभव हो उतना सरल बनाया गया है, जहां यह मूल्य जोड़ता है, उदाहरण के लिए, आविष्कारक ने I/O को फिर से शुरू नहीं करने का फैसला किया क्योंकि C ने इसे अच्छी तरह से संभाला। परिणामस्वरूप, पूर्ण अनुक्रम एल के लिए भाषा संदर्भ प्रचुर उदाहरणों के साथ केवल 40 पृष्ठ हैं, और इसके औपचारिक व्याकरण में लगभग 15 उत्पादन नियम हैं।[13]

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

p×n आव्यूह B के साथ m×p आव्यूह A का गुणनफल m×n आव्यूह है जिसकी (i,j)'वीं प्रविष्टि है

अनुक्रम एल परिभाषा उस परिभाषा को न्यूनाधिक सटीक रूप से दर्शाती है:

matmul(A(2), B(2)) [i,j] := 
       let k := 1...size(B); 
       in  sum( A[i,k] * B[k,j] );

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

जैसा कि ऊपर उल्लेख किया गया है, अनुक्रम एल में इनपुट/आउटपुट (I/O) के लिए कोई अंतर्निहित निर्माण नहीं है क्योंकि इसे अन्य प्रोग्रामिंग भाषाओं के साथ एक योगात्मक उपायो से काम करने के लिए अभिकल्पित किया गया था। बहुथ्रेडेड C++ को संकलित करने और 20+ सरलीकृत रैपर और इंटरफ़ेस जेनरेटर (स्विग) भाषाओं (C, C++, C#, जावा, पाइथन, आदि) का समर्थन करने का निर्णय का अर्थ है कि यह उपस्थित अभिकल्पित प्रवाह, प्रशिक्षण और टूल में आसानी से फ़िट हो जाता है। इसका उपयोग उपस्थिता अनुप्रयोगों को बढ़ाने, बहुकोर लाइब्रेरी बनाने और परिणामी कोड को अन्य कोड के साथ जोड़कर स्टैंडअलोन एप्लिकेशन बनाने के लिए किया जा सकता है जो I/O कार्य करता है। अनुक्रम एल फ़ंक्शंस को दिए गए इनपुट के साथ दुभाषिया (कंप्यूटिंग) से भी पूछा जा सकता है, जैसे कि पायथन और अन्य व्याख्या की गई भाषाएँ।

सामान्यीकरण-स्थानांतरण

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

इसका परिणाम '+' संक्रियक को ओवरलोड करने से नहीं, बल्कि NT के प्रभाव से होता है, जो निर्मित में और उपयोगकर्ता परिभाषित में दोनों तरह के सभी संचालन तक फैला होता है।

एक अन्य उदाहरण के रूप में, यदि f() एक 3-तर्क फ़ंक्शंस है जिसके तर्क अदिश हैं, तो किसी भी उपयुक्त x और z के लिए हमारे पास होगा

उदाहरण के लिए, एक बार में कई तर्कों के लिए NT निर्माण का उपयोग किया जा सकता है

यह तब भी काम करता है जब अपेक्षित तर्क किसी भी प्रकार के टी का गैर-अदिश होता है, और वास्तविक तर्क प्रकार टी की वस्तुओं की एक सूची है (या, अधिक सामान्यता में, कोई डेटा संरचना जिसका निर्देशांक प्रकार T के हैं)। उदाहरण के लिए, यदि A एक आव्यूह है और Xs आव्यूह [X1, ..., Xn],की एक सूची है, और आव्यूह गुणा की उपरोक्त परिभाषा दी गई है, तो अनुक्रम एल में हमारे पास होगा

 matmul(A,Xs) = [matmul(A,X1),...,matmul(A,Xn)]

एक नियम के रूप में, एनटी पुनरावृत्ति, पुनरावर्तन, या उच्च स्तरीय कार्यात्मक संक्रियको की आवश्यकता को समाप्त कर देता है

  1. डेटा संरचना के प्रत्येक भाग के लिए समान कार्य करें, या करने के लिए
  2. समान आकार की संरचनाओं के संबंधित भागों को एक साथ प्रोसेस करें।

यह पुनरावृत्ति और पुनरावर्तन के अधिकांश उपयोगों के लिए खाता है।

उदाहरण: अभाज्य संख्याएँ

एक अच्छा उदाहरण जो उपरोक्त अवधारणाओं को प्रदर्शित करता है, अभाज्य संख्याओं को ढूंढने में होगा। एक प्रमुख संख्या के रूप में परिभाषित किया गया है

एक पूर्णांक 1 से अधिक है, जिसमें स्वयं और 1 के अतिरिक्त कोई सकारात्मक विभाजक नहीं है।

तो एक धनात्मक पूर्णांक z अभाज्य है यदि 2 से लेकर z-1 तक कोई भी संख्या, समावेशी, समान रूप से विभाजित न हो। इस समस्या को शाब्दिक रूप से उपरोक्त परिभाषा को भाषा में लिप्यंतरित करके प्रोग्राम करने की अनुमति देता है।

अनुक्रम एल में, 2 से z-1 तक की संख्याओं का एक क्रम, समावेशी, सिर्फ (2...(z-1)) है, इसलिए 100 और 200 के बीच सभी अभाज्य संख्याओं को ढूंढने के लिए एक प्रोग्राम लिखा जा सकता है:

    prime(z) := z when none(z mod (2...(z-1)) = 0);

जो, अंग्रेजी में सिर्फ कहते हैं,

... तर्क वापस करें यदि 2 के बीच कोई भी संख्या नहीं है, और तर्क से 1 कम है, इसमें समान रूप से विभाजित करें।

यदि वह शर्त पूरी नहीं होती है, तो फ़ंक्शन कुछ भी नहीं लौटाता है।


 cmd:>prime(17)
   17
   cmd:>prime(18)
   empty

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


cmd:>prime(100...200)
   [101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]

एक बहुत ही कम और पठनीय प्रोग्राम के साथ इस समस्या को हल करने के अतिरिक्त, नेस्टेड अनुक्रमों के अनुक्रम एल का मूल्यांकन सभी समानांतर में किया जाएगा।

अवयव

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

दुभाषिया

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

संकलक

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

रनटाइम

रनटाइम वातावरण पुस्तकालयों का एक पूर्व-संकलित सेट है जो लक्ष्य प्लेटफॉर्म पर इष्टतम रूप से निष्पादित करने के लिए संकलित समांतर सी ++ कोड के साथ काम करता है। यह इंटेल थ्रेडेड बिल्डिंग ब्लॉक्स (TBB) पर बनाता है और कैश (टेम्परेरी स्पेशल स्टॉरिज स्पेस फाइल ) अनुकूलन, मेमोरी प्रबंध, काम कतार-स्टीलिंग और प्रदर्शन निगरानी जैसी चीजों को हैंडल करता है।[15]

डिबगर के साथ ग्रहण आईडीई प्लग-इन

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

पुस्तकालय

प्रोग्रामिंग प्रक्रिया को सुव्यवस्थित करने और सर्वोत्तम अभ्यास उदाहरणों के रूप में सेवा करने के लिए विभिन्न गणित और अन्य मानक फ़ंक्शन पुस्तकालयों को अनुक्रम एल स्रोत कोड के रूप में सम्मलित किया गया है। इन्हें आयातित किया जा सकता है, ठीक उसी तरह जैसे C या C++ लाइब्रेरी # सम्मलित हैं।

यह भी देखें

संदर्भ

  1. Template:साइट वेब
  2. "टेक्सास मल्टीकोर टेक्नोलॉजीज में डॉ। डैनियल कुक". Archived from the original on 2016-03-04. Retrieved 2016-02-24.
  3. "उपभोग-सरलीकृत-उत्पादन (सीएसपी)" (PDF). Archived from the original (PDF) on 2017-02-02. Retrieved 2017-01-26.
  4. Nemanich, Brad; Cooke, Daniel; Rushton, Nelson (2010), SequenceL: Transparency And Multi-Core Parallelisms (PDF), DAMP '10 Proceedings of the 5th ACM SIGPLAN workshop on Declarative Aspects of Multicore Programming, New York, NY, US: ACM, pp. 45–52, archived from the original (PDF) on 2017-02-02, retrieved 2017-01-26
  5. Cooke, Daniel; Rushton, Nelson; Nemanich, Brad; Watson, Robert G.; Andersen, Per (March 2008), "Normalize, Transpose, and Distribute: An Automatic Approach for Handling Nonscalars", ACM Transactions on Programming Languages and Systems, 30 (2): 1–49, doi:10.1145/1330017.1330020, S2CID 6833254
  6. Banater, J-P; Le Metayer, D. (January 1993), "Programming by Multiset Transformation" (PDF), Communications of the ACM, 36 (1): 98–111, doi:10.1145/151233.151242, S2CID 17076396
  7. Blelloch, Guy (March 1996), "Programming Parallel Algorithms", Communications of the ACM, 39 (3): 85–97, CiteSeerX 10.1.1.141.5884, doi:10.1145/227234.227246, S2CID 12118850
  8. Lämmel, Ralf; Peyton-Jones, Simon (2003), "Scrap your boilerplate: a practical design pattern for generic programming", Proceedings of TLDI 2003
  9. Lämmel, Ralf; Peyton-Jones, Simon (2004), "Scrap more boilerplate: reflection, zips, and generalised casts", Proceedings of ICFP 2004
  10. Cooke, Daniel; Rushton, Nelson (January 1993), "Iterative and Parallel Algorithm Design from High Level Language Traces", ICCS'05 Proceedings of the 5th International Conference on Computational Science, Part III: 891–894, doi:10.1007/11428862_132, ISBN 978-3-540-26044-8
  11. Cooke, Daniel; Rushton, Nelson (June 27–30, 2005), "SequenceL – An Overview of a Simple Language", Proceedings of the 2005 International Conference on Programming Languages and Compilers, PLC 2005
  12. Texas Multicore Technologies, Inc.
  13. Nemanich, Brad; Cooke, Daniel; Rushton, Nelson (2010), SequenceL: Transparency And Multi-Core Parallelisms (PDF), DAMP '10 Proceedings of the 5th ACM SIGPLAN workshop on Declarative Aspects of Multicore Programming, New York, NY, US: ACM, pp. 45–52, archived from the original (PDF) on 2017-02-02, retrieved 2017-01-26
  14. Cooke, Daniel; Rushton, Nelson (June 27–30, 2005), "SequenceL – An Overview of a Simple Language", Proceedings of the 2005 International Conference on Programming Languages and Compilers, PLC 2005
  15. Intel Threaded Building Blocks (TBB)

बाहरी संबंध