Pređi na sadržaj

Oblasno-specifičan jezik

S Vikipedije, slobodne enciklopedije

Oblasno-specifičan jezik (OSJ) je računarski jezik specijalizovan za određenu oblast primene. Ovo je u suprotnosti sa jezikom opšte namene (ONJ), koji se široko primenjuje na različitim oblastima, i nedostaju mu specijalizovane funkcije za određenu oblast. Postoji širok izbor OSJa, počev od široko korišćenih jezika zajedničkih oblasti, kao što su HTML za veb stranice, do jezika koji su se koristli samo od strane jedanog ili nekoliko delova softvera, kao što su Emaks Lisp za GNU Emaks i IXEmaks. DSLovi može biti dalje dele podpodeljeni prema vrsti jezika i uključuju oblasno specifične jezike za obeležavalje, oblasno specifične jezike modelovanja (uopštenije, specifikaciske jezike), i oblsno-specifične programske jezike. Namenski računarski jezici su uvek postojali u računarskom dobu, ali termin "oblasno-specifičan jezik" je postao više popularan zbog porasta oblastno-specifičnog modelovanja. Jednostavniji OSJci, posebno oni koji se koriste od strane jedne aplikacije, neformalno se ponekad nazivaju mini jezicima.

Linija između jezika opšte namene i oblasno-specifičnih jezika nije uvek oštra, kako jezik može imati specijalizovane funkcije za određenu oblast, ali se primenjju šire, ili obrnuto mogu u principu biti u stanju šire primene, ali  seu praksi koriste pre svega za specifičanu oblast. Na primer, Perl je prvobitno razvijen kao jezik tekstualne prerade i jezik lepljenja, za istu oblast kao AVK i  omotačke skripte, ali je od tada postao programski jezik opšte namene. Nasuprot tome, PostSkript je jezik sa Tjuringovom potpunošću, i, u principu, može se koristiti za bilo koji zadatak, ali se u praksi je usko koristi kao stranično opisni jezik.

Upotreba

[uredi | uredi izvor]

Dizajn i upotreba odgovarajućih OSJa je ključni deo oblasnog inženjeringa, koristeći jezik koji odgovara oblasti pri ruci - ovo se može sastojati od korišćenja postojećih OSJ ili NJ, ili razvoja novog OSJ. Jezičko-orijentisano programiranje smatra da je stvaranje specijalno-namenskog jezika za izražavanje problema standardni deo procesa rešavanja problema. Kreiranje oblasno-specifičnog jezika (sa softverom da ga podržava), u odnosu na ponovno korišćenje postojećeg jezika, može biti korisno ako jezik dozvoljava da se određena vrsta problema ili rešenja izrazi jasnije nego što bi postojeći jezik dozvolo i da se tip problema, koji je u pitanju, ponovo pojavljuje dovoljno često. Pragmatično, OSJ može biti specijalizovan za određenu oblast problema, posebanu tehniku reprezentacije problema, određenu tehniku rešenja, ili drugi aspekt oblasti.

Pregled

[uredi | uredi izvor]

Oblasno-specifičan jezik je posebno stvoren za rešavanje problema u određenoj oblasti i nije namenjen da bude u stanju da reši probleme izvan nje (mada to može da bude tehnički moguće). Nasuprot tome, opšte-namenski jezici su stvoreni da reše probleme u mnogim oblastima. Domen može biti poslovni prostor. Neki primeri poslovnih prostora obuhvataju:

  • oblasno-specifični jezik za polise životnog osiguranja razvijenih interno u velikim osiguravajućim preduzećima
  • oblasno-specifični jezik za simulacije borbi
  • oblasno-specifični jezik za obračun plate
  • oblasno-specifični jezik za naplatu

Oblasno-specifičan jezik je negde između malog programskog jezika i skriptnog jezika, i često se koristi na način analogno biblioteci programiranja. Granice između ovih pojmova su prilično mutne, slično kao granice između skriptnih jezika i jezika opšte namene.

U dizajnu i implementaciji

[uredi | uredi izvor]

