Агентно низно оријентисано програмирање

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу

У информатици, низни програмски језик (такође познат као векторски или мултидимензионални језик) генерализује радом скаларима да се транспарентно односе на векторе, матрице, и више димензија низова.

Низно програмске примитиве концизно изражавају широке идеје о манипулацији података. Ниво сажетости може бити драматичан у одређеним случајевима: није неуобичајено да наиђе на низ у програмском језику (једнолинијски израз) који захтева више страница Јава кода.[1]

Модерни програмски језици који подржавају арраи програмирање се обично користе у научним и инжењерским подешавањима; што укључује Фортран 90, MATLAB, Аналитика, ТК Солвер (као листе), Октава, R, Цилк Плус, Јулија, и НумПи проширење Пајтон. У тим језицима, операција која послује на целим низовима се може назвати векторски рад,[2] без обзира на то да ли се извршава на вектор процесора или не.

Концепти[уреди]

Основна идеја која стоји иза низа програма је да операције примењују на један читав низ вредности. То чини програмски модел на високом нивоу, јер омогућава програмерима да мисле и раде на целим агрегатима података, без потребе да прибегавају експлицитним петљама појединих скаларних операција.

Ајверсон је описао[3] разлоге иза низа програма (заправо се односи на АПЛ) на следећи начин:

већина програмских језика су дефинитивно инфериорни у односу на математичку нотацију и мало се користе као оруђе мисли на начин који би био значајно разматран, рецимо, примена математичара. [...]

Теза [...] је да се предности извршења и универзалности која се налазе у програмским језицима могу ефикасно комбиновати у једном кохерентном језику, са предностима које нуди математичка нотација. [...] Важно је разликовати тешкоће описа и учења комада нотације од тежине савладавања њене импликације. На пример, учење правила за израчунавање матрице производа је лако, али мајсторство његових импликација (попут асоцијативности, дистрибутивности преко тога, и његове способности да заступа линеарне функције и геометријске операције) је другачија и много тежа ствар.

Заиста, веома сугестивна напоменом може да изгледа теже због многих особинама и зато предлаже да се истражује.

Корисници компјутера и програмских језика се често првенствено баве ефикасним извршењем алгоритама, и могу дакле, по кратком поступку одбацити многе од алгоритама који су овде. Такав отказ ће бити кратковид, јер јасна изјава алгоритма се обично може користити као основа из које се лако могу настати ефикаснији алгоритми.

Основа иза низа програма и размишљања је да пронађе и искористи својства података у којој су поједини елементи слични, или непосредни. За разлику од објекта оријентације која имплицитно разграђује податке на своје саставне делове (или скаларне количине), арраи оријентација гледа податаке групе и примењује униформисано руковање.

Функција ранг је важан концепт у низу програмских језика уопште, по аналогији као тензор чин у математици: функције које послују на податку могу се класификовати по броју димензија које делују. Обично множење, на пример, је скалар рангирана функција, јер ради са нула-димензионалним подацима (појединачни бројеви). Операција крст производ је пример вектор ранг функције, јер делује на векторе, а не скаларе. Множење матрица је пример 2-ранг функције, јер ради на 2-димензионална објеката (матрица). Скупи оператери смањују димензионалност низа података улазом са једним или више димензија. На пример, сабирање преко елемената колабира улазни низ од 1 димензије.

Користи[уреди]

Арраи програмирање је веома погодно за имплицитну паралелизацију; тема многих истраживања данас. Даље, Интел и компатибилни процесори развијени и произведени после 1997. садрже различити скуп инструкција проширења, почевши од ММX па све до СССЕ3 и 3DNow!, који укључују рудиментарне SIMD арраи способности. Обрада низа се разликује од паралелног процесирања и да један физички процесор обавља послове више групних ставки истовремено, док паралелно процесирање има за циљ да подели већи проблем у мање (MIMD) и да се парцијално решавају мањи проблеми. Процесори са два или више језгара су све чешћа појава данас.

Језици[уреди]

