Agentno nizno orijentisano programiranje

S Vikipedije, slobodne enciklopedije

U informatici, nizni programski jezik (takođe poznat kao vektorski ili multidimenzionalni jezik) generalizuje radom skalarima da se transparentno odnose na vektore, matrice, i više dimenzija nizova.

Nizno programske primitive koncizno izražavaju široke ideje o manipulaciji podataka. Nivo sažetosti može biti dramatičan u određenim slučajevima: nije neuobičajeno da naiđe na niz u programskom jeziku (jednolinijski izraz) koji zahteva više stranica Java koda.[1]

Moderni programski jezici koji podržavaju arrai programiranje se obično koriste u naučnim i inženjerskim podešavanjima; što uključuje Fortran 90, MATLAB, Analitika, TK Solver (kao liste), Oktava, R, Cilk Plus, Julija, i NumPi proširenje Pajton. U tim jezicima, operacija koja posluje na celim nizovima se može nazvati vektorski rad,[2] bez obzira na to da li se izvršava na vektor procesora ili ne.

Koncepti[uredi | uredi izvor]

Osnovna ideja koja stoji iza niza programa je da operacije primenjuju na jedan čitav niz vrednosti. To čini programski model na visokom nivou, jer omogućava programerima da misle i rade na celim agregatima podataka, bez potrebe da pribegavaju eksplicitnim petljama pojedinih skalarnih operacija.

Ajverson je opisao[3] razloge iza niza programa (zapravo se odnosi na APL) na sledeći način:

većina programskih jezika su definitivno inferiorni u odnosu na matematičku notaciju i malo se koriste kao oruđe misli na način koji bi bio značajno razmatran, recimo, primena matematičara. [...]

Teza [...] je da se prednosti izvršenja i univerzalnosti koja se nalaze u programskim jezicima mogu efikasno kombinovati u jednom koherentnom jeziku, sa prednostima koje nudi matematička notacija. [...] Važno je razlikovati teškoće opisa i učenja komada notacije od težine savladavanja njene implikacije. Na primer, učenje pravila za izračunavanje matrice proizvoda je lako, ali majstorstvo njegovih implikacija (poput asocijativnosti, distributivnosti preko toga, i njegove sposobnosti da zastupa linearne funkcije i geometrijske operacije) je drugačija i mnogo teža stvar.

Zaista, veoma sugestivna napomenom može da izgleda teže zbog mnogih osobinama i zato predlaže da se istražuje.

Korisnici kompjutera i programskih jezika se često prvenstveno bave efikasnim izvršenjem algoritama, i mogu dakle, po kratkom postupku odbaciti mnoge od algoritama koji su ovde. Takav otkaz će biti kratkovid, jer jasna izjava algoritma se obično može koristiti kao osnova iz koje se lako mogu nastati efikasniji algoritmi.

Osnova iza niza programa i razmišljanja je da pronađe i iskoristi svojstva podataka u kojoj su pojedini elementi slični, ili neposredni. Za razliku od objekta orijentacije koja implicitno razgrađuje podatke na svoje sastavne delove (ili skalarne količine), arrai orijentacija gleda podatake grupe i primenjuje uniformisano rukovanje.

Funkcija rang je važan koncept u nizu programskih jezika uopšte, po analogiji kao tenzor čin u matematici: funkcije koje posluju na podatku mogu se klasifikovati po broju dimenzija koje deluju. Obično množenje, na primer, je skalar rangirana funkcija, jer radi sa nula-dimenzionalnim podacima (pojedinačni brojevi). Operacija krst proizvod je primer vektor rang funkcije, jer deluje na vektore, a ne skalare. Množenje matrica je primer 2-rang funkcije, jer radi na 2-dimenzionalna objekata (matrica). Skupi operateri smanjuju dimenzionalnost niza podataka ulazom sa jednim ili više dimenzija. Na primer, sabiranje preko elemenata kolabira ulazni niz od 1 dimenzije.

Koristi[uredi | uredi izvor]

Arrai programiranje je veoma pogodno za implicitnu paralelizaciju; tema mnogih istraživanja danas. Dalje, Intel i kompatibilni procesori razvijeni i proizvedeni posle 1997. sadrže različiti skup instrukcija proširenja, počevši od MMX pa sve do SSSE3 i 3DNow!, koji uključuju rudimentarne SIMD arrai sposobnosti. Obrada niza se razlikuje od paralelnog procesiranja i da jedan fizički procesor obavlja poslove više grupnih stavki istovremeno, dok paralelno procesiranje ima za cilj da podeli veći problem u manje (MIMD) i da se parcijalno rešavaju manji problemi. Procesori sa dva ili više jezgara su sve češća pojava danas.

Jezici[uredi | uredi izvor]

