Julija (programski jezik)

Iz Vikipedije, slobodne enciklopedije
Jump to navigation Jump to search
Julija
Julia prog language.svg
Prvobitni
autor(i)
Džef Bezanson, Stefan Karpinski, Viral B. Shah, Alan Eldman
Prva verzija 2012. godina
Najnovija
verzija
0.4.3 / 0.3.12
12. januar 2016. godine
Predverzija 0.5.0-dev / dnevno ažuriran
OS Linuks, OS X, FreeBSD, Majkrosoft vindous
Dostupno u MATLAB, Lisp, C, Fortran, Matematika[1] (striktno svoj Volfram program), Pajton, Perl, R, Rubi, Lua[2]
Licenca EmAjTi licenca,[3] GPL v2[4][5] Opcija za pravljenje fajlova pomoću GPL biblioteka.[6]
Veb-sajt julialang.org
Standard(i) .jl

Julija je dinamički i programski jezik visokog nivoa dizajniran da odgovori na zahteve razvijenih numeričkih i naučnih izračunavanja, ali je takođe efektivan za efektivno opšte programiranje,[7][8][9][10] veb upotrebu[11][12], može se koristiti i za specifikaciju programskog jezika.[13] Karakteristike Julija programskog jezika obuhvatuju tipski sistem u paketu sa parametarskim tipskim sistemom u obliku celokupnog dinamičnog programskog jezika, kao i u obliku posebnih paketa u obliku sopstvenog jezgra programske paradigme. Omogućava istovremeno, paralelno i distribuirano izračunavanje, i direktno pozivanje biblioteka programskih jezika C i Fortran, bez posebnog koda.  Julija je sakupljač smeća,[14] program koji koristi željenu procenu i u sebi sadrži efikasne biblioteke za izračunavanja, linearnu algebru, nasumičnu generaciju brojeva, brze Furijerove transformacije i upoređivanje regularnih izraza.

Karakteristike programskog jezika[uredi]

Kako nam oficijalni sajt kaže, glavne karakteristike ovog programskog jezika su:

  • Višestruko otpremanje: pružanje mogućnosti da se definiše ponašanje funkcije u više različitih tipova argumenata
  • Dinamični tip sistema: tipovi za dokumentaciju, optimizaciju, i obaveštenje
  • Dobre performanse, sličan statičkim tipskim programima kao što je C.
  • Ugrađen menadžer paketa
  • Lisp kao makroi i drugi objekti metaprogramiranja
  • Pozivanje Pajtonovih funkcija: koristiti PajKol (PyCall) paket[a]
  • Direktno pozivanje C funkcija: nije potreban specijalni API
  • Veoma dobar šel uz pomoć kojeg se upravlja drugim procesima
  • Dizajniran je za paralelno i raspodeljeno izračunavanje
  • Korutine: jednostavan "zeleni" navoj
  • Korisnički definisani tipovi predstavljaju ugrađene funkcije i veoma su kompaktni i brzi
  • Automatsko proračunavanje efikasnosti, specijalizovan je kod za različite tipske argumente
  • Elegantne i proširive konverzije i promocije za brojeve i ostale tipove
  • Efikasna podrška za Junikod, koji poseduje UTF-8.

Višestruko otpremanje (poznato još i kao "višestruke metode" u Lisp-u) predstavlja uprošćavanje jednog otpremanja - najčešće se koristi polimorfni mehanizam u objektno orijentisanim (OO)  programima koji koriste nasleđivanje. U Juliji, svi konkretni tipovi su podtipovi abstraktnih tipova, direktno ili indirektno poditpovi "Eni (any)" tipova, koji su na vrhu hijerarhije. Konkretni tipovi ne mogu biti podtipovi, ali se njihova kompozicija koristi preko nasleđivanja, koje koriste objektno orijentisani programi (takođe videti Nasleđivanje protiv podtipova).


Julija crpi značajnu inspiraciju iz različitih dijalekata programskog jezika Lisp, uključujući Šem i Common Lisp, i ima dosta zajedičkih odlika sa Dilanom (kao što je Algol koji ima slobodnu formu infiks sintakse dok Lisp ima prefiks sintaksu, dok je u Luliji "sve"[18] izraz) - takođe predstavlja dinamički programski jezik baziran na višesložnom uprošćavanju - i Fotres, još jedan numerički programski jezik sa osobinom višestrukog uprošćavanja i sofisticiranim parametarskim tipskim sistemom. Dok KLOS daje višestruko uprošćavanje od Common Lisp-a, uz dodatak: samo  korisnički definisane funkcije eksplicitno deklarisane da budu generičke mogu biti proširene sa nekoliko novih multimetoda.


Julija makori - poznati kao higijenski makroi, koji se koriste za implementaciju metaprogramiranja, slično makroima korišćenim u Lisp-u - veoma su moćni i različiti su od nehigijenskih makroa korišćenih u nekim drugim programskim jezikama kao što je npr. C.

