Ohjelmointi

Mikä on Julia? Uusi lähestymistapa numeeriseen laskentaan

Julia on ilmainen avoimen lähdekoodin, korkean tason, suorituskykyinen, dynaaminen ohjelmointikieli numeeriseen laskentaan. Siinä on dynaamisen kielen kehitysominaisuus, joka on käännetyn staattisesti kirjoitetun kielen suorituskyky, kiitos osittain JL-kääntäjälle, joka perustuu LLVM: ään, joka luo alkuperäisen konekoodin, ja osittain suunnittelulle, joka toteuttaa tyypin vakauden erikoistumisen kautta useiden lähetys, mikä helpottaa kääntämistä tehokkaaksi koodiksi.

Kielen kirjoittajat - Jeff Bezanson, Stefan Karpinski, Viral Shah ja Alan Edelman - ilmoittivat blogikirjoituksessa, jossa ilmoitettiin Julian alkuperäisestä julkaisusta vuonna 2012, että he käyttivät kolme vuotta Julian luomiseen, koska he olivat ahne. He olivat kyllästyneet Matlabin, Lispin, Pythonin, Rubyn, Perlin, Mathematican, R: n ja C: n välisiin kompromisseihin ja halusivat yhden kielen, joka olisi hyvä tieteelliseen laskentaan, koneoppimiseen, tiedonlouhintaan, laajamittaiseen lineaariseen algebraan , rinnakkaislaskenta ja hajautettu laskenta.

Kenelle Julia on tarkoitettu? Sen lisäksi, että Julia houkuttelee tutkijoita ja insinöörejä, se houkuttelee myös datatieteilijöitä, rahoitusanalyytikkoja ja kyselyjä.

Kielen suunnittelijat ja kaksi muuta perustivat Julia Computingin heinäkuussa 2015 "kehittämään tuotteita, jotka tekevät Juliasta helppokäyttöisen, helppokäyttöisen ja skaalattavan". Tämän kirjoituksen jälkeen yrityksessä on 28 työntekijää ja asiakkaita vaihtelevat kansallisista laboratorioista pankkeihin ekonomisteihin itsenäisiin ajoneuvotutkijoihin. Julia Computing tarjoaa avoimen lähdekoodin tietovarastojen ylläpitämisen lisäksi GitHubissa kaupallisia tuotteita, mukaan lukien JuliaPro, joka on saatavana sekä ilmaisena että maksettuna versiona.

Miksi Julia?

Julia "pyrkii luomaan ennennäkemättömän yhdistelmän helppokäyttöisyyttä, tehoa ja tehokkuutta yhdellä kielellä." Tehokkuuskysymykseen on otettava huomioon seuraava kaavio:

Julia Computing

Julian vertailuarvot

Täällä näemme, että Julia-koodi voi olla nopeampi kuin C muutamille operaatioille ja korkeintaan muutaman kerran hitaampi kuin C muille. Vertaa sitä esimerkiksi R: ään, joka voi olla lähes 1000 kertaa hitaampi kuin C joissakin operaatioissa.

Huomaa, että yksi hitaimmista testeistä Julialle on Fibonacci-rekursio; tämä johtuu siitä, että Julialla ei tällä hetkellä ole pyrstörekursiota optimointia. Rekursio on luonnostaan ​​hitaampaa kuin silmukointi. Todellisissa Julia-ohjelmissa, jotka haluat suorittaa tuotannossa, sinun on toteutettava tällaisten algoritmien silmukka (iterointi) -muoto.

Julia JIT -kokoelma

JIT-kääntäjä (just-in-time) -kääntäjä maksaa kustannuksia toisin kuin puhdas tulkki: Kääntäjän on jäsennettävä lähdekoodi ja luotava konekoodi ennen kuin koodi voi toimia. Tämä voi tarkoittaa huomattavaa käynnistymisaikaa Julia-ohjelmille, kun kukin toiminto ja makro suoritetaan ensimmäisen kerran istunnossa. Joten alla olevasta kuvakaappauksesta näemme, että toisen kerran, kun luomme miljoonan satunnaisen liukuluvun, käytettävä aika on suuruusluokkaa vähemmän kuin ensimmäisellä suorituksella. Molemmat @aika makro ja rand () -toiminto oli koottava ensimmäisen kerran koodin kautta, koska Julia-kirjastot on kirjoitettu Juliaan.

