__БЕЗКН__

-{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. Razvijen je kao -{.NET}- implementacija jezgra programskog jezika -{OCalm}- pod uticajem programskih jezika -{C#}-, -{Python}-, -{Haskell}-, -{Scala}- i -{Erlang}-.F Sharp (programming language) - Wikipedia Ovo je programski jezik sa izraženim funkcionalnim karakteristikama, ali podržava i druge programske paradigme poput imperativne i objektno-orijentisane.Programski jezik F# | ediba94

-{F#}- је izražajan i koncizan. Služi za pisanje jednostavnih kodova koji će rešavati kompleksne probleme. Iz poslovne perspektive, glavna uloga -{F#}--a je da smanji vreme potrebno za realizaciju analitičkih softverskih komponenti u savremenom preduzeću. 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. Omogućava brzo generalisanje prototipova kao i njihovu brzu transformaciju u produktivni kod. 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. Studije slučaja i prijave korisnika pokazuju da stroga tipiziranost programskog jezika -{F#}- smanjuje softverske greške.

Kod napisan u jeziku -{F#}- možemo lako paralelizovati, što je veoma značajno kod računara sa više jezgara. -{F#}- poseduje medernu -{just-in-time (JIT)}- kompilaciju do izvornog koda. 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#}-. 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. Kod će se izvršavati i na 32-bitnom i na 64-bitnim sistemima uz korišćenje upustva za odgovarajuce arhitekture.

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

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 -{Windows}- -{.NET 1.0 - 3.5}- -{Visual Studio 2005}-,-{Emacs}- -{F# 2.0}- avgust, 2010 april, 2010 -{Linux}-, -{OS X}-, -{Windows}- -{.NET 2.0 - 4.0}- -{Mono}- -{F# 3.0}- novembar, 2012 avgust, 2012 -{Linux}-, -{OS X}-, -{Windows}--{JavaScript}-, -{GPU}- -{.NET}- 2.0 - 4.5, -{Mono}- -{Visual Studio 2012}-, -{Emacs}--{WebSharper}- -{F# 3.1}- novembar, 2013 oktobar, 2013 -{Linux}-, -{OS X}-, -{Windows}--{JavaScript}-, -{GPU}- -{.NET 2.0 - 4.5}-, -{Mono}- -{Visual Studio 2013}-, -{Xamarin Studio}--{Emacs}-, -{MonoDevelop}--{SharpDevelop}-, -{WebSharper}--{CloudSharper}- -{F# 4.0}- januar, 2016 juli, 2015 -{Visual Studio 2015}-

Evolucija jezika

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

+ Rezime verzija -{F# 1.0}- -{F# 2.0}- -{F# 3.0}- -{F# 3.1}- -{F# 4.0}- 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.http://tomasp.net/articles/fsharp-i-introduction/article.pdf 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. 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.

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.

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#}-.

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}-).

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 [].

Opcioni tip je diskriminišuća unija sa izborima -{Some(x)}- ili -{None}-.

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

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#}-.F# Overview (III.) - Imperative and Object-Oriented Programming - Tomas Petricek

Sintaksa programskog jezika -{F#}- razlikuje tri vrste promenljivih struktura, i to: Lokalne promenljive Reference Slogove sa promenljivim poljima

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).

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 (:=).

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.

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. 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. 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., na primer: -{arr.<-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.

-{While}- petlja -{While}- petlja se izvršava sve dok uslov ciklusa vraća logičku vrednost -{true}-. 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.

Jednostavna forma -{for}- petlje podrazumeva postojanje celobrojne ciklusne promenljive (brojača) u zaglavlju petlje, koja uzima vrednosti između donje i gornje granice. 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. 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.