Content deleted Content added
Jason Quinn (talk | contribs) →Scalar languages: mentioned how vectorization shows up in C |
mNo edit summary Tags: Reverted Visual edit |
||
Line 1:
{{Programming paradigms}}در [[Computer science|علوم کامپیوتر]] ، برنامه نویسی آرایه به راه حلهایی اطلاق می شود که اجازه می دهد اعمال را برای یک مجموعه کامل از مقادیر همزمان انجام دهید. اینگونه راه حلها معمولاً در محیطهای [[Computational science|علمی]] و [[Engineering|مهندسی]] مورد استفاده قرار می گیرند.
==مفهوم آرایه ها==
The fundamental idea behind array programming is that operations apply at once to an entire set of values. This makes it a [[high-level programming language|high-level programming]] model as it allows the programmer to think and operate on whole aggregates of data, without having to resort to explicit loops of individual scalar operations.
[[Kenneth E. Iverson]] described the rationale behind array programming (actually referring to APL) as follows:<ref name=":0">{{cite journal |author= Iverson, K. E. |title= Notations as a Tool of Thought. |journal= Communications of the ACM |volume= 23 |issue= 8 |pages= 444–465 |year= 1980 |url= http://www.jsoftware.com/papers/tot.htm |access-date= 2011-03-22 |doi= 10.1145/358896.358899 |archive-url= https://web.archive.org/web/20130920071911/http://www.jsoftware.com/papers/tot.htm |archive-date= 2013-09-20 |url-status= dead |author-link= Kenneth E. Iverson |doi-access= free }}</ref>
ایده اساسی در پشت برنامه نویسی آرایه این است که عملیات به یک باره برای کل مجموعه مقادیر اعمال می شود. این امر آن را به یک مدل [[High-level programming language|برنامه نویسی سطح بالا]] تبدیل می کند زیرا به برنامه نویس اجازه می دهد تا روی کل جمع آوری داده ها فکر کند و کار کند ، بدون اینکه به حلقه های صریح عملیات اسکالر جداگانه متوسل شود.[[Kenneth E. Iverson]] دلیل اصلی برنامه نویسی آرایه (در واقع اشاره به APL) را به شرح زیر شرح داد:<ref name=":0" />
{{quote|اکثر زبانهای برنامه نویسی نسبت به نت ریاضی فراتر هستند و از آنها به عنوان ابزاری برای اندیشه استفاده نمی کنند ، مثلاً یک ریاضیدان کاربردی آنها را قابل توجه می داند.
تز این است که مزایای قابلیت اجرا و جهانی بودن در زبان های برنامه نویسی را می توان به طور موثر ، در یک زبان منسجم واحد با مزایای ارائه شده توسط نت ریاضی ترکیب کرد. مهم است که دشواری توصیف و یادگیری قطعه ای از نت را از دشواری تسلط بر پیامدهای آن تشخیص دهیم. به عنوان مثال ، یادگیری قوانین محاسبه یک محصول ماتریس آسان است ، اما تسلط بر پیامدهای آن (مانند ارتباط آن ، توزیع آن بر روی جمع ، و توانایی آن در نمایش توابع خطی و عملیات هندسی) یک مسئله متفاوت و بسیار دشوارتر است .
در واقع ، خود پیشنهادی بودن یک نت به دلیل خواص زیادی که برای اکتشافات به شما پیشنهاد می دهد ، یادگیری آن را دشوارتر نشان می دهد.
[...]
کاربران رایانه ها و زبان های برنامه نویسی غالباً در درجه اول به کارآیی اجرای الگوریتم ها توجه دارند و بنابراین ، ممکن است به طور خلاصه بسیاری از الگوریتم های ارائه شده در اینجا را کنار بگذارند. چنین اخراجی کوته بینانه خواهد بود زیرا معمولاً می توان از بیان صحیح الگوریتم به عنوان مبنایی استفاده کرد که می توان به راحتی الگوریتمی کارآمدتر از آن استخراج کرد.}}
اساس برنامه نویسی و تفکر آرایه یافتن و بهره برداری از خصوصیات داده ها در جایی است که عناصر منفرد مشابه یا مجاور هستند. برخلاف جهت گیری شی object که به طور ضمنی داده ها را به قسمت های تشکیل دهنده آن تقسیم می کند (یا مقیاس های [[Scalar (computing)|مقیاس دار]]) ، جهت گیری آرایه به دنبال گروه بندی داده ها و اعمال یک دست زدن به یکنواخت است.
رتبه تابع یک مفهوم مهم برای زبانهای برنامه نویسی آرایه به طور کلی ، به قیاس با رتبه [[Tensor|تانسور]] در ریاضیات است: توابع که بر روی داده کار می کنند ، ممکن است براساس تعداد ابعادی که عمل می کنند ، طبقه بندی شوند. به عنوان مثال ضرب معمولی یک تابع دارای رتبه بندی مقیاسی است زیرا با داده های بعد صفر (اعداد منفرد) کار می کند. عملکرد [[Cross product|ضرب خارجی]] نمونه ای از یک تابع مرتبه برداری است زیرا از طریق بردارها عمل می کند نه مقیاس پذیرها. [[Matrix multiplication|ضرب ماتریس]] مثالی از یک تابع 2 درجه ای است ، زیرا روی اجسام 2 بعدی (ماتریس) عمل می کند. [[Reduce (higher-order function)|عملگرهای جمع آوری]] ابعاد آرایه داده ورودی را با یک یا چند بعد کاهش می دهند. به عنوان مثال ، جمع کردن عناصر ، آرایه ورودی را با 1 بعد جمع می کند.
==موارد استفاده==
برنامه نویسی آرایه برای [[Implicit parallelization|موازی سازی ضمنی]] بسیار مناسب است. امروزه موضوع بسیاری از تحقیقات است بعلاوه ، [[Intel|اینتل]] و پردازنده های سازگار پس از 1997 تولید و تولید شدند که حاوی پسوندهای مختلف مجموعه دستورالعمل ها بودند ، از [[MMX (instruction set)|MMX]] شروع می شوند و از طریق [[SSSE3]] و [[3DNow!|3DNow]] ادامه می یابند! که شامل قابلیت های اولیه آرایه [[SIMD]] هستند. پردازش آرایه از [[Parallel computing|پردازش موازی]] متمایز است به این دلیل که یک پردازنده فیزیکی به طور همزمان بر روی گروهی از موارد کار می کند در حالی که پردازش موازی با هدف تقسیم یک مسئله بزرگتر به مشکلات کوچکتر ([[MIMD]]) انجام می شود تا توسط پردازنده های متعدد به صورت قطعه ای حل شود. پردازنده های دارای دو یا چند هسته امروزه به طور فزاینده ای رایج شده اند.
The canonical examples of array programming languages are Fortran, APL, and J. Others include: [[A+ (programming language)|A+]], [[Analytica (software)|Analytica]], [[Chapel (programming language)|Chapel]], [[IDL (programming language)|IDL]], Julia, [[K (programming language)|K]], Klong, [[Q (programming language from Kx Systems)|Q]], Mata, [[MATLAB]], [[MOLSF]], NumPy, [[GNU Octave]], [[Perl Data Language|PDL]], R, [[S-Lang (programming language)|S-Lang]], [[SAC programming language|SAC]], [[Nial programming language|Nial]], [[ZPL (programming language)|ZPL]] and [[TI-BASIC]].▼
==
▲
===زبان های نرده ای (اسکالر)===
در زبانهای اسکالر مانند [[C (programming language)|C]] و [[Pascal (programming language)|Pascal]] ، اعمال فقط برای مقادیر منفرد اعمال می شوند ، بنابراین a + b بیانگر جمع دو عدد است. در چنین زبان هایی ، افزودن یک آرایه به دیگری به نمایه سازی و حلقه نیاز دارد ، کدگذاری آن خسته کننده است.
<syntaxhighlight lang="c">
for (i = 0; i < n; i++)
Line 34 ⟶ 37:
</syntaxhighlight>
در زبانهای مبتنی بر آرایه ، به عنوان مثال در Fortran ، حلقه تو در تو در بالا می تواند به صورت آرایه در یک خط نوشته شود.
<syntaxhighlight lang="fortran">
a = a + b
</syntaxhighlight>
یا به جای آن ، برای تأکید بر ماهیت آرایه اشیا
<syntaxhighlight lang="fortran">
a(:,:) = a(:,:) + b(:,:)
</syntaxhighlight>
در حالی که زبانهای اسکالر مانند C از عناصر برنامه نویسی آرایه بومی بعنوان بخشی از زبان مناسب برخوردار نیستند ، اما این بدان معنا نیست که برنامه های نوشته شده در این زبانها هرگز از تکنیک های اساسی بردارسازی (به عنوان مثال استفاده از [[SIMD|دستورالعمل های مبتنی بر بردار]] CPU در صورت استفاده از آن) استفاده نمی کنند. یا با استفاده از چندین هسته پردازنده). برخی از کامپایلرهای C مانند GCC در برخی از سطوح بهینه سازی ، بخشهایی از کد را که از نظر ابتکار عمل تعیین می کند ، شناسایی و بردار می کنند. روش دیگری توسط [[OpenMP]] API ارائه شده است ، که به شما امکان می دهد با استفاده از چندین هسته پردازنده ، بخشهای قابل اجرا از کد را موازی سازی کند.
===زبان های آرایه ای===
در زبان های آرایه ، عملکردها تعمیم داده می شوند که هم در مقیاس کش ها و هم در آرایه ها اعمال شوند. بنابراین ، a + b مجموع دو مقیاس دهنده را نشان می دهد اگر a و b مقیاس پذیر باشند ، یا مجموع دو آرایه اگر آرایه ای باشند.
====Ada (آدا)====
<syntaxhighlight lang="ada">
A := A + B;
</syntaxhighlight>
====APL (ای پی ال)====
APL از نمادهای Unicode تک کاراکتر و بدون قند نحوی استفاده می کند.
<syntaxhighlight lang="apl">
A ← A + B
</syntaxhighlight>
This operation works on arrays of any rank (including rank 0), and on a scalar and an array. Dyalog APL extends the original language with [[augmented assignment]]s:
این عملیات روی آرایه های با هر درجه (از جمله رتبه 0) و روی مقیاس و آرایه کار می کند. Dyalog APL زبان اصلی را با [[Augmented assignment|مقدار دهی افزوده]] گسترش می دهد:
<syntaxhighlight lang="apl">
A +← B
</syntaxhighlight>
====Analytica(آنالیتیکا)====
Analytica
<pre>
A := A + B;
</pre>
====BASIC(بیسیک)====
[[Dartmouth BASIC|دارتموث BASIC]] در ویرایش سوم (1966) عبارات MAT برای دستکاری ماتریس و آرایه داشت.
<syntaxhighlight lang="basic">
DIM A(4),B(4),C(4)
Line 82 ⟶ 88:
</syntaxhighlight>
====Mata(ماتا)====
زبان برنامه نویسی ماتریس [[Stata|استاتا]] Mata از برنامه نویسی آرایه پشتیبانی می کند. در زیر ، جمع ، ضرب ، جمع ماتریس و مقیاس ، ضرب عنصر به عنصر ، اشتراک و یکی از بسیاری از توابع ماتریس معکوس ماتا را نشان می دهیم.
<syntaxhighlight lang="stata">
. mata:
Line 105 ⟶ 111:
+-------------+
: C = J(3,2,1) //
: C
Line 151 ⟶ 157:
+-----------+
: H = F[(2\1), (1, 2)] //
: //
: H
1 2
Line 161 ⟶ 167:
+-----------+
: I = invsym(F'*F) //
: //
: I
[symmetric]
Line 176 ⟶ 182:
</syntaxhighlight>
====MATLAB(متلب)====
<syntaxhighlight lang="matlab">
A = A + B;
</syntaxhighlight>
نوع زبان MATLAB زبان [[GNU Octave]] است که زبان اصلی را با تکالیف افزوده گسترش می دهد:
<syntaxhighlight lang="octave">
A += B;
</syntaxhighlight>هر دو MATLAB و GNU Octave بومی عمل جبر خطی مانند ضرب ماتریس ، [[Matrix inversion|وارونگی ماتریس]] و حل عددی [[System of linear equations|سیستم معادلات خط]]ی را پشتیبانی می کنند ، حتی با استفاده از [[Moore–Penrose pseudoinverse|شبه مقبره مور-پنرو]]ز.
نمونه [[Nial]] از محصول داخلی دو آرایه را می توان با استفاده از عملگر ضرب ماتریس بومی پیاده سازی کرد. اگر a بردار ردیفی به اندازه [1 n] و b باشد یک بردار ستونی مربوط به اندازه [n 1] است.
a * b;
محصول داخلی بین دو ماتریس که تعداد عناصر یکسانی دارند را می توان با عملگر کمکی (:) ، که یک ماتریس داده شده را به بردار ستون تغییر شکل می دهد ، و عملگر [[Transpose|انتقال]] را پیاده سازی کرد ' :
A(:)' * B(:);
====rasql====
[[Rasdaman|زبان پرس و جو rasdaman]] یک زبان برنامه نویسی آرایه ای پایگاه داده است. به عنوان مثال ، می توان دو آرایه را با درخواست زیر اضافه کرد:
<syntaxhighlight lang="sql">
SELECT A + B
Line 205 ⟶ 211:
====R====
زبان R به طور پیش فرض از الگوی آرایه پشتیبانی می کند. مثال زیر فرایند ضرب دو ماتریس و به دنبال آن اضافه کردن یک اسکالر (که در واقع یک بردار یک عنصر است) و یک بردار را نشان می دهد:
<syntaxhighlight lang="r">
> A <- matrix(1:6, nrow=2) !!
> A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> B <- t( matrix(6:1, nrow=2) ) # t()
> B
[,1] [,2]
Line 228 ⟶ 234:
[1,] 29 20
[2,] 41 29
> D + c(1, 1) # c()
[,1] [,2]
[1,] 30 21
Line 234 ⟶ 240:
</syntaxhighlight>
== استدلال ریاضی و علامت گذاری زبان ==
The matrix left-division operator concisely expresses some semantic properties of matrices. As in the scalar equivalent, if the ([[determinant]] of the) coefficient (matrix) <code>A</code> is not null then it is possible to solve the (vectorial) equation <code>A * x = b</code> by left-multiplying both sides by the [[matrix inversion|inverse]] of <code>A</code>: <code>A<sup>−1</sup></code> (in both MATLAB and GNU Octave languages: <code>A^-1</code>). The following mathematical statements hold when <code>A</code> is a [[matrix rank#Properties|full rank]] [[square matrix#Square matrices|square matrix]]:
عملگر تقسیم چپ ماتریس به طور خلاصه برخی از خصوصیات معنایی ماتریس ها را بیان می کند. همانند معادل اسکالر ، اگر ضریب (تعیین کننده) ضریب (ماتریس) A صفر نباشد ، می توان معادله (بردار) A * x = b را با ضرب چپ هر دو طرف [[Matrix inversion|برعکس]] A حل کرد: A −1 (به دو زبان MATLAB و GNU Octave: A ^ -1). عبارات ریاضی زیر هنگامی که A یک [[Square matrix|ماتریس مربع]] [[Matrix rank|درجه کامل]] است ، نگهداری می شوند:
:<code>A^-1 *(A * x)==A^-1 * (b)</code>
:<code>(A^-1 * A)* x ==A^-1 * b </code> (
:<code>x = A^-1 * b</code>
:
جایی که == عملگر رابطه ای [[Relational operator|معادل]] است. عبارات قبلی همچنین عبارات معتبر MATLAB هستند اگر عبارت سوم قبل از سایر موارد اجرا شود (مقایسه عددی ممکن است نادرست باشد به دلیل خطاهای دور زدن).
اگر سیستم بیش از حد تعیین شده باشد - به طوری که ردیف های A بیشتر از ستون ها باشد - شبه معکوس A + (به زبان MATLAB و GNU Octave: pinv (A)) می تواند معکوس A − 1 را جایگزین کند ، به شرح زیر:
:<code>pinv(A) *(A * x)==pinv(A) * (b)</code>
:<code>(pinv(A) * A)* x ==pinv(A) * b</code> (
:<code>x = pinv(A) * b</code>
با این حال ، این راه حل ها نه مختصر ترین راه حل ها هستند (به عنوان مثال هنوز نیاز به تمایز نمایی سیستم های بیش از حد تعیین شده وجود دارد) و نه کارآمدترین محاسبات. درک آخرین نکته در هنگام بررسی مجدد معادل اسکالر a * x = b آسان است ، که برای آن x = a ^ -1 * b راه حل به جای کارآمدتر x = b / a به دو عمل نیاز دارد. مسئله این است که به طور کلی ضربات ماتریس [[Commutativity|عوض نمی شوند]] زیرا گسترش محلول مقیاسی به حالت ماتریس نیاز دارد:
:<code>(a * x)/ a ==b / a</code>
:<code>(x * a)/ a ==b / a</code> (
:<code>x * (a / a)==b / a</code> (
:<code>x = b / a</code>
زبان MATLAB عملگر تقسیم چپ را معرفی می کند تا قسمت اصلی تشبیه را با مورد مقیاس حفظ کند ، بنابراین استدلال ریاضی را ساده می کند و خلاصه را حفظ می کند:
:<code>A \ (A * x)==A \ b</code>
:<code>(A \ A)* x ==A \ b</code> (
:<code>x = A \ b</code>
با بازگشت به نقل قبلی از ایورسون ، منطق موجود در آن اکنون باید مشهود باشد:{{quote|مهم است که دشواری توصیف و یادگیری قطعه ای از نت را از دشواری تسلط بر پیامدهای آن تشخیص دهیم. به عنوان مثال ، یادگیری قوانین محاسبه یک محصول ماتریس آسان است ، اما تسلط بر پیامدهای آن (مانند ارتباط آن ، توزیع آن بر روی جمع ، و توانایی آن در نمایش توابع خطی و عملیات هندسی) یک مسئله متفاوت و بسیار دشوارتر است .
در واقع ، خود پیشنهادی بودن یک نت به دلیل خواص زیادی که برای اکتشافات به شما پیشنهاد می دهد ، یادگیری آن را دشوارتر نشان می دهد.}}
==کتابخانه های شخص ثالث==
The use of specialized and efficient libraries to provide more terse abstractions is also common in other programming languages. In [[C++]] several linear algebra libraries exploit the language's ability to [[operator overloading|overload operators]]. In some cases a very terse abstraction in those languages is explicitly influenced by the array programming paradigm, as the [[Armadillo (C++ library)|Armadillo]] and [[Blitz++]] libraries do.<ref name=":1">{{cite web |title= Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax. |url= http://arma.sourceforge.net/docs.html#syntax |access-date= 2011-03-19}}</ref><ref name=":2">{{cite web |title= Blitz++ User's Guide. 3. Array Expressions. |url= http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |access-date= 2011-03-19 |archive-url= https://web.archive.org/web/20110323013142/http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |archive-date= 2011-03-23 |url-status= dead }}</ref>▼
استفاده از کتابخانه های تخصصی و کارآمد برای ارائه تجریدات مختصر در زبانهای برنامه نویسی نیز معمول است. در C ++ چندین کتابخانه جبر خطی از توانایی زبان در اضافه بار اپراتورها سو استفاده می کنند. در بعضی موارد ، انتزاع بسیار مختصر در آن زبانها به صراحت تحت تأثیر الگوی برنامه نویسی آرایه قرار می گیرد ، همانطور که کتابخانه های [[Armadillo (C++ library)|Armadillo]] و [[Blitz++|++Blitz]] این کار را می کنند..<ref name=":1" /><ref name=":2" />
▲The use of specialized and efficient libraries to provide more terse abstractions is also common in other programming languages. In [[C++]] several linear algebra libraries exploit the language's ability to [[operator overloading|overload operators]]. In some cases a very terse abstraction in those languages is explicitly influenced by the array programming paradigm, as the [[Armadillo (C++ library)|Armadillo]] and [[Blitz++]] libraries do.<ref>{{cite web |title= Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax. |url= http://arma.sourceforge.net/docs.html#syntax |access-date= 2011-03-19}}</ref><ref>{{cite web |title= Blitz++ User's Guide. 3. Array Expressions. |url= http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |access-date= 2011-03-19 |archive-url= https://web.archive.org/web/20110323013142/http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |archive-date= 2011-03-23 |url-status= dead }}</ref>
==همچنین ببینید==
*
*
==References==
|