Kanonski primeri niza programskih jezika su APL, J i Fortran. Drugi obuhvataju: D, A +, Analtika, IDL, K, Mathematica, MATLAB, MOLSF, NumPi, GNU Octave, PDL, R, S-Lang, SAC, NiAl i ZPL.

Skalarni jezici[uredi | uredi izvor]

U skalarnim jezicima kao što su C i Paskal, operacije se odnose samo na pojedinačne vrednosti, pa a + b izražava dodavanje dva broja. U takvim jezicima, dodajući jednan u niz na drugi zahteva indeksiranje i petlje, što je neefikasno za izvršavanje, i monotono pri kodiranju, te su moguće greške.

for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
        a[i][j] += b[i][j];

Arrai jezici[uredi | uredi izvor]

U arrai jezicima, operacije se generalizuju da se prijave na oba skalara i niza. Tako, a + b izražava zbir dva skalara ako su a i b skalari, ili zbir dva polja ukoliko su nizovi.

Niz jezika olakšava programiranje, ali verovatno po ceni poznatoj kao apstrakcije kazne.[4][5][6]Pošto se dodaci izvode u izolaciji od ostatka kodiranja, oni ne mogu proizvesti optimalan najefikasniji kod. (Na primer, slike drugih elemenata istog niza mogu se naknadno sresti u istom izvršenju, dovodi do nepotrebnog ponavljanja lookups.) Čak i najsofisticiranija optimizacija kompajlera će izuzetno teško objediniti dve ili više naizgled različitih funkcija koje bi mogle da se pojave u drugačijim programskim sekcijama ili pod-rutine, iako programer može lako uraditi, sakupljajući sume na istom prolazu preko niza minimiziranja iznad glave).

Ada[uredi | uredi izvor]

Prethodni C kod će postati sledeći na Adi jeziku,[7] koji podržava niz-programiranja sintakse.

 A := A + B;

Analitika[uredi | uredi izvor]

Analitika obezbeđuje istu ekonomiju izražavanja kao kod Ade.

 A := A + B;

Ova operacija radi operande, A ili B, su skalari ili nizovi sa jednim ili više dimenzija. Svaka dimenzija je identifikovana indeksna varijabla, koja kontroliše prirodu operacije. Rezultat je ujedinjenje dimenzija operande. Ako A i B imaju iste dimenzije (indeksi), rezultat su te iste dimenzije. Ako su A i B vektori sa različitim dimenzijama, dobijeni A je 2-dimenzionalni, koji sadrži obe dimenzije, sa svakim elementom zbir odgovarajućih vrednosti A i B. Promenljiva A mora biti lokalna promenljiva; Analitika, kao deklarativan jezik, izbegava neželjena dejstva onemogućavanjem zadataka globalnih varijabli.

BASIC[uredi | uredi izvor]

Dartmut osnove ili MAT izjave za matrice su nizovi manipulacija u svom trećem izdanju (1966).

 DIM A(4),B(4),C(4)
 MAT A = 1
 MAT B = 2*A
 MAT C = A + B
 MAT PRINT A,B,C

MATLAB[uredi | uredi izvor]

Realizacija u MATLAB omogućava istu privredu dozvoljenu pomoću Ada jezika.

A = A + B;

Varijanta MATLAB jezika GNU Oktava jezika, koja se prostire na originalnom jeziku sa pojačanim zadacima:

A += B;

I MATLAB i GNU Oktava izvorno podržava linearne algebarske operacije kao što su matrice umnožavanjem, matrice inverzije, i numeričko rešenje sistema linearnih jednačina, čak i koristeći Moore–Penrose pseudoinverse. [8][9]

Nial primer unutrašnjeg proizvoda dva niza može se realizovati pomoću množenja matrica operatora. Ako je A vektor vrste veličine [1] i B je odgovarajuća kolona vektor veličine [n 1].

a * b;

Unutrašnji Proizvod između dve matrice ima isti broj elemenata koji se mogu realizovati pomoćnim operatorima ( : ), koji preoblikuju datu matricu u vektor kolone, i transponuju operator ' :

A(:)' * B(:);

raskl[uredi | uredi izvor]

Jezik rasdaman pita agentno-nizno orijentisano programiranje. Na primer, dva niza se mogu dodati sa sledećim upitom:

SELECT A + B
FROM A, B

Matematičko rasuđivanje i jezik notacija[uredi | uredi izvor]

Operater matrica leva podela koncizno izražava neke semantičke osobine matrica. Kao i u skalarno ekvivalentnim, ako (determinanta) koeficijent (Matrik) A nije nula onda je moguće da se reši (vektorska) jednačina a * x = b levo-množenjem obe strane inverzije A: A -1 (u oba MATLAB i GNU Octave jezika: A ^ -1). Sledeći matematičke izjave držite kada A je puna rang kvadratna matrica:

A^-1 *(A * x) == A^-1 * (b)
(A^-1 * A)* x == A^-1 * b      (matrica-množenje asocijativnost)
x = A^-1 * b

