F Sharp

From Wikipedia, the free encyclopedia

F Sharp
Remove ads

je strogo tipiziran programski jezik sa otvorenim () kodom pod licencom i prvoklasni jezik u programskom okruženju Vizuelnog Studia.[1] Razvijen je kao implementacija jezgra programskog jezika [2] pod uticajem programskih jezika , , , i .[3] Ovo je programski jezik sa izraženim funkcionalnim karakteristikama, ali podržava i druge programske paradigme poput imperativne i objektno-orijentisane.[4]

Укратко Originalni naziv, Izgovara se ...

је izražajan i koncizan.[1] Služi za pisanje jednostavnih kodova koji će rešavati kompleksne probleme.[1] Iz poslovne perspektive, glavna uloga -a je da smanji vreme potrebno za realizaciju analitičkih softverskih komponenti u savremenom preduzeću.[1] Snaga -a leži u svedenoj sintaksi koja omogućava laku čitljivost koda, kao i efikasan razvoj programa koji zahtevaju primenu složenih matematičkih algoritama.[4] Omogućava brzo generalisanje prototipova kao i njihovu brzu transformaciju u produktivni kod.[4] Omogućava da programeri direktnije sprovode svoje algoritme (manje koda za čitanje i održavanje, kao i brza igrada prototipova). Korišćenjem programskog jezika kao osnovnog jezika mogu se lako kreirati domensko specifični jezici () što ga čini pogodnim za naučno – istraživačke primene.[4] Studije slučaja i prijave korisnika pokazuju da stroga tipiziranost programskog jezika smanjuje softverske greške.[1]

Kod napisan u jeziku možemo lako paralelizovati, što je veoma značajno kod računara sa više jezgara.[4] poseduje medernu kompilaciju do izvornog koda.[1] Brzina izvršavanja rezultujućeg koda je mnogo veća no kod jezika kao što su , ili , a u pojedinim slučajevima značajno brža od programskog jezika .[1] Koristeći interaktivno, kod se može odmah izvršiti bez prvog kompajliranja, što omogućava tečnije istraživanje problema. Programeri mogu koristiti interaktivno kako bi iterativno pobošali algoritme.[1] Kod će se izvršavati i na 32-bitnom i na 64-bitnim sistemima uz korišćenje upustva za odgovarajuce arhitekture.[1]

možemo koristiti na , , , i ostalim platformama.[1] On je kompatibilan sa svim ostalim jezicima, što znači da program može da koristi sve biblioteke.[4] Biblioteka napisana u -u može se koristiti u bilo kojoj ili aplikaciji razvijenoj na platformi.[4]

Remove ads

Istorijski razvoj

Verzije

je prošao kroz nekoliko verzija tokom svog razvoja.

Више информација Verzija, Specifikacija jezika ...

Evolucija jezika

Programski jezik je prvobitno dizajnirao i implementirao iz -a.[2] Zatim je pristupio timu i ostvario veliki doprinos u razvoju ovog programskog jezika.[2] je povezan sa dizajnom generika za .[2] je bio ko-dizajner generika i (jedinica mere) za .[2] i su bili odgovorni za postavlajnje inicijalnog terena za stvaranje i [2]

Више информација Karakteristike ...

Remove ads

Funkcionalno programiranje

je prvi striktno funkcionalni programski jezik koji podržava zaključivanje tipova. To znači da programer ne mora da deklariše tipove, nego će kompilator sam zaključiti tip tokom kompilacije. je jezik zasnovan na izrazima.[15] Svaka naredba u uključujući i naredbu, izraze i petlje, spaja se sa izrazima statičkog tipa. Funkcije i izrazi koji ne vraćaju neku vrednost imaju povratni tip . koristi ključnu reč da dodeli vrednosti promenjivoj.[15] Na primer:

   x=3+4 

dodeljuje vrednost 7 promenjivoj x.

Novi tipovi se definišu koisteći ključnu reč . Za funkcionalno programiranje podržava torke, rekorde, diskriminišuće unije, liste i opcione tipove.[15]

