F Sharp

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу
F#
Fsharp logo.png
Originalni naziv F#
Izgovara se Fi šarp
Pojavio se 2005.
Autor(i) Don Syme
Dizajner(i) Microsoft Research, Don Syme
Aktuelna verzija 4.0.1.20
Tipovi promenljivih statički
Uticaji ML, OCaml, C#, Python, Haskell, Scala, Erlang
Uticao na C#, Elm, F*, LiveScript
Operativni sistemi Cross-platform (.NET Framework, Mono, JavaScript)
Licenca Apache licenca
Veb-sajt fsharp.org

F# je strogo tipiziran programski jezik sa otvorenim (open-source) kodom pod OSI-approved Apache 2.0 licencom i prvoklasni jezik u programskom okruženju Vizuelnog Studia.[1] Razvijen je kao .NET implementacija jezgra programskog jezika OCalm[2] pod uticajem programskih jezika C#, Python, Haskell, Scala i Erlang.[3] Ovo je programski jezik sa izraženim funkcionalnim karakteristikama, ali podržava i druge programske paradigme poput imperativne i objektno-orijentisane.[4]

F# је izražajan i koncizan.[1] Služi za pisanje jednostavnih kodova koji će rešavati kompleksne probleme.[1] Iz poslovne perspektive, glavna uloga F#-a je da smanji vreme potrebno za realizaciju analitičkih softverskih komponenti u savremenom preduzeću.[1] Snaga F#-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 F# kao osnovnog jezika mogu se lako kreirati domensko specifični jezici (DSL) što ga čini pogodnim za naučno – istraživačke primene.[4] Studije slučaja i prijave korisnika pokazuju da stroga tipiziranost programskog jezika F# smanjuje softverske greške.[1]

Kod napisan u jeziku F# možemo lako paralelizovati, što je veoma značajno kod računara sa više jezgara.[4] F# poseduje medernu just-in-time (JIT) kompilaciju do izvornog koda.[1] Brzina izvršavanja rezultujućeg koda je mnogo veća no kod jezika kao što su Python, JavaScript ili R, a u pojedinim slučajevima značajno brža od programskog jezika C#.[1] Koristeći F# interaktivno, kod se može odmah izvršiti bez prvog kompajliranja, što omogućava tečnije istraživanje problema. Programeri mogu koristiti F# 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]

F# možemo koristiti na Mac OS X, Linux, Android, HTML5 i ostalim platformama.[1] On je kompatibilan sa svim ostalim .NET jezicima, što znači da F# program može da koristi sve .NET biblioteke.[4] Biblioteka napisana u F#-u može se koristiti u bilo kojoj Desktop ili Web aplikaciji razvijenoj na .NET platformi.[4]

Istorijski razvoj[уреди]

Verzije[уреди]

F# je prošao kroz nekoliko verzija tokom svog razvoja.

Verzija Specifikacija jezika Datum Platforme Izvršavanja Razvojni alati
F# 1.x maj, 2005[5] Windows .NET 1.0 - 3.5 Visual Studio 2005,Emacs
F# 2.0 avgust, 2010 april, 2010[6] Linux, OS X, Windows .NET 2.0 - 4.0 Mono
F# 3.0 novembar, 2012 avgust, 2012[7] Linux, OS X, Windows
JavaScript,[8] GPU[9]
.NET 2.0 - 4.5, Mono Visual Studio 2012, Emacs
WebSharper
F# 3.1 novembar, 2013 oktobar, 2013[10] Linux, OS X, Windows
JavaScript,[8] GPU[9]
.NET 2.0 - 4.5, Mono Visual Studio 2013, Xamarin Studio
Emacs, MonoDevelop
SharpDevelop, WebSharper
CloudSharper
F# 4.0 januar, 2016 juli, 2015[11] Visual Studio 2015

Evolucija jezika[уреди]

Programski jezik F# je prvobitno dizajnirao i implementirao Don Syme iz Microsoft Research-a.[2] Zatim je James Margetson pristupio timu Microsoft Research i ostvario veliki doprinos u razvoju ovog programskog jezika.[2] F# je povezan sa dizajnom generika za .NET.[2] Andrew Kennedy je bio ko-dizajner generika i Units-of-mentions (jedinica mere) za F#.[2] Mads Torgorsen i Raj Pai su bili odgovorni za postavlajnje inicijalnog terena za stvaranje Visual F# i Microsoft Developer Division.[2]