gde == je ekvivalentno relativnom operateru. U prethodnoj izjavi važe i MATLAB izrazi ako se treći izvršava pre ostalih (numerički poređenja mogu biti lažna, zbog okruglih off grešaka).

Ako je sistem naglašeni - tako da A ima više redova nego kolona - za pseudoinverse A + (u MATLAB i GNU Octave jezicima: pinv (a)) može zameniti inverziju A-1, kao što sledi:

pinv(A) *(A * x) == pinv(A) * (b)
(pinv(A) * A)* x == pinv(A) * b       (matrica-množenje asocijativnost)
x = pinv(A) * b

Međutim, ova rešenja nisu ni najkonciznija (npr ostaje potreba da se notationally razlika naglašenih sistema), niti najviše računski efikasna. Ovu poslednju poentu je lako razumeti kada se ponovo razmatra skalarna ekvivalentnost a * x = b, za koje bi rešenje x = a ^ -1 * b zahteva dve operacije, umesto efikasnije x = b / a. Problem je u tome što uglavnom matrice množenja nisu komutativne kao proširenje skalarnog rešenja u slučaju matrice bi zahtevalo:

(a * x)/ a == b / a
(x * a)/ a == b / a             (komunikativnsot ne važi za matrice!)
x * (a / a) == b / a      
(asociativnos ne važi takođe za matrice!)
x = b / a

MATLAB jezik uvodi operatera leve podele \ da održi suštinski deo analogije sa skalarnim slučajem, dakle pojednostavljuje matematičko rasuđivanje i očuvanje sažetosti:

A \ (A * x) == A \ b
(A \ A)* x == A \ b       (asocijativnost takođe važi i za matrice, komunikativnost nije više obavezna)
x = A \ b

Ovo nije samo primer sažet iz niza programa kodirane tačke gledišta, ali i iz izračunavanja efikasnosti perspektive, koja se u nekoliko nizova programskim jezicima koristi od veoma efikasnih linearnih algebarskih biblioteka, kao što su ATLAS ili LAPACK[10][11]

Povratak na prethodni citat od Iverson, obrazloženje za njega sada bi trebalo da bude jasno:

Biblioteke trećih lica[uredi | uredi izvor]

Korišćenje specijalizovanih i efikasnih biblioteka da pruže veći sažetak apstrakcije je takođe uobičajeno u drugim programskim jezicima. U C ++ nekoliko linearnih algebri biblioteka će iskoristi mogućnost jezika za preopterećenje operatora. Zanimljivo je primetiti da je u nekim slučajevima veoma kratka apstrakcija na tim jezicima je izričito uticajem paradigme programiranja niza, pošto Armadillo i Blitz ++ biblioteke rade.[12][13]

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ Michael Schidlowsky. „Java and K”. Pristupljeno 23. 1. 2008. 
  2. ^ Stéfan van der Walt; S. Chris Colbert; Varoquaux, Gaël (2011). „The NumPy array: a structure for efficient numerical computation”. Computing in Science and Engineering. IEEE. 
  3. ^ Iverson, K. E. (1980). „Notations as a Tool of Thought.”. Communications of the ACM. 23 (8): 444—465. doi:10.1145/358896.358899. Arhivirano iz originala 20. 09. 2013. g. Pristupljeno 22. 3. 2011. 
  4. ^ Surana P (2006). „Meta-Compilation of Language Abstractions.” (PDF). Arhivirano iz originala (PDF) 17. 02. 2015. g. Pristupljeno 17. 3. 2008. 
  5. ^ Kuketayev. „The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java.”. Arhivirano iz originala 11. 01. 2009. g. Pristupljeno 17. 3. 2008. 
  6. ^ Chatzigeorgiou; Stephanides (2002). „Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages”. Ur.: Blieberger; Strohmeier. Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002. Springer. str. 367. ISBN 978-3-540-43784-0. 
  7. ^ Ada Reference Manual: G.3.1 Real Vectors and Matrices
  8. ^ „GNU Octave Manual. Arithmetic Operators.”. Pristupljeno 19. 3. 2011. 
  9. ^ „MATLAB documentation. Arithmetic Operators.”. Arhivirano iz originala 07. 09. 2010. g. Pristupljeno 19. 3. 2011. 
  10. ^ „GNU Octave Manual. Appendix G Installing Octave.”. Pristupljeno 19. 3. 2011. 
  11. ^ „Mathematica 5.2 Documentation. Software References.”. Pristupljeno 19. 3. 2011. 
  12. ^ „Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax.”. Pristupljeno 19. 3. 2011. 
  13. ^ „Blitz++ User's Guide. 3. Array Expressions.”. Arhivirano iz originala 23. 03. 2011. g. Pristupljeno 19. 3. 2011. 

Literatura[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]