Torka predstavlja kolekciju od vrednosti, gdje je . Vrednost se zove arnost torke. Trojka će biti predstavljena kao , gdje su i vrednosti eventualno različitih tipova. Torka može biti korištena samo kada je broj vrednosti poznat u vreme pravljena torke i taj broj ostaje konstantan tokom izvršenja programa.[15]

Diskriminišuća unija predstavlja tip podataka čija vrednost može biti u skladu sa samo jednim od definisanih diskriminatora. U svom najjednostavnijem obliku diskriminator predstavlja jednu vrednost, a diskriminišuća unija skup vrednosti. Tada tip diskriminišuća unija semantički podseća na tip enumeracija u programskom jeziku .[15]

Rekord je tip u kome se članovi podataka imenuju kao:

 

Može biti kreiran kao:

 

Ključna reč se koristi da napravi kopiju rekorda kao na primer:

 

Ovim izrazom se kreira novi rekord tako što se prvo kopira , a zatim menja vrednost u polju ime (Pretpostavljamo da je rekord kreiran u prethodnom primeru imenovan sa ).[15]

U postoji tip i označava nepromenjivu povezanu listu. Lista se predstavlja koristeći notaciju (:: je kontra operator) ili kao . Praznu listu označavamo sa [].[15]

Opcioni tip je diskriminišuća unija sa izborima ili .[15]

podržava lambda račun. Sve funkcije u su nemutabilne. Funkcije mogu biti prosleđene kao agumenti drugim funkcijama.[15]

Remove ads

Imperativno programiranje

Pod imperativnim programiranjem se podrazumeva pisanje programa, koji tokom izvršavanja više puta upisuju podatke na istu memorijsku lokaciju. U programskim jezicima, kao što su , ili to je potpuno uobičajno. Nasuprot tome, naredba u -u prilikom svakog povezivanja vrednosti sa identifikatorom upisuje vrednost u novu memorijsku lokaciju. Naravno, ponekad postoji potreba da se i u programima piše imperativni kod. To je uglavnom slučaj kad se postojeći, složeni algoritmi, sa nekog imperativnog programskog jezika prenose u .[16][17]

Sintaksa programskog jezika razlikuje tri vrste promenljivih struktura, i to:

  • Lokalne promenljive
  • Reference
  • Slogove sa promenljivim poljima[17]

Lokalne promenljive

Lokalne promenljive definišu se tako što se posle naredbe povezivanja upotrebljava ključna reč . Promena lokalne promenljive vrši se pomoću operatora strelica ulevo (<-). Lokalne promenljive imaju određena ograničenja, a najznačajnije od njih je da se mogu koristiti samo u sopstvenoj oblasti definisanosti ( npr. prilikom vraćanja lokalne promenljive iz funkcije ne vraća se sama lokalna promenljiva, nego kopija njene vrednosti).[17]

Reference

Referenca predstavlja objektni omotač (ćeliju) u kojoj je smeštena vrednost koja se može menjati tokom izvršavanja programa. Vrednost se smešta u referencu primenom funkcije . Sadržaju reference pristupa se pomoću operatora (!), dok se za izmenu sadržaja koristi operator (:=).[17]

Slogovi sa promenljivim poljima

Sintaksa programskog jezika omogućava definisanje slogova sa promenljivim poljima. Promenljiva polja definišu se pisanjem ključne reči ispred naziva polja.[17]

Nizovi

Niz (engl. ) je kolekcija promenljivih elemenata istog tipa. Implemetacija niza je takva da su elementi koji ga čine smešteni u memoriji neposredno jedan posle drugog.[16] Zbog toga je pri deklaraciji niza potrebno tačno znati koliko će elemenata biti u nizu. Prednost ovakve implementacije je u tome što omogućava efikasan pristup proizvoljnom elementu niza.[16] Nizovi se mogu kreirati pomoću generatorskih izraza, poput lista i sekvenci ili zadati kao lista vrednosti odvojenih znakom ; između znakova [| i |]. Na primer:

   = [| 1.0 ; 2.0; 3.0 |] 

Elementima niza pristupa se pomoću operatora indeksiranja (.[]) . Operator indeksiranja upotrebljava se kako kod čitanja tako i kod menjanja sadržaja elementa niza.[16], na primer:

  