Канонски примери низа програмских језика су APL, Ј и Фортран. Други обухватају: D, А +, Аналтика, ИДЛ, K, Mathematica, MATLAB, МОЛСФ, НумПи, GNU Octave, ПДЛ, R, С-Ланг, САЦ, НиАл и ЗПЛ.

Скаларни језици[уреди]

У скаларним језицима као што су C и Паскал, операције се односе само на појединачне вредности, па а + b изражава додавање два броја. У таквим језицима, додајући једнан у низ на други захтева индексирање и петље, што је неефикасно за извршавање, и монотоно при кодирању, те су могуће грешке.

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

Arrаи језици[уреди]

У арраи језицима, операције се генерализују да се пријаве на оба скалара и низа. Тако, a + b изражава збир два скалара ако су a и b скалари, или збир два поља уколико су низови.

Низ језика олакшава програмирање, али вероватно по цени познатој као апстракције казне.[4][5][6]Пошто се додаци изводе у изолацији од остатка кодирања, они не могу произвести оптималан најефикаснији код. (На пример, слике других елемената истог низа могу се накнадно срести у истом извршењу, доводи до непотребног понављања лоокупс.) Чак и најсофистициранија оптимизација компајлера ће изузетно тешко објединити две или више наизглед различитих функција које би могле да се појаве у другачијим програмским секцијама или под-рутине, иако програмер може лако урадити, сакупљајући суме на истом пролазу преко низа минимизирања изнад главе).

Ада[уреди]

Претходни C код ће постати следећи на Ади језику,[7] који подржава низ-програмирања синтаксе.

 A := A + B;

Аналитика[уреди]

Аналитика обезбеђује исту економију изражавања као код Аде.

 A := A + B;

Ова операција ради операнде, А или B, су скалари или низови са једним или више димензија. Свака димензија је идентификована индексна варијабла, која контролише природу операције. Резултат је уједињење димензија операнде. Ако А и B имају исте димензије (индекси), резултат су те исте димензије. Ако су А и B вектори са различитим димензијама, добијени А је 2-димензионални, који садржи обе димензије, са сваким елементом збир одговарајућих вредности А и B. Променљива А мора бити локална променљива; Аналитика, као декларативан језик, избегава нежељена дејства онемогућавањем задатака глобалних варијабли.

BASIC[уреди]

Дартмут основе или МАТ изјаве за матрице су низови манипулација у свом трећем издању (1966).

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

МАТЛАБ[уреди]

Реализација у МАТЛАБ омогућава исту привреду дозвољену помоћу Ада језика.

A = A + B;

Варијанта МАТЛАБ језика ГНУ Октава језика, која се простире на оригиналном језику са појачаним задацима:

A += B;

И МАТЛАБ и ГНУ Октава изворно подржава линеарне алгебарске операције као што су матрице умножавањем, матрице инверзије, и нумеричко решење система линеарних једначина, чак и користећи Moore–Penrose pseudoinverse. [8][9]

Ниал пример унутрашњег производа два низа може се реализовати помоћу множења матрица оператора. Ако је А вектор врсте величине [1] и B је одговарајућа колона вектор величине [н 1].

a * b;

Унутрашњи Производ између две матрице има исти број елемената који се могу реализовати помоћним операторима ( : ), који преобликују дату матрицу у вектор колоне, и транспонују оператор ' :

A(:)' * B(:);

раскл[уреди]

Језик расдаман пита агентно-низно оријентисано програмирање. На пример, два низа се могу додати са следећим упитом:

SELECT A + B
FROM A, B

Математичко расуђивање и језик нотација[уреди]

Оператер матрица лева подела концизно изражава неке семантичке особине матрица. Као и у скаларно еквивалентним, ако (детерминанта) коефицијент (Матрик) А није нула онда је могуће да се реши (векторска) једначина а * x = b лево-множењем обе стране инверзије А: А -1 (у оба МАТЛАБ и GNU Octave језика: А ^ -1). Следећи математичке изјаве држите када А је пуна ранг квадратна матрица:

A^-1 *(A * x) == A^-1 * (b)
(A^-1 * A)* x == A^-1 * b      (матрица-множење асоцијативност)
x = A^-1 * b