julia> @ rand rand (10 ^ 6);

0,62081 sekuntia (14,44 kt: n varaus: 8,415 MiB)

julia> @ time rand (10 ^ 6);

0,004881 sekuntia (7 allokointia: 7,630 MiB)

Julia-fanit väittävät, että sillä on helppokäyttöinen Python, R tai jopa Matlab. Nämä vertailut valvovat, koska Julian kieli on tyylikäs, tehokas ja suuntautunut tieteelliseen laskentaan, ja kirjastot tarjoavat laajan valikoiman edistyneitä ohjelmointitoimintoja.

Julian esimerkki

Nopeana esimerkkinä Julian kielestä ota huomioon seuraava Mandelbrotin asettama vertailukoodi:

Kuten näette, kielelle on rakennettu kompleksilukuaritmeettinen, samoin kuin testien ja ajoituksen makrot. Kuten voit myös nähdä, C-tyyppisiä kieliä vaivaavat loppupisteet ja Lisp-tyyppisiä kieliä sisäkkäiset sulut puuttuvat Juliasta. Ota huomioon, että mandelperf () kutsutaan kahdesti, riveillä 61 ja 62. Ensimmäinen kutsu testaa tuloksen oikeellisuuden ja tekee JIT-kokoelman; toinen puhelu saa ajoituksen.

Julia ohjelmoi

Julialla on monia muita mainitsemisen arvoisia ominaisuuksia. Ensinnäkin käyttäjän määrittelemät tyypit ovat yhtä nopeita ja pienikokoisia kuin sisäänrakennetut. Itse asiassa voit julistaa abstrakteja tyyppejä, jotka käyttäytyvät kuin yleiset tyypit, paitsi että ne on koottu niille argumenttityypeille, jotka ne välittävät.

Toiselle Julian sisäänrakennettu koodivektorointi tarkoittaa, että ohjelmoijan ei tarvitse vektoria koodaamaan suorituskykyä varten. tavallinen hajautettu koodi on nopea. Kääntäjä voi hyödyntää SIMD-käskyjä ja rekistereitä, jos niitä on taustalla olevassa prosessorissa, ja purkaa silmukat peräkkäisessä prosessissa vektorisoimaan ne niin paljon kuin laitteisto sallii. Voit merkitä silmukat vektoroitaviksi @simd merkintä.

Julian rinnakkaisuus

Julia suunniteltiin myös rinnakkaisuuteen ja hajautettuun laskentaan kahdella primitiivillä: etäviitteet ja etäkutsut. Etäviitteitä on kahta makua:Tulevaisuus jaRemoteChannel. A Tulevaisuus on sama kuin JavaScript lupaus; a RemoteChannel on uudelleenkirjoitettava ja sitä voidaan käyttää prosessien väliseen viestintään, kuten Unix putki tai Go kanava. Olettaen, että olet aloittanut Julian useilla prosesseilla (esim. julia -p 8 kahdeksanytiminen CPU, kuten Intel Core i7), voit @saada aikaan tai etäpuhelu () toiminto kutsuu suorittamaan toisen Julia-prosessin asynkronisesti ja myöhemmin noutaa () Tulevaisuus palautetaan, kun haluat synkronoida ja käyttää tulosta.

Jos sinun ei tarvitse käyttää useita ytimiä, voit käyttää kevyttä "vihreää" langoitusta, jota kutsutaan a Tehtävä() Juliassa ja korutiini joillakin muilla kielillä. A Tehtävä() tai @tehtävä toimii yhdessä a Kanava, joka on yhden prosessin versio RemoteChannel.

Julia-tyyppinen järjestelmä

Julialla on huomaamaton mutta tehokas tyyppijärjestelmä, joka on oletusarvoisesti dynaaminen ajonaikaisen tyypin päättelyn kanssa, mutta sallii valinnaiset tyyppihuomautukset. Tämä on samanlainen kuin TypeScript. Esimerkiksi:

julia> (1 + 2) :: Tiivistelmä kelluva

