Пређи на садржај

Агентно низно оријентисано програмирање — разлика између измена

С Википедије, слободне енциклопедије
Садржај обрисан Садржај додат
Нема описа измене
Нема описа измене
Ред 127: Ред 127:
У арраи језицима, операције се генерализују да се пријаве на оба скалара и низа. Тако, А + Б изражава збир два скалара ако су а и б скалари, или збир два поља уколико су низови.
У арраи језицима, операције се генерализују да се пријаве на оба скалара и низа. Тако, А + Б изражава збир два скалара ако су а и б скалари, или збир два поља уколико су низови.


Низ језика олакшава програмирање, али вероватно по цени познат као апстракције казне.<ref>{{cite journal
Низ језика олакшава програмирање, али вероватно по цени познат као апстракције казне.<ref><cite class="citation journal" contenteditable="false">Surana P (2006). </cite></ref>''<nowiki/>''<ref><cite class="citation web" contenteditable="false">Kuketayev. </cite></ref><ref><cite class="citation book" contenteditable="false">Chatzigeorgiou; Stephanides (2002). </cite></ref> Пошто се додаци изводе у изолацији од остатка кодирања, они не могу произвести оптимално [[најефикаснији]] код. (На пример, слике других елемената истог низа могу се накнадно срести у истом извршењу, доводи до непотребног понављања лоокупс.) Чак и најсофистициранија [[Optimizacija kompilatora|оптимизација компајлера]] ће имати изузетно тешко објединити две или више наизглед различитих функција које би могле да се појаве у другачијим програмским секцијама или под-рутине, иако програмер може лако урадити, сакупљајући суме на истом пролазу преко низа минимизирања [[изнад главе]]).
| author = Surana P
| title = Meta-Compilation of Language Abstractions.
| year = 2006
| url = ftp://lispnyc.org/meeting-assets/2007-02-13_pinku/SuranaThesis.pdf
| format = [[PDF]]
| accessdate = 2008-03-17 }}</ref><ref>{{cite web
| last = Kuketayev
| title = The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java.
| url= http://www.adtmag.com/joop/article.aspx?id=4597
| accessdate = 2008-03-17 }}</ref><ref>{{Cite book
| last = Chatzigeorgiou
| last2 = Stephanides
| editor-last = Blieberger
| editor2-last = Strohmeier
| contribution = Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages
| title = Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002
| year = 2002
| pages = 367
| publisher = Springer
| url = http://books.google.com/?id=QMalP1P2kAMC&dq=%22abstraction+penalty%22
| isbn = 978-3-540-43784-0
}}</ref>''Пошто се додаци изводе у изолацији од остатка кодирања, они не могу произвести оптимално [[најефикаснији]] код. (На пример, слике других елемената истог низа могу се накнадно срести у истом извршењу, доводи до непотребног понављања лоокупс.) Чак и најсофистициранија [[Optimizacija kompilatora|оптимизација компајлера]] ће имати изузетно тешко објединити две или више наизглед различитих функција које би могле да се појаве у другачијим програмским секцијама или под-рутине, иако програмер може лако урадити, сакупљајући суме на истом пролазу преко низа минимизирања [[изнад главе]]).


==== Ада ====
==== Ада ====

Верзија на датум 11. новембар 2015. у 00:55

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

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

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

Концепти

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

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

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

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

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

[...]

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

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

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

Користи

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

Језици

Канонски примери низа програмских језика су АПЛ, Ј и Фортран. Други обухватају: Д, А +, Аналвтика, ИДЛ, К, Матхематика, МАТЛАБ, МОЛСФ, НумПи, ГНУ октаве, ПДЛ, Р, С-Ланг, САЦ, НиАл и ЗПЛ.

Скаларни језици

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

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

Arraи језици

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

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

Ада

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

 A := A + B;

Аналитика

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

 A := A + B;

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

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;

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

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

a * b;

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

A(:)' * B(:);

раскл

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

SELECT A + B
FROM   A, B

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

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

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

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

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

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

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

(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]

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

Трећих лица библиотеке

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

Види још

Референце

  1. ^ Michael Schidlowsky. „Java and K”. Приступљено 2008-01-23. 
  2. ^ Stéfan van der Walt, S. Chris Colbert and Gaël Varoquaux (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. Приступљено 2011-03-22. 
  4. ^ Surana P (2006). „Meta-Compilation of Language Abstractions.” (PDF). Приступљено 2008-03-17. 
  5. ^ Kuketayev. „The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java.”. Приступљено 2008-03-17. 
  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.
  9. ^ "MATLAB documentation.
  10. ^ "GNU Octave Manual.
  11. ^ "Mathematica 5.2 Documentation.
  12. ^ "Reference for Armadillo 1.1.8.
  13. ^ "Blitz++ User's Guide. 3.

Спољашње везе