Rezime verzija
F# 1.0 F# 2.0 F# 3.0[12] F# 3.1[13] F# 4.0[14]
Karakteristike
  • Funkcionalno programiranje
  • Diskriminišuće unije (engl. Discriminated unions)
  • Slogovi (engl. Records)
  • Torke
  • Preklapanje obrazaca
  • Tipske skraćenice
  • Objektno programiranje
  • Strukture
  • Potpis fajlova
  • Skript fajlovi
  • Imperativno programiranje
  • Moduli (bez funktora)
  • Ugnježdeni moduli
  • .NET Interoperabilnost
  • Aktivni obrasci
  • Jedinice mere
  • Sekvencijalni izrazi
  • Asinhrono programiranje
  • Agent programiranje
  • Proširenja u vidu članova
  • Imenovanje argumenata
  • Opcioni argumenti
  • Sečenje nizova
  • Citati
  • Prirodna interoperabilnost
  • Računski izrazi
  • Komponenta koja obezbedjuje tipove, svojstva i metod
  • LINQ upitni izrazi
  • CLI mutabilni atribut
  • Trostruko citirani stringovi
  • Automatska svojstva
  • Obezbeđene jedinice mere
  • Imenovanje polja unije
  • Proširenja za sečenje nizova
  • Poboljsanja u sistemu za zakljucivanje tipova
  • Štampanje vrednosti iz unije
  • Obezbeđeni non-null tipovi
  • Primarni konstruktori kao funkcije
  • Statički parametri za izvršne metode
  • Printf interpolacija
  • Proširena #if gramatika
  • Podrška za "fixed"
  • Atribut koji označava repni poziv
  • Višestruko instanciranje interfejsa
  • Opcioni tipovi argumenata
  • Rečnici parametara

Funkcionalno programiranje[уреди]

F# 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. F# je jezik zasnovan na izrazima.[15] Svaka naredba u F# uključujući i if naredbu, try izraze i petlje, spaja se sa izrazima statičkog tipa. Funkcije i izrazi koji ne vraćaju neku vrednost imaju povratni tip unit. F# koristi ključnu reč let da dodeli vrednosti promenjivoj.[15] Na primer:

  let x=3+4 

dodeljuje vrednost 7 promenjivoj x.

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

Torka predstavlja kolekciju od n vrednosti, gdje je n≥0. Vrednost n se zove arnost torke. Trojka će biti predstavljena kao (A, B, C), gdje su A, B i C 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 C#. [15]

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

  {Ime:string; Godine:int}

Može biti kreiran kao:

  {Ime:”AB”; Godine:42}

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

  {r with ime=”CD”}

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

U F# postoji tip list i označava nepromenjivu povezanu listu. Lista se predstavlja koristeći head::tail notaciju (:: je kontra operator) ili kao [item1; item2; item3]. Praznu listu označavamo sa []. [15]

Opcioni tip je diskriminišuća unija sa izborima Some(x) ili None. [15]

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

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 C++, C# ili Visual Basic to je potpuno uobičajno. Nasuprot tome, naredba let u F#-u prilikom svakog povezivanja vrednosti sa identifikatorom upisuje vrednost u novu memorijsku lokaciju. Naravno, ponekad postoji potreba da se i u F# programima piše imperativni kod. To je uglavnom slučaj kad se postojeći, složeni algoritmi, sa nekog imperativnog programskog jezika prenose u F#. [16][17]

Sintaksa programskog jezika F# 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 let upotrebljava ključna reč mutable. 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 ref. Sadržaju reference pristupa se pomoću operatora (!), dok se za izmenu sadržaja koristi operator (:=). [17]

Slogovi sa promenljivim poljima[уреди]

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

Nizovi[уреди]