oblasno-specifični jezici su jezici (ili često, izjavne sintakse ili gramatike) sa vrlo specifičnim ciljevima u dizajnu i implementaciji. Domen specifične jezik može biti jedan od vizuelnih diagramiranih jezika, kao što su oni koje su stvorili Generični Eklips Modeling Sistem, programske apstrakcije, kao što su Eklips Modeling Frejmvork, ili tekstualni jezici. Na primer, korisnost komandne linija grep ima regularnu izlaznu sintaksu koja odgovara šablonima u linija teksta. Sed definiše sintaksu za usklađivanje i zamenu regularnih izraza. Često, ovi se sićušni jezici mogu koristiti zajedno unutar ljuske da obavljaju složenije programske zadatke.

Linija između oblasno-specifičnih jezika i ckriptnih jezika je donekle nejasna, ali oblasno-specifični jezici često nemaju funkcije niskog nivoa za fajlsistem pristupa, međuprocesku kontrolu, i ostale funkcije koje karakterišu kompletnih programske jezike, skriptne ili druge. Mnogi oblasno-specifični jezici se ne prevode na bajt-kod ili izvršni kod, već na razne vrste medijskih objekata:Grafuiz izvodi u PostSkript, GIF, JPEG, itd, gde Csaund prevodi na audio fajlove, i zrakovno-praćeno oblasno-specifičan jezik kao POV prevodi na grafičke fajlove. Računarski jezik kao SQL predstavlja zanimljiv slučaj: može se smatrati za oblasno-specifični jezik, jer je specifičan za određenu oblastn (u slučaju SQLa, pristup i upravljanje relacionim bazama podataka), i često se poziva iz druge aplikacije, ali SQL ima više ključnih reči i funkcija nego mnogi skript jezici, i često sena njega misli kao jezika samaog po sebi, možda zbog rasprostranjenosti manipulacije bazom podataka u programiranju i količine savlađivanja potrebnog da se bude ekspert u jeziku.

Dalje pomućenje ove linije, mnogi oblasni-specifični jezici imaju izloženi API, i može mu se pristupiti sa drugim programskim jezicima bez prekidanja toka izvršenja ili pozivom na poseban proces, i na taj način može da funkcioniše kao programskih biblioteka.

Programski alati

[uredi | uredi izvor]

Neki oblasni-specifični jezici su se proširili tokom vremena da uključuju kompletne programske alate, što dodatno komplikuje pitanje da li je jezik oblasno-specifičan ili ne. Dobar primer je funkcionalni jezik XSLT, specijalno dizajniran za pretvaranje jednog XML grafika u drugi, koji je povećan od njegovog osnivanja da dozvoli (posebno u verziji 2.0) za različite oblike fajlsistem interakcije, manipulaciju nizovima i datumom, a kucanje podataka.

U modelima-vođenom inženjerstvu mnogi primeri oblasno-specifičnh jezika mogu se naći kao OKJ, jezik za ukrašavanje modela sa tvrdnjama ili KUVT, oblasno-specifičan jezik transformacije. Međutim jezici kao što su UML su obično jezici opšte namene modeliranja.

Da rezimiramo, analogija može biti od koristi: veoma mali jezik je kao nož, koji se može koristiti na hiljade različitih načina, od rezanja hrane do seče šume. Oblasno-specifičan jezik je kao električna bušilica: to je moćno sredstvo sa širokim spektrom primene, ali u specifičnom kontekstu, to jest, pravi rupe u stvarima. Opšte namenski Jezik je kompletan radni sto, sa različitim alata namenjenih za obavljanje raznih zadataka. Oblasno-specifični jezici treba da se koristi od strane programera koji, gledajući njihove trenutni radni sto, shvataju da im treba bolja bušilica, i smatraju da je određeni oblasno-specifični jezik omogućava upravo to.

Teme oblasno-specifičnog jezika

[uredi | uredi izvor]

Modeli korišćenja

[uredi | uredi izvor]

