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

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

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

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

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

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

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

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

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

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

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

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

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

सरणियों के आंतरिक उत्पाद का नियाल उदाहरण मूल आव्यूह गुणन ऑपरेटर का उपयोग करके कार्यान्वित किया जा सकता है। यदि  आकार का पंक्ति सदिश है [1 एन] और   आकार [एन 1] का संगत कॉलम सदिश है।

ए * बी;

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

ए .* बी;

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

ए' * बी;

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

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

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

कहाँ  तुल्यता संबंधपरक ऑपरेटर है.

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

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

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

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