Što je Julia? Svjež pristup numeričkom računanju

Julia je besplatni jezik otvorenog koda, visoke performanse, dinamičkih programskih jezika za numeričko računanje. Ima razvojnu pogodnost dinamičnog jezika s izvedbom kompiliranog statički otkucanog jezika, dijelom zahvaljujući JIT-kompajleru koji se temelji na LLVM-u koji generira izvorni strojni kod, a dijelom dizajnu koji implementira stabilnost tipa kroz specijalizaciju putem višestrukih otpreme, što olakšava kompajliranje u učinkovit kod.

U postu na blogu koji najavljuje početno puštanje Julije za 2012. godinu, autori jezika - Jeff Bezanson, Stefan Karpinski, Viral Shah i Alan Edelman - izjavili su da su proveli tri godine stvarajući Juliju jer su bili pohlepni . Dosadili su im kompromisi između Matlaba, Lispa, Pythona, Rubyja, Perla, Mathematice, R i C i željeli su jedan jezik koji bi bio dobar za znanstveno računanje, strojno učenje, rudarenje podataka, linearnu algebru velikih razmjera , paralelno računanje i distribuirano računanje.

Za koga je Julia? Osim što je privlačna istraživačkim znanstvenicima i inženjerima, Julia je privlačna i znanstvenicima iz područja podataka te financijskim analitičarima i kvantima.

Dizajneri jezika i još dvoje osnovali su Julia Computing u srpnju 2015. kako bi "razvili proizvode koji Juliju čine lakom za upotrebu, lakom za postavljanje i lakom za skaliranje." Od ovog pisanja, tvrtka ima 28 zaposlenih i kupaca, od nacionalnih laboratorija preko banaka do ekonomista do autonomnih istraživača vozila. Uz održavanje otvorenih izvora Julia na GitHubu, Julia Computing nudi komercijalne proizvode, uključujući JuliaPro, koji dolazi u besplatnoj i plaćenoj verziji.

Zašto Julia?

Julia "želi stvoriti kombinaciju bez presedana jednostavnosti upotrebe, snage i učinkovitosti na jednom jeziku." Pitanje učinkovitosti uzmite u obzir grafikon u nastavku:

Julia Computing

Mjerila Julije

Ovdje vidimo da Julia kôd može biti brži od C za nekoliko vrsta operacija, a ne više od nekoliko puta sporiji od C za druge. Usporedite to s, recimo, R, koji za neke operacije može biti gotovo 1.000 puta sporiji od C.

Imajte na umu da je jedan od najsporijih testova za Juliju Fibonaccijeva rekurzija; to je zato što Julia trenutno nema optimizaciju rekurzije repa. Rekurzija je sama po sebi sporija od petlje. Za stvarne Julia programe koje želite pokrenuti u proizvodnji, želite implementirati oblik petlje (iteracija) takvih algoritama.

Kompilacija Julia JIT

Pristup kompajlera JIT (just-in-time) košta, za razliku od čistog interpretatora: kompajler mora raščlaniti izvorni kod i generirati strojni kôd prije nego što se vaš kôd može pokrenuti. To može značiti zamjetno vrijeme pokretanja programa Julia prvi put kad se svaka funkcija i makronaredba pokrenu u sesiji. Dakle, na snimci zaslona u nastavku vidimo da drugi put kada generiramo milijun slučajnih brojeva s pomičnom zarezom, potrebno vrijeme je za red veličine manje nego za prvo izvršavanje. I @timemakronaredbu i rand()funkciju trebalo je prevesti prvi put putem koda, jer su biblioteke Julia napisane na Juliji.

julia> @time rand (10 ^ 6);

  0,62081 sekunde (14,44 k dodjela: 8,415 MiB)

julia> @time rand (10 ^ 6);

  0,004881 sekunde (7 izdvajanja: 7,630 MiB)

Navijači Julije tvrde, s druge strane, da ima jednostavnost upotrebe Pythona, R ili čak Matlaba. Te se usporedbe podvrgavaju kontroli, jer je jezik Julia elegantan, moćan i orijentiran na znanstveno računanje, a knjižnice nude širok spektar naprednih programskih funkcija.

Primjer Julije

Kao brzi primjer jezika Julia, uzmite u obzir sljedeći Mandelbrotov set referentnog koda:

Kao što vidite, aritmetika složenih brojeva ugrađena je u jezik, kao i makronaredbe za testove i vrijeme. Kao što također možete vidjeti, posljednje točke sa zarezom koje muče jezike slične C-u i ugniježđene zagrade koje pogađaju jezike slične Lispu-u, odsutni su od Julije. Imajte na umu da mandelperf()se poziva dva puta, u redovima 61 i 62. Prvi poziv testira rezultat na ispravnost i vrši JIT-kompilaciju; drugi poziv dobiva vrijeme.

Julia programiranje

Julia ima još mnogo značajki koje vrijedi spomenuti. Kao prvo, korisnički definirani tipovi brzi su i kompaktni poput ugrađenih. U stvari, možete deklarirati apstraktne tipove koji se ponašaju kao generički tipovi, osim što su kompilirani za tipove argumenata koji su proslijeđeni.

S druge strane, Julijina ugrađena vektorizacija koda znači da nema potrebe da programer vektorizira kôd radi izvedbe; obični devektorizirani kod je brz. Prevoditelj može iskoristiti SIMD upute i registre ako su prisutni na osnovnom CPU-u i odmotati petlje u sekvencijalnom procesu kako bi ih vektorizirao onoliko koliko hardver dopušta. Bilješkom možete označiti petlje kao vektorizibilne @simd.

Julia paralelizam

Julia je također dizajnirana za paralelizam i distribuirano računanje, koristeći dva primitiva: udaljene reference i udaljene pozive. Udaljene reference dolaze u dva okusa:  Future i  RemoteChannel. A Futureje ekvivalent JavaScript-a promise; a RemoteChannelje za ponovni upis i može se koristiti za međuprocesnu komunikaciju, poput Unixa pipeili Go-a channel. Pod pretpostavkom da ste Juliju pokrenuli s više procesa (npr. julia -p 8Za osmojezgreni procesor kao što je Intel Core i7), možete @spawnili remotecall()funkcionirati pozive za izvršavanje na drugom Julijinom procesu asinkrono, a kasnije fetch()i Futurevraćene kada želite sinkronizirati i koristiti proizlaziti.

Ako ne trebate izvoditi na više jezgri, možete upotrijebiti lagane "zelene" navoje, nazvane "a" Task()u Juliji i "coroutine" na nekim drugim jezicima. A Task()ili @taskradi zajedno s a Channel, što je jednoprocesna verzija RemoteChannel.

Sustav tipa Julia

Julia ima neupadljiv, ali moćan sustav tipova koji je prema zadanim postavkama dinamičan s zaključivanjem tipa vremena izvođenja, ali omogućuje neobavezne oznake tipa. Ovo je slično TypeScriptu. Na primjer:

julija> (1 + 2) :: AbstractFloat

POGREŠKA: TypeError: typeassert: očekuje se AbstractFloat, dobio je Int64

julija> (1 + 2) :: Int

3

Ovdje prvi put utvrđujemo nekompatibilni tip, uzrokujući pogrešku, a drugi put kompatibilni tip.

Žice Julije

Julia ima učinkovitu podršku za Unicode nizove i znakove, pohranjene u UTF-8 formatu, kao i učinkovitu podršku za ASCII znakove, jer su u UTF-8 kodne točke manje od 0x80 (128) kodirane u jedan znak. Inače, UTF-8 je kodiranje promjenljive duljine, pa ne možete pretpostaviti da je duljina niza Julia jednaka zadnjem indeksu znakova.

Potpuna podrška za UTF-8, između ostalog, znači da lako možete definirati varijable pomoću grčkih slova, što može učiniti da znanstveni Julijin kod izgleda jako poput udžbeničkih objašnjenja formula, npr sin(2π). Osigurana je transcode()funkcija za pretvaranje UTF-8 u i iz drugih Unicode kodiranja.

C i Fortran funkcije

Julia može izravno pozivati ​​funkcije C i Fortran, bez potrebe za omotom ili posebnim API-jem, iako morate znati "ukrašeno" ime funkcije koju emitira Fortran-ov kompajler. Vanjska funkcija C ili Fortran mora biti u zajedničkoj knjižnici; koristite ccall()funkciju Julia za stvarni poziv. Na primjer, na sustavu sličnom Unixu možete koristiti ovaj Julijin kôd za dobivanje vrijednosti varijable okoline pomoću getenvfunkcije u libc:

funkcija getenv (var :: AbstractString)

     val = poziv ((: getenv, "libc"),

                 Cstring, (Cstring,), var)

     ako je val == C_NULL

         pogreška ("getenv: nedefinirana varijabla:", var)

     kraj

     nesigurni_niz (val)

kraj

julia> getenv ("SHELL")

"/ bin / bash"

Makronaredbe Julia

Julia ima makronaredbe slične Lispu, za razliku od makroprocesora koje koriste C i C ++. Julia također ima i druge mogućnosti za metaprogramiranje, poput refleksije, generiranja koda, simbola (npr. :foo) I izraza (npr. :(a+b*c+1)) Objekata eval(), i generirane funkcije. Makronaredbe Julia procjenjuju se u vrijeme raščlanjivanja.