Niz (engl. array) 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:

  let arr = [| 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:

  arr.[1]<-5

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 F# podržava while petlju i dve vrste for petlje. [17]

While petlja[уреди]

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

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

For petlja[уреди]

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

Jednostavna forma for 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 for petlje.

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

Nabrojiva forma for 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 n.

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

Objektno orijentisano programiranje[уреди]

Najveći deo .NET platforme napisan je u objektno orijentisanim programskim jezicima, prvenstveno u programskom jezicima C#. Zato je poznavanje objektno orijentisanog programiranja od ključne važnosti za korišćenje brojnih .NET 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 F# 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 Vektor2D 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 duzina 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 static:

  static member Nula = Vektor2D(0.,0.)

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 pomnoziSkalarom koja prima parametar k tipa float i vraća Vektor2D objekat čije su dimenzije uvećane k puta.

  member t.pomnoziSkalarom(k) = Vektor2D(k*dx,k*dy)

Iako je preporučljivo da F# 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.)

Asinhrono programiranje[уреди]

F# podržava asinhrono programiranje kroz asinhrone radne procese počev od verzije 1.9.2.9.[18] Asinhroni procesi rada su jedna aplikacija F#-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 “async { return 10+10 }” kreira jedan objekat tipa Async<int>. Ove vrednosti nisu pravi rezultati već su specifične za ovaj konkretan zadatak. Izraz “Async.Parallel [ task1; task2 ]” spaja dva zadatka i kreira novi. Ovo pravi novu vrednost tipa Async<int[]>. Async.run dobija ove vrednosti i pokreće se kako bi vratio niz [| 20; 40 |].

Asinhroni radni proces je definisan kao sekvenca komandi unutar "async" bloka (Async{.....}), 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 let! nam govori da izraz sa desne strane (req.GetResponseAsync()) 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 Async.RunSynchronously. Više "async" blokova mogu da se izvrše paralelno korišćenjem funkcije Async.Parallel koja uzima listu "async" objekata (u navedenom primeru "asynctrack" je jedan "async" objekat) i pravi novi "async" objekat kako bi izvršila zadatke iz liste paralelno. Rezultujući objekat se poziva korišćenjem funkcije "Async.RunSynchronously".[18] Inverzija kontrole u F# prati ovaj obrazac.[18]

Paralelno programiranje[уреди]

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

Jedinice mere[уреди]

F# je tip sistema koji podržava provere brojeva korišćenjem jedinica mera. Jedinica mere je karakteristika koja nam, zajedno sa tipom zaključivanja sistema F#, omogućava da imamo minimalan broj komentara u našem kodu.[20] Podaci tipa float ili označenog int-a 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:

   [<Measure>] type mera-ime [ = measure ]

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 :

   [<Measure>] type cm
   [<Measure>] type ml = cm^3

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


Meta-programiranje[уреди]

F# omogućava neke forme personalizacije sintakse kako bi podržao ugrađivanje jedinstvenih domen-specifičnih jezika unutar samog jezika F#. F# 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 F#. Definiciji koja je obeležena sa atributom "[<ReflectedDefinition>]" se takođe moze pristupiti u njenom citatnom obliku. F# citati se koriste u raznovrsne svrhe kao sto je na primer kompilacija F# koda u JavaScritp[21] ili GPU [19] kod.


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:

  • CSV 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 IP adresu.)
  • Azure Marketplace (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 Deedle i R tip provajder.[23] Počev od verzije 3.0 F# ima mogućnost kreiranja LINQ upita.[22] Oni zajedno sa tip provajderima omogućavaju programiranje bogato informacijama. Na primer:


     open Microsoft.FSharp.Data.TypeProviders
     
     type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">
     
     let podaci = Northwind.GetDataContext()
     
     let upit1 = upit { for korisnik in podaci.Korisnik do select korisnik }

Agent programiranje[уреди]

F# podržava varijantu programskog modela Actor kroz "in-memory" 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 
      )

Razvojni alati[уреди]

Vizuelni F# alati iz Microsoft-a uključuju kompletnu IDE integraciju u Visual Studio-u. U Visual Studio-u se mogu napraviti F# projekti i Visual Studio debager može biti korišćen za debagovanje F# koda.[23] Takođe, Visual F# studio dolazi sa Visual Studio REPL 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 Emacs imaju specifičnu podršku za F#[22].

  • MonoDevelop je integrisano razvojno okruženje koje podržava F# programiranje na Linux-u, Mac-u i Windows-u uključujući podršku za interaktivnu konzolu koju koristi Visual Studio.
  • LINQPad podržava F# od verzije 2.0.

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 WebSharper platforme gde se F# kod izvršava kao .NET kod na serveru i kao JavaScript kod na klijentovoj strani.[22] Ostale poznatije platforme za veb aplikacije su:

  • suave.io
  • nancyFx
  • freya
  • frank
  • F# ASP.NET MVC

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 REPL 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 .fsx kao i .fssscript se procesiraju gotovo isto kao i fajlovi sa ekstenzijom .fs. Jedine razlike su u tome što je simbol uslovne kompilacije definisan kao interactive umesto compiled, 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 Facebook-u. 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 C#-a.[22] F# je kompatibilan sa svim Microsoft-ovim proizvodima i to ga je učinilo jako popularnim među programerima. Mnogi programeri daju rešenja zasnovana na F# i koriste C# WCF Servise.