где == је еквивалентно релативном оператеру. У претходној изјави важе и МАТЛАБ изрази ако се трећи извршава пре осталих (нумерички поређења могу бити лажна, због округлих офф грешака).

Ако је систем наглашени - тако да А има више редова него колона - за псеудоинверсе А + (у МАТЛАБ и GNU Octave језицима: пинв (а)) може заменити инверзију А-1, као што следи:

pinv(A) *(A * x) == pinv(A) * (b)
(pinv(A) * A)* x == pinv(A) * b       (матрица-множење асоцијативност)
x = pinv(A) * b

Међутим, ова решења нису ни најконцизнија (нпр остаје потреба да се notationally разлика наглашених система), нити највише рачунски ефикасна. Ову последњу поенту је лако разумети када се поново разматра скаларна еквивалентност а * x = b, за које би решење x = а ^ -1 * b захтева две операције, уместо ефикасније x = b / а. Проблем је у томе што углавном матрице множења нису комутативне као проширење скаларног решења у случају матрице би захтевало:

(a * x)/ a == b / a
(x * a)/ a == b / a             (комуникативнсот не важи за матрице!)
x * (a / a) == b / a      
(асоциативнос не важи такође за матрице!)
x = b / a

МАТЛАБ језик уводи оператера леве поделе \ да одржи суштински део аналогије са скаларним случајем, дакле поједностављује математичко расуђивање и очување сажетости:

A \ (A * x) == A \ b
(A \ A)* x == A \ b       (асоцијативност такође важи и за матрице, комуникативност није више обавезна)
x = A \ b

Ово није само пример сажет из низа програма кодиране тачке гледишта, али и из израчунавања ефикасности перспективе, која се у неколико низова програмским језицима користи од веома ефикасних линеарних алгебарских библиотека, као што су АТЛАС или ЛАПАЦК[10][11]

Повратак на претходни цитат од Иверсон, образложење за њега сада би требало да буде јасно:

Библиотеке трећих лица[уреди]

Коришћење специјализованих и ефикасних библиотека да пруже већи сажетак апстракције је такође уобичајено у другим програмским језицима. У C ++ неколико линеарних алгебри библиотека ће искористи могућност језика за преоптерећење оператора. Занимљиво је приметити да је у неким случајевима веома кратка апстракција на тим језицима је изричито утицајем парадигме програмирања низа, пошто Армадилло и Блитз ++ библиотеке раде.[12][13]

Види још[уреди]

Референце[уреди]

  1. ^ Michael Schidlowsky. „Java and K”. Приступљено 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. Приступљено 22. 3. 2011. 
  4. ^ Surana P (2006). „Meta-Compilation of Language Abstractions.” (PDF). Архивирано из оригинала (PDF) на датум 17. 02. 2015. Приступљено 17. 3. 2008. 
  5. ^ Kuketayev. „The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java.”. Архивирано из оригинала на датум 11. 01. 2009. Приступљено 17. 3. 2008. 
  6. ^ Chatzigeorgiou; Stephanides (2002). „Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages”. Ур.: Blieberger; Strohmeier. Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002. Springer. стр. 367. ISBN 978-3-540-43784-0. 
  7. ^ Ada Reference Manual: G.3.1 Real Vectors and Matrices
  8. ^ „GNU Octave Manual. Arithmetic Operators.”. Приступљено 19. 3. 2011. 
  9. ^ „MATLAB documentation. Arithmetic Operators.”. Приступљено 19. 3. 2011. 
  10. ^ „GNU Octave Manual. Appendix G Installing Octave.”. Приступљено 19. 3. 2011. 
  11. ^ „Mathematica 5.2 Documentation. Software References.”. Приступљено 19. 3. 2011. 
  12. ^ „Reference for Armadillo 1.1.8. Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax.”. Приступљено 19. 3. 2011. 
  13. ^ „Blitz++ User's Guide. 3. Array Expressions.”. Архивирано из оригинала на датум 23. 03. 2011. Приступљено 19. 3. 2011. 

Литература[уреди]

Спољашње везе[уреди]