Postoji nekoliko načina upotrebe oblasno-specifičnih jezika:[1][2]

  • obrada sa samostalnim alatima, pozvanim preko direktne operacije korisnika, često na komandnoj liniji ili sa Mejkfajla (npr grep za regularno podudaranje izraza, sed, leks, jac, skup alata Grafuiz, itd)
  • oblasno-specifični jezici koji se realizuju korišćenjem makroa sistema programskog jezika, a koje se pretvaraju ili proširuju u opštenamenskom jeziku u vremenu kompiliranja ili čitanja
  • Ugrađeni (ili interni) oblasno-specifični jezici, realizovani kao biblioteke koje eksploatišu sintaksu svog jezika domaćina opšte namene ili podskupe istih, dodajući oblasno-specifične elemente jezika (tipovi podataka, rutine, metode, makroe itd). (npr Ugrađeni SQL, LINQ)
  • oblasno-specifični jezici koji se pozivaju (u toku rada) iz programa pisanih na jezicima opšte namene kao što su C ili Perl, da obavljju određenu funkciju, često vraćaju rezultate poslovanja u "domaćina" programskog jezika za dalju obradu; generalno, interpretator ili virtuelna mašina za oblasno-specifičan jezik je ugrađena u aplikaciju domaćina (npr formatirane niske, regularna izlazna mašina)
  • oblasno-specifični jezici koji su ugrađeni u korisničke aplikacije (na primer, makro jezici sa tabelama) i koji se (1) koriste za izvršavanje koda koji je napisan od strane korisnika aplikacije, (2) dinamički generišu od strane aplikacije, ili (3) oboje.

Mnogi oblasno-specifični jezici se mogu koristiti na više načina. OSJ kod ugrađen u jezik domaćina može imati posebnu sintaksnu podršku, kao što su regularni izrazi u sed, AVK, Perl ili JavaSkript, ili mogu da prođu kao niske.

Dizajn ciljevi

[uredi | uredi izvor]

Usvajanje oblasno-specifičnog jezičkog pristupa za softversko inženjerstvo uključuje i rizike i mogućnosti. Dobro dizajniran oblasno-specifičan jezik uspeva da pronađe odgovarajuću ravnotežu između njih.

Oblasno-specifični jezici imaju važne ciljeve dizajna koji kontriraju onima opšte namenskih jezika:

  • oblasno-specifični jezici su manje sveobuhvatni.
  • oblasno-specifični jezici su mnogo izraženiji u svojoj oblasti.
  • oblasno-specifični jezici treba ispoljavaju minimalna suvišnost prema sledećoj subjektivnoj definiciji.

Suvišnost programa se definiše kao prosečnog broja tekstualnih umetaka, brisanja ili zamena neophodne da se pravilno sprovede jedna samostalna promena u zahtevima. Za jezik, to je prosečno preko programa u oblasti problema. Ova mera je korisna, jer, što je manja, manja je verovatnoća da se greške mogu uvesti od strane nepotpunog sprovođenja promena.

Idiomi

[uredi | uredi izvor]

U programiranju, idiomi su metode nametnute od strane programera da rukuju zajedničkim razvojnim zadacima, npr:

  • Obezbeđuju da se podaci čuvaju pre nego što je prozor zatvoren.
  • Pre izvođenja skupih testova, obavljaju jeftine testove koji mogu isključiti potrebu za skupim testovima.
  • Uređuju kod kad god se komandne linije parametara promene, jer one utiču na ponašanje programa.

opšte namenski programski jezici retko podržavaju takve idioma, ali oblasno-specifični jezici mogu da ih opisuju, npr:

  • Skripta može automatski sačuvati podatke.
  • Pametno upregnuće testa može naučiti šta su dobri testovi.
  • oblasno-specifični jezik može da parameteriše ulaz komandne linije.

Primeri

[uredi | uredi izvor]

Primeri oblasno-specifičnih jezika uključuju HTML, Logo za crtanje poput olovkom, VerilogVHDL jezici opisa hardvera, MATLAB i GNU Oktava za programiranje matrice, Matematika, Majpl i Maksim za simboličku matematikuSpecifikaciski i opisni jezik za reaktivne i distribuirane sisteme, tabelarne formule i makroe, SQL za ispitivanja relacione baze podataka, Yacc gramatika za kreiranje parsera, regularni izraz za preciziranje leksičke analize, Generični Eklips Modeling Sistem za kreiranje jezika diagramiranja, Csaund za zvuk i muzičku sintezu, i jezik unosa Grafuiz i GrGen, softverski paketi koji se koriste za raspored grafikona i prepisivanje grafikona.

Jezik stvaranja igara

[uredi | uredi izvor]