Otvorene zajednice[уреди]

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

  • VCC (statički analizator C programa (od strane Microsoftovog istraživačkog tima))
  • VSLab (okruženje u Visual Studio-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 .NET jezika.[22] Neke od ovih biblioteka mogu izgledati neobično u drugim .NET 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 .NET jeziku. Kako bi se ta biblioteka prilagodila što bolje tom jeziku moraju se poštovati sledeća pravila:[23]

  • Koristiti potpis .fsi kako bi se sakrili detalji koje API 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[уреди]

  1. 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 „Try F#: Explore[[Категорија:Ботовски наслови]]”. Архивирано из оригинала на датум 19. 11. 2016. Приступљено 17. 11. 2016.  Сукоб URL—викивеза (помоћ)
  2. 2,0 2,1 2,2 2,3 2,4 2,5 „F# Historical Acknowledgements”. Приступљено 24. 11. 2012. 
  3. ^ F Sharp (programming language) - Wikipedia
  4. 4,0 4,1 4,2 4,3 4,4 4,5 4,6 Programski jezik F# | ediba94
  5. ^ Syme, Don. „F# 1.0.8 released”. Microsoft. Приступљено 7. 09. 2014. 
  6. ^ Syme, Don. „F# 2.0 released as part of Visual Studio 2010”. Microsoft. Приступљено 7. 09. 2014. 
  7. ^ Zander, Jason. „Visual Studio 2012 and .NET Framework 4.5 released to the web”. Microsoft. Приступљено 7. 09. 2014. 
  8. 8,0 8,1 The F# Software Foundation. „Using F# with HTML5 Web Applications”. Приступљено 07. 06. 2014. 
  9. 9,0 9,1 The F# Software Foundation. „Using F# for GPU Programming”. Приступљено 07. 06. 2014. 
  10. ^ „Visual Studio 2013 released to web”. Microsoft. Приступљено 7. 09. 2014. 
  11. ^ „Announcing the RTM of Visual F# 4.0”. Microsoft. Приступљено 15. 09. 2015. 
  12. ^ McNamara, Brian. „More About F# 3.0 Language Features”. Microsoft. Приступљено 7. 09. 2014. 
  13. ^ McNamara, Brian. „Announcing a pre-release of F# 3.1”. Microsoft. Приступљено 7. 09. 2014. 
  14. ^ Syme, Don. „Status of F# 4.0+ Approved Language/Library Items”. F# Language Evolution BDFL. Microsoft. Приступљено 7. 09. 2014. 
  15. 15,0 15,1 15,2 15,3 15,4 15,5 15,6 15,7 15,8 http://tomasp.net/articles/fsharp-i-introduction/article.pdf
  16. 16,0 16,1 16,2 16,3 16,4 16,5 16,6 16,7 16,8 F# Overview (III.) - Imperative and Object-Oriented Programming - Tomas Petricek
  17. 17,0 17,1 17,2 17,3 17,4 17,5 17,6 17,7 17,8 17,9 4. Imperative Programming - Programming F# 3.0, 2nd Edition [Book]
  18. 18,0 18,1 18,2 Introducing F# Asynchronous Workflows – Don Syme's WebLog on F# and Related Topics
  19. 19,0 19,1 Use F# for GPU Programming | The F# Software Foundation
  20. ^ Units of Measure (F#)
  21. ^ Using F# for HTML5 Web Applications | The F# Software Foundation
  22. 22,0 22,1 22,2 22,3 22,4 22,5 22,6 https://books.google.rs/books?id=XKhPCwAAQBAJ.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)
  23. 23,0 23,1 23,2 23,3 23,4 23,5 https://books.google.me/books?id=b_j2IkRTHUEC.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)
  24. ^ http://fsharp.org/guides/data-science/.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)
  25. ^ https://blogs.msdn.microsoft.com/chrsmith/2008/09/12/scripting-in-f/.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)

Spoljašnje veze[уреди]