VIRHE: TypeError: typeassert: odotettu AbstractFloat, sai Int64

julia> (1 + 2) :: Int

3

Tässä väitämme yhteensopimattoman tyypin ensimmäistä kertaa aiheuttaen virheen ja yhteensopivan tyypin toisen kerran.

Julia kielet

Julialla on tehokas tuki Unicode-merkkijonoille ja -merkeille, jotka on tallennettu UTF-8-muotoon, sekä tehokas tuki ASCII-merkkeille, koska UTF-8: ssa alle 0x80 (128) koodipisteet koodataan yhdeksi merkiksi. Muuten UTF-8 on vaihtelevan pituinen koodaus, joten et voi olettaa, että Julia-merkkijonon pituus on yhtä suuri kuin viimeinen merkkihakemisto.

UTF-8: n täysi tuki tarkoittaa muun muassa, että muuttujat voidaan määritellä helposti kreikkalaisilla kirjaimilla, mikä voi saada tieteellisen Julia-koodin näyttämään suurelta osin kaavojen selityksiltä, ​​esim. synti (2π). A transkoodi () Toiminto tarjotaan UTF-8: n muuntamiseksi muista Unicode-koodauksista ja muista koodauksista.

C- ja Fortran-toiminnot

Julia voi soittaa suoraan C- ja Fortran-funktioihin ilman kääreitä tai erityisiä sovellusliittymiä, vaikka sinun olisi tiedettävä Fortran-kääntäjän lähettämä "koristeltu" funktion nimi. Ulkoisen C- tai Fortran-toiminnon on oltava jaetussa kirjastossa; käytät Juliaa ccall () toiminto varsinaiselle puhelulle. Esimerkiksi Unixin kaltaisessa järjestelmässä voit käyttää tätä Julia-koodia saadaksesi ympäristömuuttujan arvon käyttämällä getenv toiminto libc: ssä:

funktio getenv (var :: AbstractString)

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

Cstring, (Cstring,), var)

jos val == C_NULL

virhe ("getenv: määrittelemätön muuttuja:", var)

loppuun

unsafe_string (val)

loppuun

julia> getenv ("KUORI")

"/ bin / bash"

Julia-makrot

Julialla on Lisp-tyyppisiä makroja, erotettuna C: n ja C ++: n käyttämistä makroesiprosessoreista. Julialla on myös muita meta-ohjelmointilaitteita, kuten heijastus, koodin luonti, symboli (esim. : foo) ja ilmaisu (esim. : (a + b * c + 1) ) esineitä, eval ()ja luodut toiminnot. Julia-makrot arvioidaan jäsentämishetkellä.

Luodut toiminnot sitä vastoin laajennetaan, kun niiden parametrien tyypit tiedetään, ennen funktioiden kokoamista. Luotuilla funktioilla on yleisten toimintojen joustavuus (sellaisina kuin ne on toteutettu C ++: ssa ja Java: ssa) ja voimakkaasti kirjoitettujen toimintojen tehokkuus poistamalla ajoaikaisen lähettämisen tarpeen parametrisen polymorfismin tukemiseksi.

GPU-tuki

Julialla on GPU-tuki muun muassa MXNet-syväoppimispaketilla, ArrayFire GPU -taulukko, lineaarinen cuBLAS- ja cuDNN-algebra- ja hermoverkkokirjastot sekä CUDA-kehys yleiskäyttöiseen GPU-laskentaan. Julian kääreet ja vastaavat kirjastot on esitetty alla olevassa kaaviossa.

Julia Computing

JuliaPro ja Juno IDE

Voit ladata ilmaisen avoimen lähdekoodin Julia-komentorivin Windowsille, MacOS: lle, geneeriselle Linuxille tai yleiselle FreeBSD: lle Julian kielisivustolta. Voit kloonata Julian lähdekoodivaraston GitHubista.

Vaihtoehtoisesti voit ladata JuliaPron Julia Computing -palvelusta. Kääntäjän lisäksi JuliaPro antaa sinulle Atom-pohjaisen Juno IDE: n (alla) ja yli 160 kuratoitua pakettia, mukaan lukien visualisointi ja piirtäminen.