GML skritni jezik koristi GejmMejker: Studio je  oblasno specifičan jezik usmeren na programere početnike kako bi lako mogli da nauče programiranje. Dok jezik služi kao spoj više jezika, uključujući DelfiC++, i Bejsik, postoji nedostatak objekata, tipove podataka, i drugih karakteristika punopravnog programskog jezika. Mnogi od ugrađenih funkcija se sandboksiraju radi lakše prenosivosti. Jezik prvenstveno služi da bi ga svako lako naučio i napravio igru.

Juniks skipte omotača

[uredi | uredi izvor]

Juniks skripte omotača daju dobar primer kako oblasno specifičan jezik radi za organizaciju podataka. Oni mogu da manipulišu podacima u fajlovima ili korisničkim ulazima na mnogo različitih načina. Oblasne apstrakcije i oznake obuhvataju tokove (kao što su stdin i stdaut) i operacija na tokovima (kao što su preusmeravanje i cevi). Ove apstrakcije kombinuju da se napravi snažan jezik koji ce da se bavi tokom i organizaciom podataka.

Jezik se sastoji od jednostavnog interfejsa (skripte) za rad i kontrolu procesa koji obavljaju male zadatke. Ovi zadaci predstavljaju idiome organizovanja podataka u željenom formatu, tabele, grafikoni, slike i sl

Ovi zadaci se sastoje od jednostavnih mehanizama kontrole tokova i manipulacije niskama koji pokrivaju dosta zajedničkih upotreba, kao što su pretraživanje i zamena niski u fajlovima, ili brojanje pojavljivanja niski (frekvenciono brojanje).

Iako su Juniks skripting jezici Tjuring potpuni, oni se razlikuju od jezika opšte namene.

U praksi, skriptni jezici se koriste za tkanje zajedničkih malih Juniks alata kao što su AVK (npr GAVK), Ls sort or Vc.

Koldfjužon Marža jezik

[uredi | uredi izvor]

Kodfjužon povezani skriptni jezik je još jedan primer oblasno specifičnog jezika za podacima vođene sajtove. Ovaj skriptni jezik se koristi zajedno opletu jezici i usluge kao što su Java, . NET, C ++, SMS, imeil, imejl serveri, džttp, ftp, razmene, imeničke usluge, i fajl sistemi za upotrebu na veb stranicama.

Koldfjužon Marža jezik (KFMJ) obuhvata skup oznaka koje se mogu koristiti u Koldfjužon stranama da komunicira sa izvorima podataka, manipuliše podacima i prikažete izlaz. KFMJ označena sintaksa je slična HTML elementarnoj sintaksi.

Erlang OTP

[uredi | uredi izvor]

Erlang Otvorena Telekom Platforma je prvobitno dizajnirana za upotrebu unutar Eriksona kao oblasno*specifičanog jezika. Sam jezik nudi platformu biblioteka za kreiranje konačnih stanja mašina, generički serveri i menadžerima slučaja koji omogućavaju inženjeru da brzo razvija aplikacije ili podržava biblioteke, koje su prikazane u industrijskoj odrednici da nadmašuju druge jezike namenjene mešovitim setovima domena, kao što su C i C ++. Jezik je sada zvanično otvorenog porekla i može se preuzeti sa njihovog sajta.

FilterMajster

[uredi | uredi izvor]

FilterMajster je programsko okruženje, sa programskim jeziku om koji se zasniva na C, za određenu svrhu stvaranja Fotošop-kompatibilne filterne dodatke za obradu slike; FilterMajster radi kao Fotošop dodatak sebi i može učitati i izvršavati skripte, ili sastaviti i izvoditi ih kao nezavisne dodatake. Iako FilterMajster jezik reprodukuje značajan deo C jezika i funkcije biblioteka, on sadrži samo one karakteristike koje mogu biti korišćene u kontekstu Fotošop dodataka i dodaje brojne specifičnosti korisnih samo u ovoj konkretnoj oblasti.

MedijaViki šabloni

[uredi | uredi izvor]

Funkcija Šablona Medijaviki je ugrađeni oblasno-specifični jezik čija je osnovna svrha da podrže stvaranje stvaranje šablona i uključivanje stranica(uključivanje pozivanjem) od MedijaViki stranica u druge MedijaViki stranice.

Detaljan opis tog oblasno-specifičnog jezika može se naći na odgovarajućem članaku na Wikimedia Foundation's Meta-Wiki.

Softversko inženjerska primena

[uredi | uredi izvor]