U Juliji, Dilanu i Fortresu, sa druge strane glediša, ova moć proširivanja je standardna, i sistemi ugrađenih funkcija su generički i proširivi. U Dilanu, višestruko uprošćavanje je osnovna funkcija kao što je slučaj u Juliji: sve korisnički definisane funkcije pa čak i osnovne ugrađene operacije, kao što je +, su generičke. Dilanov tipski sistem, međutim, ne podržava baš sve parametarske tipove, koji su više tipični za ML programske jezike. Standardno, KLOS ne podržava uprošćavanja Lisp-ovih parametarskih tipova; kao što su - uprošćavanje  proširenih semantika koje se jedino mogu dodati kao ekstenzija kroz KLOS-ov protokol Metaobjekta. Prema konvergentnom dizajnu, Fortres takođe poseduje višestruko uprošćavanje parametarskih tipova; suprotno od Julije, međutim, Fotres nije dinamički nego statički tip, sa odvojenom kompilacijom i izvršavanjem faza. Karakteristike programskih jezika su predstavljene u sledećoj tabeli:

Program Tip sistema Generičke funkcije Parametarski tipovi
Julija dinamički standardne da
Common Lisp dinamički upravljačke da (ali ne uprošćavanje)
Dilan dinamički standardne parcijalni (bez uprošćavanja)
Fortres statički standardne da

Interakcija[uredi]

Julijina zvanična distribucija obuhvata interaktivni šel, koji se naziva REPL, koji se može koristiti za eksperimentisanje i brzo testiranje koda.[19] Sledeći framgent predstavlja jednostavan primer REPL-a:[20]

julia> p(x) = 2x^2 + 1; f(x, y) = 1 + 2p(x)y
julia> println("Hello world!", " I'm on cloud ", f(0, 4), " as Julia supports recognizable syntax!")
Hello world! I'm on cloud 9 as Julia supports recognizable syntax!

REPL omogućava pristup sistemu šela i ima pomoćni režim, pritiskanjem ; ili ? posle linije (prethodeći svakoj komandi), respektivno. REPL takođe čuva istoriju komandi, čak i između sesija. Za dodatne primere, videti Julijinu dokumentaciju[21] koja daje kodove koji se mogu testirati unutar Julijine interaktivne sekcije ili snimanjem fajla kao .jl ekstenzija i pokrenuti sa komandne linije kucanjem (na primer):[18]

$ julia <filename>

Julija je takođe podržana od strane Jupitera, onlajn interaktivnog "nutbuks (notebooks)" okruženja (projektovani Jupiter je višejezična ekstenzija, koja je "dobijena" iz IPajtonove (IPython) komandne linije; koja sadrži Juliju).


Korišćenje Julije na drugim jezicima[uredi]

Julijin ccall (C-poziv) ključne reči se koristi za pozivanje C-ove (ili Fortranove) zajedničke biblioteke funkcija.

Julija ima Junikod podršku, uz pomoć UTF-8 koji se koristi za izvorni kod koji uglavnom dozvoljava uobičajne matematičke simoble za različite operacije, kao što je npr. ∈ za in operator. Uz pomoć stringova UTF-8, UTF-16 i UTF-32 (i ASCII) kodiranje je potpuno podržano.

Julija ima pakete koji podržavaju jezike za označavanje kao što su, HTML (takođe za HTTP), XML, JSON, BSON (i MongoDB) itd.

Implementacija[uredi]

Julijino jezgro je implementirano u C i C++ (C++ zavisi od VMNR), sopstvenom parseru u Šem programskom jeziku ("femtolisp"), dok se VMNR okvirni kompajler koristi u "tačno na vreme" (TNV) generacijama 64-bitnih ili 32-bitnih mašinskih kodova (npr. ne i za virtuelnu mašinu[22]) u zavisnosti od platforme koju Julija koristi. Uz nekoliko izuzetaka (npr. libuv), standardna biblioteka je samostalno ugrađena u Juliji. Najznačajniji aspekt Julijine implementacije je brzina, koja je često faktor dve beze u odnosu na potpuno optimizovan C kod (a samim tim često magnituda raste brže nego u Pajtonu ili R-u).[23] Razvoj programskog jezika Julija je započet 2009. godine dok je verzija otvorenog koda objavljena u Februaru 2012. godine.[1][24]

Julija, 0.4 linija, predstavlja raspored koji izlazi jednom mesečno gde su ispravljeni svi bagovi i gde vraćaju/dodaju neke karakteristike.[25]

Trenutne i buduće platforme[uredi]

Dok Julija koristi TNV[26] (MCTNV[27] iz VMNR-a) – Julija generiše sve prirodne mašinske kodove, direktno kada se funkcija pokrene prvi put (nebajtkod pokrenut na virtuelnoj mašini, npr. preko Jave/Dalvika)

Trenutna podrška za novije x86 ili starije i386 procesore i u 0.4.0. 32-bitnoj ARM arhitekturi ("Eksperimentalna i rana podrška"[28] uz pomoć "posla u toku - za nekoliko testova je poznato da su nepoloženi, i da se ne mogu videti"[29] uz pomoć alfa podrške za Raspberi Pi 1/2[30][31] ali "[na ARMv7] Samsungovoj hrom-knjizi [..] Julija se pokreće sasvim dobro"[32]), 64-bitnom ARMv8[33] i PowerPC.[34][35]