Ilmaisen JuliaPro-palvelun lisäksi voit lisätä tilauksia yritystukeen, kvantitatiiviseen rahoitustoimintoon, tietokantatukeen ja aikasarjaanalyysiin. JuliaRun on skaalautuva palvelin klusterille tai pilvelle.

Jupyter-muistikirjat ja IJulia

Junon käyttämisen lisäksi Julia IDE: nä voit käyttää Visual Studio -koodia Julia-laajennuksella (näkyy suoraan alla) ja Jupyter-muistikirjoja IJulia-ytimellä (näkyvät alla olevassa toisessa ja kolmannessa kuvakaappauksessa). Saatat joutua asentamaan Jupyter-muistikirjat Python 2: lle tai (mieluiten) Python 3: lle Anacondalla tai pipillä.

JuliaBox

Voit käyttää Juliaa Jupyter-muistikirjoissa verkossa käyttämällä JuliaBoxia (näkyy alla), toista Julia Computing -tuotetta, tekemättä mitään asennusta paikalliselle koneellesi. JuliaBox sisältää tällä hetkellä yli 300 pakettia, suorittaa Julia 0.6.2: n ja sisältää kymmeniä opetusohjelmia sisältäviä Jupyter-muistikirjoja. Opetusohjelman kansioiden ylätason luettelo näkyy alla. JuliaBox-käyttöoikeuden ilmainen taso antaa sinulle 90 minuutin istunnot kolmella CPU-ytimellä; 14 dollarin kuukausittainen henkilökohtainen tilaus antaa sinulle neljän tunnin jaksot viidellä ytimellä; ja 70 dollaria kuukaudessa pro-tilaus antaa sinulle kahdeksan tunnin istunnot 32 ytimellä. GPU-käyttö ei ole vielä käytettävissä kesäkuusta 2018 lähtien.

Julia pakkaa

Julia ”kävelee kuin Python, mutta juoksee kuin C.” Kuten kollegani Serdar Yegulalp kirjoitti joulukuussa 2017, Julia on alkanut haastaa Pythonin tietojenkäsittelyohjelmiin, ja molemmilla kielillä on etuja. Harkitse, että Juliassa on nopeasti kypsyvää datatieteen tukea, että on jo kaksi kirjaa, joiden otsikko on Julia datatieteestä, toisen Zacharias Voulgaris ja toisen Anshul Joshi, vaikka en voi puhua kummankaan laadusta.

Jos tarkastelet Julia Observerin korkeimmin arvioituja Julia-paketteja, jotka näkyvät alla, näet Jupyter-kannettavien Julia-ytimen, Gadfly-grafiikkapaketin (samanlainen kuin ggplot2 R: ssä), yleinen piirtorajapinta, useita syvällisiä oppimis- ja koneoppimispaketteja, differentiaaliyhtälönratkaisijat, DataFrame-kehykset, New York Fedin dynaamiset stokastiset yleisen tasapainon (DSGE) mallit, optimointimallinnuskieli ja rajapinnat Pythoniin ja C ++: iin. Jos menet hieman kauemmaksi tästä yleisestä luettelosta, löydät myös QuantEconin, PyPlotin, ScikitLearnin, bioinformatiikkapaketin ja laiskojen luetteloiden toteuttamisen toiminnalliseen ohjelmointiin.

Jos Julia-paketit eivät riitä tarpeisiisi ja Python-käyttöliittymä ei vie sinua haluamaasi paikkaan, voit myös asentaa paketin, joka antaa sinulle yleiset käyttöliittymät R (RCall) ja Matlab.

Julia rahoitusanalyytikoille ja kyselyille

Kyselyt ja talousanalyytikot löytävät monia ilmaisia ​​paketteja työnsä nopeuttamiseksi, kuten alla olevassa kuvakaappauksessa näkyy. Lisäksi Julia Computing tarjoaa JuliaFin-paketin, joka koostuu Miletus (DSL rahoitussopimuksiin),JuliaDB (korkean suorituskyvyn muisti ja hajautettu tietokanta),JuliaInXL (soita Julialle Excel-arkeista) jaBloomberg liitettävyys (pääsy reaaliaikaiseen ja historialliseen markkinatietoon).