Bilo je veliko interesovanje u oblasno specifične jezike za poboljšanje produktivnosti i kvaliteta softverskog inženjeringa. Oblasno-pecifičan jezik mogao da obezbedi snažan set alata za efikasno softversko inženjerstvao. Takvi instrumenti počinju da prave svoj put u razvoju kritičnih softverskih sistema.

Softver za smanjenje troškova alata[3] je primer ovoga. Priručnik je paket uslužnih programa, uključujući specifikacijski editor za kreiranje specifikaciju zahteva, i grafički pregledač zavisnosti da prikaže promenljivost zavisnosti, kontrolor doslednosti da uhvati nestale stvari u Dobro formirana formula u specifikaciji, kontrolor modela i dokazivač teorema da proveri svojstva programa u odnosu na specifikaciju, i invariantni generator koji automatski konstruiše invariante na osnovu zahteva.

Noviji razvoj je jezičko orijentisano programiranje, integrisana metodologija softverskog inženjeringa uglavnom zasnovana na stvaranju, optimizaciji, i korišćenju oblasno-specifičnih jezika.

Metakompilatori

[uredi | uredi izvor]

Kao dopuna jezičko-orijentisanom programiranju, kao i svim drugim oblicima oblasno-specifičnih jezika, metakompilatori su klasa za pisanje prevodilačkih alata. Metakompilator nije samo koristan za generisanje parsera i generatora  koda za oblasno-specifične jezike, ali metakompilator sam po sebi sastavlja oblasno-specifični metajezik posebno dizajniran za oblasti metaprogramiranja.

Pored oblasno-specifičnih jezika rasčlanivanja, metakompilatori su korisni za generisanje širokog spektara softverskog inženjerstva i analizu alata. Metodologija Meta-kompajlera se često nalaze u sistemima programske transformacije.

Metakompilatori koji su igrali značajnu ulogu u računarskoj nauci i računarskoj industriji uključuju Meta-II[4] i njegov potomak DrvoMeta.[5]

Unreal Engine before version 4 and other games

[uredi | uredi izvor]

Unrial i Unrial Turnament predstavio je jezik koji se zove UnrialSkript. To je omogućilo brži razvoj modifikacije u odnosu na konkurentski Kueik (koristeći id tek 2 engine). Id Tek mašina koristi standardni C kod znači, C se morao naučiti i pravilno primeniti, dok je UnrialSkript optimizovan za lakoću korišćenja i efikasnost. Slično tome, razvoj novih igara uveo je svoje specifične jezike, jedna od češćih primera toga je Lua za skriptovanje.

Sistemi Pravila za Političku Automatizaciju 

[uredi | uredi izvor]

Razni Sistemi Poslovnih Pravila su razvijeni za automatizaciju političkih i poslovnih pravila koja se koriste u vladinoj i privatnoj industriji. ILOG Orakl Automatizacija politike, DTRuls, Druls i ostali pružaju podršku za OSJ sa ciljem da podrži različite oblasti problema. DTRuls ide toliko daleko da definiše interfejs za korišćenje višestrukih OSJa u sklopu seta pravila.

Svrha Sistema Poslovnih Pravila je da definiše predstavljanje poslovne logike na ljudski čitljiv način. Ovo omogućava da i stručnjaci za odgovarajuće oblasti i programeri rade sa i razumeju isto predstavljanje poslovne logike. Većina Pravila Sistema obezbeđuju i takav pristup pojednostavljivanju kontrolne strukture za poslovnu logiku (na primer, korišćenje deklarativnih pravila ili Tabela Odluka) zajedno sa alternativama programske sintakse u korist OSJa.

Jezici statičkog modeliranja

[uredi | uredi izvor]

Statistički modelari su razvili oblasno-specifični jezike kao što su Bags, Jags i Sten. Ovi jezici pružaju sintaksu za opisivanje Bajesovog modela, i stvoriti metod za njegovo rešavanje koristeći simulaciju.

Generisani model i usluge na više programskih jezika

[uredi | uredi izvor]

Generisano objektno rukovanje i usluge zasnovane na interfejs Opisnom Jeziku za oblasno-specifični jezik kao što je JavaScript za veb aplikacije, HTML za dokumentaciju, C++ za kod visokih performansi, itd. Ovo se radi sa ukrštenim jezičkim okvirima kao što su Apaći Trift ili Gugl Protokol Bufferi .