upisuje vrednost 5 na poziciju 1.

Petlje

Imperativno programiranje podrazumeva eksplicitnu kontrolu toka izvršavanja programa. Takva kontrola podrazumeva i upotrebu petlji koje omogućavaju repetativno izvršavanje određenog dela koda određeni broj puta, odnosno do ispunjenja datog uslova. Programski jezik podržava petlju i dve vrste petlje.[17]

petlja

petlja se izvršava sve dok uslov ciklusa vraća logičku vrednost .[17] Sledeći primer ilustruje primenu petlje za izračunavanje zbira celih brojeva od 1 od .

  let mutable zbir = 0
  let mutable i=1
  while (i<=n) do
     zbir <- zbir + i
     i <- i + 1

petlja

petlja se koristi kada je unapred poznat broj iteracija koje treba da budu izvršene.[17]

Jednostavna forma petlje podrazumeva postojanje celobrojne ciklusne promenljive (brojača) u zaglavlju petlje, koja uzima vrednosti između donje i gornje granice.[17] Sledeći primer je ekvivalentan prethodnom, samo što je ovaj put za rešavanje problema upotrebljen jednostavan oblik .

  let mutable zbir = 0
  for i=1 to n do
     zbir <- zbir + 1

Nabrojiva forma petlje podrazumeva postojanje ciklusne promenljive koja uzima vrednosti redom iz proizvoljne sekvence.[17] U primeru koji sledi, zatvoreni interval celih brojeva zadat je sekvencom u formi liste celih brojeva od 1 do .

  let mutable zbir = 0
  for i in [1, n] do
     zbir <- zbir + 1
Remove ads

Objektno orijentisano programiranje

Najveći deo platforme napisan je u objektno orijentisanim programskim jezicima, prvenstveno u programskom jezicima . Zato je poznavanje objektno orijentisanog programiranja od ključne važnosti za korišćenje brojnih biblioteka. Objektno orijentisan stil programiranja pogodan je za pisanje kompleksnih softverskih sistema. Navedena pogodnost se ogleda u mogućnosti da se objekti iz realnog sveta modeluju pomoću softverskih abstrakcija, klasa.[16]

Klasa je sintaksni element koji povezuje funkcije i podatke. Sintaksa programskog jezika definiše više elemenata koji se iz objektno orijentisanih programskih jezika vide kao klase.[16] To su:

  • Slog
  • Unija diskriminatora
  • Izuzetak
  • Klasa
  • Modul

Primer definisanja klase:

  type Vektor2D(dx:float, dy:float)=
     member t.DX=dx
     member t.DY=dy
     member t.duzina=sqrt(dx*dx+dy*dy)
     member t.pomnoziSkalarom(k)=Vektor2D(k*dx,k*dy)
     static member Nula=Vektor2D(0., 0.)

Objekat klase kreiramo navođenjem imena klase i prosleđivanjem vrednosti parametara potrebnih za inicijalizaciju objekta.

Svojstva služe za pristup podacima. Najčešće su to sirovi podaci prezentovani na način kako su definisani u poljima, ali mogu biti i izračunate vrednosti (npr. svojstvo zavisi od veličine više polja).[16] Slično kao i u drugim objektno orijentisanim programskim jezicima, svojstva mogu pripadati klasi umesto pojedinim objektima date klase. Takva svojstva nazivaju se statička, a u programskom kodu označavaju se pomoću ključne reči :

  

Statička svojstva najčešće se koriste za kreiranje specifičnih objekata date klase (npr. nula vektor).[16]

Metoda predstavlja operaciju koju je moguće izvršiti nad objektom. Prilikom definisanja metode u zaglavlju se pored naziva navodi i skup parametara potrebnih za njeno pozivanje. U primeru je data metoda koja prima parametar k tipa i vraća objekat čije su dimenzije uvećane puta.

 

Iako je preporučljivo da klase budu nepromenljive, moguće je napisati i klasu koja tokom izvršenja programa menja svoje stanje.[16] Definisanje promenljive klase ilustrovano je na sledećem primeru:

  type Vektor2D(dx:float, dy:float)=
     let mutable dx=dx
     let mutable dy=dy
     member t.DX with get()=dx and set v=dx<-v
     member t.DY with get()=dy and set v=dy<-v
     member t.duzina=sqrt(dx*dx+dy*dy)
     member t.pomnoziSkalarom(k)=Vektor2D(k*dx,k*dy)
     static member Nula=Vektor2D(0., 0.)
