زبان برنامه‌نویسی آرایه‌ای
در علوم کامپیوتر، برنامه‌نویسی آرایه ای به راه حل‌هایی اشاره دارد که برنامه‌ها می‌توانند توسط آن یک سری عملیات را بر یک مجموعه مقادیر اعمال کنند. اینگونه راه حلها معمولاً در محیطهای علمی و مهندسی مورد استفاده قرار می‌گیرند.
زبانهای برنامه‌نویسی مدرن که برنامه‌نویسی آرایه ای را پشتیبانی می‌کنند. (همچنین به عنوان زبانهای چند بعدی و برداری شناخته می‌شوند)
مهندسی شده‌اند که به‌طور خاص برای تعمیم عملیات در مقیاس به اعمال شفاف در بردارها، ماتریس‌ها، و آرایه‌های بعدی بالاتر. این موارد شامل APL , J، Fortran 90، Mata , MATLAB , Analytica , TK Solver (به صورت لیست)، Octave , R، Cilk Plus , Julia , Perl Data Language (PDL) و پسوند NumPy به پایتون است. در این زبانها، عملیاتی که روی کل آرایه‌ها عمل می‌کند را می‌توان یک عمل بردار نامید ، [۱] صرف نظر از اینکه روی پردازنده برداری اجرا می‌شود که دستورالعملهای برداری را اجرا می‌کند. برنامه‌نویسی آرایه به‌طور خلاصه ایده‌های گسترده‌ای را دربارهٔ دستکاری داده بیان می‌کند. سطح جمع‌بندی در موارد خاص می‌تواند چشمگیر باشد: یافتن زبان برنامه‌نویسی آرایه یک خطی که به چندین صفحه کد شی گرا نیاز دارد، غیرمعمول نیست.
رتبه تابع یک مفهوم مهم برای زبانهای برنامه‌نویسی آرایه به‌طور کلی، به قیاس با رتبه تانسور در ریاضیات است: توابع که بر روی داده‌ها کار می‌کنند، ممکن است براساس تعداد ابعادی که عمل می‌کنند، طبقه‌بندی شوند. به عنوان مثال ضرب معمولی، یک تابع دارای رتبه‌بندی مقیاسی است زیرا با داده‌های صفر بعدی (اعداد منفرد) کار می‌کند. عملکرد محصول متقاطع نمونه ای از یک تابع مرتبه برداری است زیرا از طریق بردارها عمل می‌کند نه مقیاس پذیرها. ضرب ماتریس مثالی از یک تابع ۲ درجه ای است، زیرا روی اشیا ۲ ۲ بعدی (ماتریس) عمل می‌کند. عملگرهای جمع‌آوری ابعاد آرایه داده ورودی را با یک یا چند بعد کاهش می‌دهند. به عنوان مثال، جمع کردن عناصر، آرایه ورودی را با ۱ بعد جمع می‌کند.
برنامه‌نویسی آرایه برای موازی سازی ضمنی بسیار مناسب است. امروزه موضوع بسیاری از تحقیقات است بعلاوه، اینتل و پردازنده‌های سازگار پس از ۱۹۹۷ تولید و تولید شدند که حاوی پسوندهای مختلف مجموعه دستورالعمل‌ها بودند، از MMX شروع می‌شوند و از طریق SSSE3 و 3DNow ادامه می‌یابند!، که شامل قابلیت‌های اولیه آرایه SIMD است. پردازش آرایه از پردازش موازی متمایز است به این دلیل که یک پردازنده فیزیکی به‌طور همزمان بر روی گروهی از موارد کار می‌کند در حالی که پردازش موازی با هدف تقسیم یک مسئله بزرگتر به مشکلات کوچکتر (MIMD) انجام می‌شود تا توسط پردازنده‌های متعدد به صورت قطعه ای حل شود. پردازنده‌های دارای دو یا چند هسته امروزه به‌طور فزاینده ای معمول هستند.
نمونه‌های متعارف زبان‌های برنامه‌نویسی آرایه Fortran، APL و J هستند. سایر موارد عبارتند از: A +، Analytica , Chapel , IDL، جولیا، K , Klong , Q، Mata، MATLAB , MOLSF، NumPy، GNU Octave , PDL، R , S-Lang , SAC , Nial , ZPL و TI-BASIC.
در زبانهای اسکالر مانند C و Pascal، اعمال فقط در مقادیر منفرد اعمال می‌شوند، بنابراین "a" + "b" جمع دو عدد را بیان می‌کند. در چنین زبان‌هایی، افزودن یک آرایه به دیگری به نمایه سازی و حلقه نیاز دارد، کدگذاری آن خسته کننده است. for (i = 0; i Fortran، حلقه تو در تو در بالا می‌تواند در قالب آرایه در یک خط نوشته شود، a = a + b یا به جای آن، برای تأکید بر ماهیت آرایه اشیا، a(:,:) = a(:,:) + b(:,:) در زبان‌های آرایه، عملکردها به گونه ای تعمیم یافته‌اند که هم در مقیاس کش‌ها و هم در آرایه‌ها اعمال می‌شوند؛ بنابراین، "a" + "b" مجموع دو مقیاس دهنده را نشان می‌دهد اگر "a" و "b" مقیاس آور باشند، یا مجموع دو آرایه را اگر آرایه ای باشند بیان می‌کند.
زبان آرایه برنامه‌نویسی را ساده می‌کند اما احتمالاً با هزینه ای است که به عنوان "جریمه انتزاع" شناخته می‌شود. از آنجا که اضافات جدا از بقیه برنامه‌نویسی انجام می‌شود، ممکن است کارآمدترین کد را تولید نکند. (به عنوان مثال، ممکن است متعاقباً در طی همان اجرا، اضافه شدن عناصر دیگر از همان آرایه، باعث جستجوهای مکرر غیرضروری شود) حتی پیچیده‌ترین کامپایلر بهینه‌سازی نیز در تلفیق دو یا چند عملکرد ظاهراً متفاوت که ممکن است در بخشهای مختلف برنامه یا زیر روال ظاهر شود، بسیار دشوار خواهد بود، حتی اگر یک برنامه‌نویس می‌تواند این کار را به راحتی انجام دهد، مبالغی را در همان عبور از آرایه جمع می‌کند برای به حداقل رساندن سربار)
کد C قبلی در زبان Ada به صورت زیر در می‌آید که از نحو برنامه‌نویسی آرایه پشتیبانی می‌کند. A := A + B; APL از نمادهای Unicode تک کاراکتر و بدون قند نحوی استفاده می‌کند. A ← A + B این عملیات روی آرایه‌های با هر درجه (از جمله رتبه ۰) و روی مقیاس و آرایه کار می‌کند. Dyalog APL زبان اصلی را با تکالیف افزوده گسترش می‌دهد: A +← B Analytica همان اقتصاد بیان Ada را فراهم می‌کند.
دارتموث BASIC در ویرایش سوم (۱۹۶۶) عبارات MAT برای دستکاری ماتریس و آرایه داشت. DIM A(4),B(4),C(4) MAT A = 1 MAT B = 2 * A MAT C = A + B MAT PRINT A,B,C Stata که زبان برنامه‌نویسی ماتریس برنامه‌نویسی ماتا پشتیبانی آرایه است. در زیر، جمع، ضرب، جمع ماتریس و مقیاس، ضریب عنصر به عنصر، اشتراک و یکی از بسیاری از توابع ماتریس معکوس ماتا را نشان می‌دهیم. . mata:
[symmetric]
پیاده‌سازی در MATLAB همان اقتصاد مجاز را با استفاده از زبان Fortran فراهم می‌کند. A = A + B; نوع دیگری از زبان MATLAB زبان GNU Octave است که زبان اصلی را با تکالیف افزوده گسترش می‌دهد: A += B; هر دو MATLAB و GNU Octave بومی عمل جبر خطی مانند ضرب ماتریس، وارونگی ماتریس و حل عددی سیستم معادلات خطی را پشتیبانی می‌کنند، حتی با استفاده از شبه معکوس مور-پنروز.
نمونه Nial از محصول داخلی دو آرایه را می‌توان با استفاده از عملگر ضرب ماتریس بومی پیاده‌سازی کرد. اگر codice_1 بردار ردیفی به اندازه [1 n] باشد و codice_2 بردار ستونی مربوط به اندازه [n 1] باشد. این محصول داخلی بین دو ماتریس نیاز به همان تعداد از عناصر را می‌توان با استفاده از عملگر کمکی اجرا codice_3 ، که باعث تغییر شکل یک ماتریس داده شده را به بردار، و ترانهاده اپراتور codice_4 :
زبان پرس و جو rasdaman یک زبان برنامه‌نویسی آرایه ای پایگاه داده است. به عنوان مثال، دو آرایه می‌توانند با پرس و جو زیر اضافه شوند: SELECT A + B FROM A, B
زبان R به‌طور پیش فرض از الگوی آرایه پشتیبانی می‌کند. مثال زیر فرایند ضرب دو ماتریس و به دنبال آن اضافه کردن یک اسکالر (که در واقع یک بردار یک عنصر است) و یک بردار را نشان می‌دهد: > A  A [1,] 1 3 5 [2,] 2 4 6 > B  B [1,] 6 5 [2,] 4 3 [3,] 2 1 > C  C [1,] 28 19 [2,] 40 28 > D  D [1,] 29 20 [2,] 41 29 > D + c(1, 1) # c() creates a vector [1,] 30 21 [2,] 42 30 عملگر تقسیم چپ ماتریس به‌طور خلاصه برخی از خصوصیات معنایی ماتریس‌ها را بیان می‌کند. همانند معادل اسکالر، اگر ضریب (تعیین کننده) ضریب (ماتریس) codice_5 صفر نباشد، می‌توان معادله (بردار) codice_6 با ضرب چپ هر دو طرف برعکس codice_5 : codice_8 (به دو زبان MATLAB و GNU Octave: codice_9). عبارات ریاضی زیر هنگامی که codice_5 یک ماتریس مربع درجه کامل است نگه داشته می‌شوند:
جایی که codice_14 عملگر رابطه ای برابر است. عبارات قبلی همچنین عبارات معتبر MATLAB هستند اگر عبارت سوم قبل از موارد دیگر اجرا شود (مقایسه عددی ممکن است نادرست باشد به دلیل خطاهای دور زدن).
اگر سیستم بیش از حد تعیین شده باشد - به طوری که codice_5 بیشتر از ستون‌ها باشد - معکوس شبه codice_8 (به زبان MATLAB و GNU Octave: codice_17) می‌تواند معکوس codice_8 را جایگزین کند، به شرح زیر:
با این حال، این راه حل‌ها نه مختصرترین راه حل‌ها هستند (به عنوان مثال هنوز هم نیاز به تمایز نمایی سیستم‌های بیش از حد تعیین شده باقی مانده است) و نه کارآمدترین محاسبات. درک آخرین نکته آسان است هنگام بررسی مجدد معادل اسکالر codice_22 ، که برای آن راه حل codice_23 codice_24 به دو عمل نیاز دارد. مشکل این است که به‌طور کلی ضرب ماتریس می مبادلهای به عنوان گسترش راه حل عددی به صورت ماتریس نیاز:
زبان MATLAB معرفی اپراتور چپ تقسیم codice_29 برای حفظ بخش اساسی از قیاس با مورد اسکالر، بنابراین ساده استدلال ریاضی و حفظ اختصار:
این نه تنها نمونه ای از برنامه‌نویسی آرایه مختصر از نظر کدگذاری بلکه از منظر کارایی محاسباتی است که در چندین زبان برنامه‌نویسی آرایه از کتابخانه‌های جبر خطی کاملاً کارآمد مانند ATLAS یا LAPACK سود می‌برد.
Returning to the previous quotation of Iverson, the rationale behind it should now be evident:
استفاده از کتابخانه‌های تخصصی و کارآمد برای ارائه تجریدات مختصر در سایر زبانهای برنامه‌نویسی نیز معمول است. در C ++ چندین کتابخانه جبر خطی از توانایی زبان در اضافه بار اپراتورها سو explo استفاده می‌کنند. در بعضی موارد ، انتزاع بسیار ناچیز در آن زبانها به صراحت تحت تأثیر الگوی برنامه‌نویسی آرایه قرار می‌گیرد، همان‌طور که کتابخانه‌های ++ Armadillo و Blitz این کار را می‌کنند.