Julija2C "izvor-do-izvora" kompajler[uredi]

Julija2C "izvor do izvora" kompajler se može nabaviti iz Intelove labaratorije.[36] Ovaj "izvor do izvora" kompajler je Julijin fork, koji implementira istu programsku sintaksu kao u Juliji, koji emituje C kod (zbog kompaktibilnosti sa procesorom) umesto prirodnog mašinskog koda za funkcije ili cele programe. Kompajler dozvoljava analiziranje koda na većem nivo nego u programskom jeziku C.[37]

Beleške[uredi]

  1. ^ Pozivanje novog Pajton 3 takođe radi [15][16] (kao i PajPaj[17]) a pozivanje u suprotnom smeru, iz Pajtona u Juliju, je takođe omogućeno preko pyjulia. Čak je moguće i pozivanje rekurzije između ova dva programska jezika, bez (ili uz) pomoć korišćenja Polyglot.jl, koji podržava dodatne Pajtonove programe.

Reference[uredi]

  1. 1,0 1,1 "Why We Created Julia".
  2. ^ „Introduction — Julia Language 0.5.0-dev documentation”. Julia.readthedocs.org. Pristupljeno 15. 1. 2016. 
  3. ^
  4. ^ The Julia Language
  5. ^ „Non-GPL Julia?”. Groups.google.com. Pristupljeno 15. 1. 2016. 
  6. ^ „Introduce USE_GPL_LIBS Makefile flag to build Julia without GPL libraries”. »Note that this commit does not remove GPL utilities such as git and busybox that are included in the Julia binary installers on Mac and Windows. It lets you build from source without any GPL library dependencies.« 
  7. ^ "The Julia Language" (official website).
  8. ^ Bryant, Avi (15 October 2012).
  9. ^ Krill, Paul (18 April 2012).
  10. ^ Finley, Klint (3 February 2014).
  11. ^ "Escher lets you build beautiful interactive Web UIs in Julia".
  12. ^ "Getting Started with Node Julia". node-julia.
  13. ^ Moss, Robert (26 June 2015).
  14. ^ "Suspending Garbage Collection for Performance...good idea or bad idea?"
  15. ^ „Google Groups”. Groups.google.com. Pristupljeno 2. 2. 2016. 
  16. ^ stevengj (10. 12. 2015). „PyCall.jl/PyCall.jl at master · stevengj/PyCall.jl · GitHub”. Github.com. Pristupljeno 2. 2. 2016. 
  17. ^ „wavexx/Polyglot.jl: transparent remote/recu...”. GitHub. Pristupljeno 2. 2. 2016. 
  18. 18,0 18,1 „Learn Julia in Y Minutes”. Learnxinyminutes.com. Pristupljeno 15. 1. 2016. 
  19. ^ „Julia REPL documentation”. Docs.julialang.org. 16. 6. 2014. Pristupljeno 15. 1. 2016. 
  20. ^ See also: http://julia.readthedocs.org/en/latest/manual/strings/ for string interpolation and the string(greet, ", ", whom, ".\n") example for preferred ways to concatenate strings.
  21. ^ "Julia Documentation". julialang.org.
  22. ^ "Chris Lattner discusses the name LLVM".
  23. ^ "Julia: A Fast Dynamic Language for Technical Computing" (PDF). 2012.
  24. ^ Gibbs, Mark (9 January 2013).
  25. ^ 0.3.3. „0.3.3 release planning issue · Issue #9045 · JuliaLang/julia · GitHub”. Github.com. Pristupljeno 15. 1. 2016. 
  26. ^ "Support MCJIT".
  27. ^ "Using MCJIT with the Kaleidoscope Tutorial". 22 July 2013.
  28. ^ „JuliaLang/julia - Julia”. GitHub. Pristupljeno 15. 1. 2016. 
  29. ^ JuliaLang (26. 11. 2015). „julia/README.arm.md at master · JuliaLang/julia · GitHub”. Github.com. Pristupljeno 15. 1. 2016. 
  30. ^ "Cross-compiling for ARMv6".
  31. ^ "ARM build failing during bootstrap on Raspberry Pi 2".
  32. ^ „Cross-compiling for ARMv6 · Issue #10488 · JuliaLang/julia · GitHub”. Github.com. Pristupljeno 15. 1. 2016. 
  33. ^ „AArch64 build fails surprisingly close to the end (building sys0.o) · Issue #10791 · JuliaLang/julia · GitHub”. Github.com. Pristupljeno 15. 1. 2016. 
  34. ^ JuliaLang. „julia/Make.powerpc at master · JuliaLang/julia · GitHub”. Github.com. Pristupljeno 15. 1. 2016. 
  35. ^ "Porting Julia to PowerPC".
  36. ^ „julia/j2c at j2c · IntelLabs/julia · GitHub”. Github.com. Pristupljeno 15. 1. 2016. 
  37. ^ "Julia2C initial release".

Spoljašnje veze[uredi]