Remove ads

Asinhrono programiranje

podržava asinhrono programiranje kroz asinhrone radne procese počev od verzije 1.9.2.9.[18] Asinhroni procesi rada su jedna aplikacija -ove sintakse računanja izraza. Ovo je jedan primer kako bi dva asinhrona procesa rada mogla da se izvršavaju paralelno:

   let task1 = async { return 10+10 }
   let task2 = async { return 20+20 }
   Async.Run (Async.Parallel [ task1; task2 ])

U navedenom primeru izraz kreira jedan objekat tipa . Ove vrednosti nisu pravi rezultati već su specifične za ovaj konkretan zadatak. Izraz spaja dva zadatka i kreira novi. Ovo pravi novu vrednost tipa . dobija ove vrednosti i pokreće se kako bi vratio niz [| 20; 40 |].

Asinhroni radni proces je definisan kao sekvenca komandi unutar bloka , kao u sledećem primeru:

   let asynctask = 
   async { let req = WebRequest.Create(url)
           let! response = req.GetResponseAsync()
           use stream = response.GetResponseStream()
           use streamreader = new System.IO.StreamReader(stream)
           return streamreader.ReadToEnd() }

Komanda nam govori da izraz sa desne strane treba da se uradi asinhrono, ali da nit treba da se nastavi samo kada je rezultat dostupan. Sa gledišta bloka koda, ovo je kao da dobijanje odgovora blokira sam poziv, dok sa gledišta sistema nit neće biti blokirana i može biti korišćena za obradu drugih niti dok rezultat potreban za nju ne postane dostupan. Asinhroni blok može biti pozvan korišćenjem funkcije . Više blokova mogu da se izvrše paralelno korišćenjem funkcije koja uzima listu objekata (u navedenom primeru je jedan objekat) i pravi novi objekat kako bi izvršila zadatke iz liste paralelno. Rezultujući objekat se poziva korišćenjem funkcije .[18] Inverzija kontrole u prati ovaj obrazac.[18]

Remove ads

Paralelno programiranje

Paralelno programiranje je delimično podržano kroz , i drugih operacija koje izvršavaju asinhrone blokove paralelno. Paralelno programiranje je takođe podržano kroz , operatorom funkcionalnog programiranja iz standardne biblioteke , direktnom upotrebom , direktnom upotrebom zajedničkih niti i niti. One dinamički prevode kod na jezike alternativnih mašina koje izvršavaju parelizaciju. Jedan primer je [19] kod.

Remove ads

Jedinice mere

je tip sistema koji podržava provere brojeva korišćenjem jedinica mera. Jedinica mere je karakteristika koja nam, zajedno sa tipom zaključivanja sistema , omogućava da imamo minimalan broj komentara u našem kodu.[20] Podaci tipa ili označenog mogu da imaju sebi pridružene jedinice mere, koje se najčešće koriste kako bi bliže opisale taj pojam, recimo njegovu dužinu, zapreminu ili masu. Koristeći ove oznake mi omogućavamo kompajleru da utvrdi da li operanti u nasem izrazu imaju odgovarajuće jedinice mere, što pomaze pri sprečavanju grešaka u programu. Sintaksa je sledeća:

   

U navedenom primeru smo definisali promenjivu mera-ime kao jedinicu mere. Opcioni deo se koristi da definiše mere za prethodno definisane jedinice. Na primer možemo definisati meru u centimetrima ili kubnim centimetrima :

   
   

