ऐरे प्रोग्रामिंग

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

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

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

केनेथ ई. इवरसन ने ऐरे प्रोग्रामिंग (वास्तव में एपीएल का संदर्भ देते हुए) के पीछे के तर्क का वर्णन इस प्रकार किया: "most programming languages are decidedly inferior to mathematical notation and are little used as tools of thought in ways that would be considered significant by, say, an applied mathematician. The thesis is that the advantages of executability and universality found in programming languages can be effectively combined, in a single coherent language, with the advantages offered by mathematical notation. it is important to distinguish the difficulty of describing and of learning a piece of notation from the difficulty of mastering its implications. For example, learning the rules for computing a matrix product is easy, but a mastery of its implications (such as its associativity, its distributivity over addition, and its ability to represent linear functions and geometric operations) is a different and much more difficult matter.

Indeed, the very suggestiveness of a notation may make it seem harder to learn because of the many properties it suggests for explorations.

[...] Users of computers and programming languages are often concerned primarily with the efficiency of execution of algorithms, and might, therefore, summarily dismiss many of the algorithms presented here. Such dismissal would be short-sighted since a clear statement of an algorithm can usually be used as a basis from which one may easily derive a more efficient algorithm."

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

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

उपयोग
ऐरे प्रोग्रामिंग अंतर्निहित समानांतरीकरण के लिए बहुत उपयुक्त है; आजकल बहुत शोध का विषय है। इसके अलावा, 1997 के बाद विकसित और उत्पादित इंटेल और संगत सीपीयू में विभिन्न निर्देश सेट एक्सटेंशन शामिल थे, जो एमएमएक्स (निर्देश सेट) से शुरू होकर xxx 3 और 3डीनाउ! तक जारी थे, जिसमें अल्पविकसित एकल निर्देश, एकाधिक डेटा सरणी क्षमताएं शामिल थीं। ऐरे प्रसंस्करण समानांतर कंप्यूटिंग से अलग है जिसमें एक भौतिक प्रोसेसर एक साथ वस्तुओं के समूह पर संचालन करता है जबकि समानांतर प्रसंस्करण का उद्देश्य एक बड़ी समस्या को छोटे लोगों (एकाधिक निर्देश, कई डेटा) में विभाजित करना है ताकि कई प्रोसेसर द्वारा टुकड़ों में हल किया जा सके। दो या दो से अधिक कोर वाले प्रोसेसर आज तेजी से आम हो रहे हैं।

भाषाएँ
सरणी प्रोग्रामिंग भाषाओं के विहित उदाहरण फोरट्रान, एपीएल (प्रोग्रामिंग भाषा), और जे (प्रोग्रामिंग भाषा) हैं। अन्य में शामिल हैं: ए+ (प्रोग्रामिंग भाषा)|ए+, एनालिटिका (सॉफ्टवेयर), चैपल (प्रोग्रामिंग भाषा), आईडीएल (प्रोग्रामिंग भाषा), जूलिया (प्रोग्रामिंग भाषा), के (प्रोग्रामिंग भाषा), क्लोंग, क्यू (केएक्स सिस्टम्स सैक प्रोग्रामिंग भाषा), MATLAB, GNU ऑक्टेव, साइलैब, फ्रीमैट, पर्ल डेटा लैंग्वेज, R (प्रोग्रामिंग लैंग्वेज), S-लैंग (प्रोग्रामिंग लैंग्वेज)|S-लैंग, SAC प्रोग्रामिंग लैंग्वेज, Nial प्रोग्रामिंग लैंग्वेज, ZPL (प्रोग्रामिंग लैंग्वेज), फ़्यूथर्क (प्रोग्रामिंग लैंग्वेज) ), और टीआई-बेसिक।

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

भाषाओं की सारणी
सरणी भाषाओं में, स्केलर और सरणियों दोनों पर लागू होने के लिए संचालन को सामान्यीकृत किया जाता है। इस प्रकार, a+b दो अदिशों के योग को व्यक्त करता है यदि a और b अदिश हैं, या दो सरणियों के योग को व्यक्त करता है यदि वे सारणी हैं।

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

अदा
पिछला C कोड Ada (प्रोग्रामिंग भाषा) भाषा में निम्नलिखित बन जाएगा, जो ऐरे-प्रोग्रामिंग सिंटैक्स का समर्थन करता है।

एपीएल
एपीएल बिना वाक्यात्मक शर्करा के एकल वर्ण यूनिकोड प्रतीकों का उपयोग करता है। यह ऑपरेशन किसी भी रैंक (रैंक 0 सहित) के सरणियों और एक स्केलर और एक ऐरे पर काम करता है। Dyalog APL संवर्धित असाइनमेंट के साथ मूल भाषा का विस्तार करता है:

एनालिटिका
एनालिटिका एडा के समान ही अभिव्यक्ति की अर्थव्यवस्था प्रदान करती है।  ए := ए + बी; 

बुनियादी
डार्टमाउथ बेसिक के तीसरे संस्करण (1966) में मैट्रिक्स और ऐरे हेरफेर के लिए MAT स्टेटमेंट थे।

माता
था की मैट्रिक्स प्रोग्रामिंग भाषा माता ऐरे प्रोग्रामिंग का समर्थन करती है। नीचे, हम जोड़, गुणन, एक मैट्रिक्स और एक अदिश का जोड़, तत्व दर तत्व गुणन, सबस्क्रिप्टिंग और माता के कई व्युत्क्रम मैट्रिक्स कार्यों में से एक का वर्णन करते हैं।

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

ए * बी;

इसके विपरीत, प्रवेश-वार उत्पाद को इस प्रकार कार्यान्वित किया जाता है:

ए .* बी;

समान संख्या में तत्वों वाले दो मैट्रिक्स के बीच आंतरिक उत्पाद को सहायक ऑपरेटर के साथ कार्यान्वित किया जा सकता है, जो किसी दिए गए मैट्रिक्स को एक कॉलम वेक्टर और  खिसकाना  ऑपरेटर में दोबारा आकार देता है  :

ए' * बी;

rasql
Rasdaman#Raster क्वेरी भाषा एक डेटाबेस-उन्मुख सरणी-प्रोग्रामिंग भाषा है। उदाहरण के लिए, निम्नलिखित क्वेरी के साथ दो सरणियाँ जोड़ी जा सकती हैं:

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

गणितीय तर्क और भाषा संकेतन
मैट्रिक्स लेफ्ट-डिवीजन ऑपरेटर मैट्रिक्स के कुछ अर्थ संबंधी गुणों को संक्षेप में व्यक्त करता है। जैसे कि अदिश समतुल्य में, यदि (निर्धारक) गुणांक (मैट्रिक्स)  शून्य नहीं है तो (वेक्टोरियल) समीकरण को हल करना संभव है   के व्युत्क्रम मैट्रिक्स द्वारा दोनों पक्षों को बाएँ-गुणा करके  :   (MATLAB और GNU ऑक्टेव दोनों भाषाओं में:  ). निम्नलिखित गणितीय कथन कब लागू होते हैं  एक मैट्रिक्स रैंक#गुण वर्ग मैट्रिक्स है:
 * (मैट्रिक्स-गुणा साहचर्य)
 * (मैट्रिक्स-गुणा साहचर्य)

कहाँ  तुल्यता संबंधपरक ऑपरेटर है. पिछले कथन भी वैध MATLAB अभिव्यक्ति हैं यदि तीसरे को दूसरों से पहले निष्पादित किया जाता है (राउंड-ऑफ त्रुटियों के कारण संख्यात्मक तुलना गलत हो सकती है)।

यदि सिस्टम अतिनिर्धारित है - तो वह  इसमें स्तंभों की तुलना में अधिक पंक्तियाँ हैं - छद्म व्युत्क्रम   (MATLAB और GNU ऑक्टेव भाषाओं में:  ) व्युत्क्रम को प्रतिस्थापित कर सकता है , निम्नलिखित नुसार:
 * (मैट्रिक्स-गुणा साहचर्य)
 * (मैट्रिक्स-गुणा साहचर्य)

हालाँकि, ये समाधान न तो सबसे संक्षिप्त हैं (उदाहरण के लिए अभी भी अतिनिर्धारित प्रणालियों को उल्लेखनीय रूप से अलग करने की आवश्यकता बनी हुई है) और न ही सबसे कम्प्यूटेशनल रूप से कुशल हैं। अदिश समतुल्य पर दोबारा विचार करने पर बाद वाला बिंदु समझना आसान है, जिसके लिए समाधान   अधिक कुशल के बजाय दो ऑपरेशनों की आवश्यकता होगी. समस्या यह है कि आम तौर पर मैट्रिक्स गुणन क्रमविनिमेयता नहीं है क्योंकि मैट्रिक्स मामले में अदिश समाधान के विस्तार के लिए आवश्यकता होगी:
 * (मैट्रिसेस के लिए क्रमपरिवर्तनशीलता मान्य नहीं है!)
 * (साहचर्य मैट्रिक्स के लिए भी लागू होता है)
 * (साहचर्य मैट्रिक्स के लिए भी लागू होता है)

MATLAB भाषा लेफ्ट-डिवीजन ऑपरेटर का परिचय देती है  अदिश मामले के साथ सादृश्य के आवश्यक भाग को बनाए रखने के लिए, इसलिए गणितीय तर्क को सरल बनाना और संक्षिप्तता को संरक्षित करना:
 * (सहयोगिता आव्यूहों के लिए भी मान्य है, क्रमविनिमेयता की अब आवश्यकता नहीं है)
 * (सहयोगिता आव्यूहों के लिए भी मान्य है, क्रमविनिमेयता की अब आवश्यकता नहीं है)

यह न केवल कोडिंग के दृष्टिकोण से बल्कि कम्प्यूटेशनल दक्षता परिप्रेक्ष्य से संक्षिप्त सरणी प्रोग्रामिंग का एक उदाहरण है, जो कई सरणी प्रोग्रामिंग भाषाओं में काफी कुशल रैखिक बीजगणित पुस्तकालयों जैसे स्वचालित रूप से ट्यून किए गए रैखिक बीजगणित सॉफ्टवेयर या LAPACK से लाभ उठाता है। इवरसन के पिछले उद्धरण पर लौटते हुए, इसके पीछे का तर्क अब स्पष्ट होना चाहिए: "it is important to distinguish the difficulty of describing and of learning a piece of notation from the difficulty of mastering its implications. For example, learning the rules for computing a matrix product is easy, but a mastery of its implications (such as its associativity, its distributivity over addition, and its ability to represent linear functions and geometric operations) is a different and much more difficult matter.

Indeed, the very suggestiveness of a notation may make it seem harder to learn because of the many properties it suggests for explorations."

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

यह भी देखें

 * सारणी काटना
 * प्रकार के अनुसार प्रोग्रामिंग भाषाओं की सूची#सरणी भाषाएँ

बाहरी संबंध

 * "No stinking loops" programming
 * Discovering Array Languages