Generirane funkcije, s druge strane, proširuju se kad su vrste njihovih parametara poznate, prije sastavljanja funkcija. Generirane funkcije imaju fleksibilnost generičkih funkcija (kao što je implementirano u C ++ i Java) i učinkovitost jako tipiziranih funkcija, eliminirajući potrebu za slanjem u vremenu izvođenja radi podrške parametarskom polimorfizmu.

GPU podrška

Julia ima GPU podršku koristeći, između ostalog, MXNet paket za duboko učenje, knjižnicu arrayFire GPU polja, linearnu algebru cuBLAS i cuDNN i duboke neuronske mreže te CUDA okvir za GPU opće potrebe. Omotači Julia i njihove knjižnice prikazani su na donjem dijagramu.

Julia Computing

JuliaPro i Juno IDE

Besplatni naredbeni redak otvorenog koda Julia za Windows, MacOS, generički Linux ili generički FreeBSD možete preuzeti s web mjesta s jezikom Julia. Možete klonirati spremište izvornog koda Julia s GitHub-a.

Možete i preuzeti JuliaPro s Julia Computing. Uz kompajler, JuliaPro vam daje Juno IDE na osnovi Atoma (prikazan u nastavku) i više od 160 kuriranih paketa, uključujući vizualizaciju i crtanje.

Osim onoga što je u besplatnom JuliaPro, možete dodati pretplate za podršku poduzećima, kvantitativnu financijsku funkcionalnost, podršku bazama podataka i analizu vremenskih serija. JuliaRun je prilagodljiv poslužitelj za klaster ili oblak.

Jupyterove bilježnice i IJulia

Osim što Juno koristite kao svoj Julia IDE, možete koristiti Visual Studio Code s proširenjem Julia (prikazano izravno u nastavku) i Jupyter bilježnice s IJulia kernelom (prikazano na drugom i trećem snimku zaslona u nastavku). Možda ćete trebati instalirati Jupyterove bilježnice za Python 2 ili (po mogućnosti) Python 3 s Anacondom ili pipom.

JuliaBox

Možete pokrenuti Juliju u Jupyter prijenosnim računalima putem interneta pomoću JuliaBox-a (prikazanog dolje), drugog proizvoda tvrtke Julia Computing, bez ikakve instalacije na vašem lokalnom računalu. JuliaBox trenutno uključuje više od 300 paketa, pokreće Julia 0.6.2 i sadrži desetke tutorial Jupyterovih bilježnica. Popis mapa s vodičima na najvišoj razini prikazan je u nastavku. Besplatna razina pristupa JuliaBox omogućuje vam 90-minutne sesije s tri CPU jezgre; osobna pretplata od 14 dolara mjesečno daje vam četverosatne sesije s pet jezgri; a profesionalna pretplata od 70 dolara mjesečno daje vam osmosatne sesije s 32 jezgre. GPU pristup još nije dostupan od lipnja 2018.

Paketi Julije

Julia "hoda poput Pythona, ali trči kao C." Kao što je moj kolega Serdar Yegulalp napisao u prosincu 2017., Julia počinje izazivati ​​Python za programiranje znanosti o znanosti i oba jezika imaju prednosti. Kao pokazatelj brzo sazrijevajuće podrške znanosti o podacima u Juliji, uzmite u obzir da postoje već dvije knjige s naslovom Julia for Data Science , jednu Zacharias Voulgaris, a drugu Anshul Joshi, iako ne mogu govoriti o kvaliteti niti jedne jedan.

Ako pogledate sveukupno najbolje ocijenjene pakete Julia tvrtke Julia Observer, prikazane dolje, vidjet ćete jezgru Julia za Jupyterove bilježnice, grafički paket Gadfly (slično kao ggplot2u R), generičko sučelje za crtanje, nekoliko dubinskih učenja i stroj paketi za učenje, rješavači diferencijalnih jednadžbi, DataFrames, New York Fed dinamički stohastički modeli opće ravnoteže (DSGE), jezik za modeliranje optimizacije i sučelja za Python i C ++. Ako odete malo dalje ovim općim popisom, pronaći ćete i QuantEcon, PyPlot, ScikitLearn, paket bioinformatike i implementaciju lijenih popisa za funkcionalno programiranje.

Ako paketi Julia nisu dovoljni za vaše potrebe, a sučelje Python vas ne odvede tamo gdje želite ići, možete instalirati i paket koji vam daje generička sučelja za R (RCall) i Matlab.

Julia za financijske analitičare i kvante

Quants i financijski analitičari pronaći će mnogo besplatnih paketa kako bi ubrzali svoj rad, kao što je prikazano na snimci zaslona u nastavku. Osim toga, Julia Computing nudi JuliaFin paket, koji se sastoji od Mileta (DSL za financijske ugovore),  JuliaDB (high performance in-memory i distribuira baze podataka),  JuliaInXL (poziv Julia iz Excel listova), a  Bloomberg povezivanja (pristup u stvarnom -vremeni i povijesni podaci o tržištu).