U sledećem primeru možemo videti još neke od postojećih jedinica mera ali i način kako da ih konvertujemo iz bezdimenzionih brojeva u dimenzione vrednosti.

  // Masa, grami.
  [<Measure>] type g
  // Masa, kilogrami.
  [<Measure>] type kg
  // Težina, pounds.
  [<Measure>] type lb
  // Distanca, metri.
  [<Measure>] type m
  // Distanca, cm
  [<Measure>] type cm
  // Distanca, inches.
  [<Measure>] type inch
  // Distanca, stope
  [<Measure>] type ft
  // Vreme, sekunde.
  [<Measure>] type s
  // Sila, Njutn.
  [<Measure>] type N = kg m / s
  // Pritisak, bar.
  [<Measure>] type bar
  // Pritisak, Paskal
  [<Measure>] type Pa = N / m^2
  // Gustima, mililitri.
  [<Measure>] type ml
  // Gustina, litri.
  [<Measure>] type L
  // Definisanje transformacionih konstanti.
  let gramsPerKilogram : float<g kg^-1> = 1000.0<g/kg>
  let cmPerMeter : float<cm/m> = 100.0<cm/m>
  let cmPerInch : float<cm/inch> = 2.54<cm/inch>
  let mlPerCubicCentimeter : float<ml/cm^3> = 1.0<ml/cm^3>
  let mlPerLiter : float<ml/L> = 1000.0<ml/L>
  // Definisanje transformacionih funkcija
  let convertGramsToKilograms (x : float<g>) = x / gramsPerKilogram
  let convertCentimetersToInches (x : float<cm>) = x / cmPerInch


Remove ads

Meta-programiranje

omogućava neke forme personalizacije sintakse kako bi podržao ugrađivanje jedinstvenih domen-specifičnih jezika unutar samog jezika . takodje sadrži odliku run-time meta-programiranja pod nazivom citati[]. Izraz ovog tipa se tretira kao izraz abstraktne sintakse koja je reprezentacija izraza iz . Definiciji koja je obeležena sa atributom se takođe moze pristupiti u njenom citatnom obliku. citati se koriste u raznovrsne svrhe kao sto je na primer kompilacija koda u ili [19] kod.


Remove ads

Programiranje bogato informacijama

Od verzije F# 3.0 postoji oblik programiranja kroz F# tip provajdera. To znači da od ove verzije F# kompajler može da kompajlira različite izvore podataka kao deo programiranja jezika sistema. Ovo je od velikog značaja programerima jer oni u trenutku pisanja koda dobijaju proveru sintaksnih grešaka.[22] Neki od tipova provajdera koji postoje su:

  • format
  • fajlovi ("Sirovi" onlajn podaci se u velikoj meri čuvaju na ovaj način.)
  • Slobodna baza (Internet baza podataka koja sakuplja informacije sa različitih izvora. Iako se iz ovog tipa provajdera teško izvlače strukture podataka, koristan je zbog raznih drugih listi. Ukoliko je veća količina internet saobraćaja sa iste IP adrese, slobodna baza će na određeno vreme blokirati tu adresu.)
  • server
  • (Pogodan kod pretrage određenog proizvoda kada korisnik tačno zna u kojoj grupi je traženi proizvod, čime se pretraga drastično sužava.)

Naravno, ovo su samo neki poznatiji tip provajderi a pored postojećih programer može napraviti svoj tip provajder.[23]

Takođe, F# ima kvalitetne alate za analizu i procesiranje podataka kao što je i R tip provajder.[23] Počev od verzije 3.0 F# ima mogućnost kreiranja upita.[22] Oni zajedno sa tip provajderima omogućavaju programiranje bogato informacijama. Na primer:


     
     
     
     
     
     
     

Agent programiranje

F# podržava varijantu programskog modela kroz implementaciju lakih asinhronih agenata.[23] Na primer naredni kod definiše agenta i ispisuje dve poruke:

     #upozorenje "100"
     let AgentStampanja = MailboxProcessor.Start(fun inbox-> 
       let rec porukaUPetlji = async{
       // čitamo poruku
       let! poruka = inbox.Receive()
       // ispisuje poruku
       printfn "poruka je: %s" poruka
       // vraća na početak
       return! porukaUPetlji  
       }
      // pokrećemo petlju 
      porukaUPetlji 
      )
Remove ads

Razvojni alati

Vizuelni F# alati iz uključuju kompletnu integraciju u -u. U se mogu napraviti F# projekti i debager može biti korišćen za debagovanje F# koda.[23] Takođe, dolazi sa interaktivnom konzolom koja može biti korišćena da izvrši F# kod kako je napisan.