Drugi primeri

[uredi | uredi izvor]

Drugi istaknuti primeri oblasno-specifičnih jezika su:

  • Emak Lisp
  • Jezik opisa igara
  • OpenGL jezik senčenja

Prednosti i mane

[uredi | uredi izvor]

Neke od prednosti:[1][2]

  • Oblasno specifičan jezik omogućava rešenjima da budu izraženi u idioma i na nivou apstrakcije oblasti problema. Ideja je da stručnjaci oblasti sami mogu da razumeju, potvrđuju, menjaju, a često i razvijaju oblasno-specifični jezički program. Međutim, ovo je retko slučaj.[6]
  • Oblasno-specifični jezici dozvoljavaju potvrdu na nivou oblasti. Dokle god su jezičke konstrukcije bezbedne svaka rečenica napisana na njima može da se smatra sigurnom.
  • Oblasno-specifični jezici mogu pomoći da se prebaci razvoj poslovnih informacionih sistema od tradicionalnih programera u tipično veću grupu Oblasnih-stručnjaka koji (uprkos tome što imaju manju tehničku ekspertizu) imaju dublje poznavanje oblasti.[7]

Neke od mana:

  • Troškovi učenje novog jezika protiv svoje ograničenoe primenljivosti
  • Troškovi projektovanja, implementacije i održavanja oblasno-specifičnih jezika, kao i obavezan alat za razvoj sa njim (IDE)
  • Pronalaženje, postavljanje i održavanje odgovarajućeg prostora.
  • Teškoća balansiranja kompromisa između oblasno-specifičkih i opšte-namenskih programsko jezikih konstrukcija.
  • Potencijalni gubitak efikasnosti procesora u poređenju sa ručno kodirani softverom.
  • Širenje sličnih nestandardnih oblasno-specifičnih jezika, na primer, OSJ korisšćen unutar jednog osiguravajućeg društva u odnosu na OSJ korišćen unutar drugog osiguravajućeg društva.[8]
  • Ne-tehničkim strčnjacima oblasti može biti teško da napišu ili promene OSJ programe sami.[6]
  • Povećana poteškoća integracije OSJ sa drugim komponentama IT sistema (u odnosu na integraciju sa jezikom opšte namene).
  • Manja zaliha stručnjaka u određenom OSJ teži da poveća troškove rada.
  • Teže je naći primere koda.

Vidi još

[uredi | uredi izvor]

Reference

[uredi | uredi izvor]
  1. ^ a b Mernik, Marjan; Heering, Jan; Sloane, Anthony M. (2005). „When and how to develop domain-specific languages”. ACM Computing Surveys. 37 (4): 316—344. S2CID 207158373. doi:10.1145/1118890.1118892. 
  2. ^ a b Spinellis, Diomidis (2001). „Notable design patterns for domain-specific languages”. Journal of Systems and Software. 56: 91—99. doi:10.1016/S0164-1212(00)00089-3. 
  3. ^ „Arhivirana kopija” (PDF). Arhivirano iz originala (PDF) 19. 07. 2004. g. Pristupljeno 22. 11. 2015. 
  4. ^ Shorre, D.V., META II a syntax-oriented compiler writing language, Proceedings of the 1964 19th ACM National Conference. str. 41301–41.3011, 1964
  5. ^ C. Stephen Carr, David A. Luther, Sherian Erdmann, 'The TREE-META Compiler-Compiler System: A Meta Compiler System for the Univac 1108 and General Electric 645', University of Utah Technical Report RADC-TR-69-83.
  6. ^ a b Freudenthal, Margus (1. 1. 2009). „Domain Specific Languages in a Customs Information System”. IEEE Software: 1. doi:10.1109/MS.2009.152. 
  7. ^ Aram, Michael; Neumann, Gustaf (1. 7. 2015). „Multilayered analysis of co-development of business information systems” (PDF). Journal of Internet Services and Applications. 6 (1). doi:10.1186/s13174-015-0030-8Slobodan pristup. 
  8. ^ Miotto, Eric. „On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering” (PDF). Arhivirano iz originala (PDF) 24. 07. 2011. g. Pristupljeno 22. 11. 2015. 

Literatura

[uredi | uredi izvor]

Spoljašnje veze

[uredi | uredi izvor]
Članci