F# kod može se pisati u bilo kom tekstualnom editoru a neki editori kao što je imaju specifičnu podršku za F#[22].

  • je integrisano razvojno okruženje koje podržava F# programiranje na , i uključujući podršku za interaktivnu konzolu koju koristi .
  • je platforma koja omogučava programiranje kompleksnih i aplikacija u F# jeziku.
  • podržava F# od verzije 2.0.
  • podržava F# od verzije 3.0
  • podržava F# od verzije 3.0.
Remove ads

Oblast primene

F# je programski jezik opšte namene, tj. napravljen je za pravljenje softvera u raznim domenima. F# posebno dolazi do izražaja kada je potrebna intenzivna analiza podataka, u paralelnom programiranju, naučnom programiranju u smislu matematičke i statističke kalkulacije i u aplikacijama gde postoje procesi koji se dugo izvršavaju.[24] Podržan je i od strane otvorenih zajednica ali i od strane vodećih industrijskih kompanija koje daju profesionalne alate. F# je Tjuring-kompletan programski jezik.

Veb programiranje

F# je centralni deo platforme gde se F# kod izvršava kao kod na serveru i kao kod na klijentovoj strani.[22] Ostale poznatije platforme za veb aplikacije su:

Skript programiranje


F# pokriva različite domene. U njemu možemo pisati različite stilove programiranja pa je tako F# jako dobro opremljen i za skript programiranje. Zato ga programeri često koriste kao skript jezik, pre svega za skript jezik.[25] F# skript fajl je klasičan F# izvorni kod. Razlika je u tome što ekstenzija .fsx ima neke dodatne mogućnosti. Fajlovi sa ekstenzijom kao i se procesiraju gotovo isto kao i fajlovi sa ekstenzijom . Jedine razlike su u tome što je simbol uslovne kompilacije definisan kao umesto , asembler

    FSharp.Compiler.Interactive.Settings.dll 

je podrazumevano naveden i

    Microsoft.FSharp.Compiler.Interactive.Settings

je podrazumevano otvoren.[22]

Analitičko programiranje

Između ostalog, F# se koristi za finansijsko programiranje, u trgovini energije, optimizaciji portfolia, mašinskom učenju, poslovnoj inteligenciji i u programiranju igrica na . Podržavajući funkcionalno programiranje i posedovanjem velikih mogućnosti oko analize podataka, F# je veoma pogodan za matematičke programe jer se matematički jezik predstavlja u njemu na jednostavan način.[23] F# ima i podršku za

pa zajedno sa jako moćnim bibliotekama koje poseduje je jako pogodan u pravljenje raznih naučnih programa.

Poslednjih godina F# se pozicionirao kao optimizovana alternativa .[22] F# je kompatibilan sa svim proizvodima i to ga je učinilo jako popularnim među programerima. Mnogi programeri daju rešenja zasnovana na F# i koriste Servise.

Otvorene zajednice

F# otvorena zajednica uključuje F# softver fondaciju i F# otvorenu grupu na . Neki od poznatijih otvorenih projekata su:

  • (statički analizator programa (od strane istraživačkog tima))
  • (okruženje u )

Kompatibilnost


U F# se mogu kreirati dve vrste F# biblioteka. Prve su one koje su dizajnirane za korišćenje samo iz F#-a, a druge su one koje su dizajnirne za korišćenje iz bilo kog jezika.[22] Neke od ovih biblioteka mogu izgledati neobično u drugim jezicima ali sa strane F#-a one su onakve kakve trebaju biti.

Bilo koja biblioteka koja se napiše u F# može se koristiti u bilo kom jeziku. Kako bi se ta biblioteka prilagodila što bolje tom jeziku moraju se poštovati sledeća pravila:[23]

  • Koristiti potpis kako bi se sakrili detalji koje od klijenta očekuje.
  • Izbegavati javne funkcije koje vraćaju n-torke.
  • Kada je moguće napisati definiciju tipa.
  • Pažljivo kreirati potpise za klasaklase i interfejse jer veoma mala promena može napraviti veliku razliku.

Reference

Dodatna literatura

Spoljašnje veze

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads