Programmering

Hva er Julia? En fersk tilnærming til numerisk databehandling

Julia er et gratis åpen kildekode, høyt nivå, høytytende, dynamisk programmeringsspråk for numerisk databehandling. Det har utviklingskomforten til et dynamisk språk med ytelsen til et kompilert statisk skrevet språk, delvis takket være en JIT-kompilator basert på LLVM som genererer innfødt maskinkode, og delvis til et design som implementerer typestabilitet gjennom spesialisering via flere forsendelse, noe som gjør det enkelt å kompilere til effektiv kode.

I blogginnlegget som kunngjorde den første utgivelsen av Julia i 2012, uttalte forfatterne av språket - Jeff Bezanson, Stefan Karpinski, Viral Shah og Alan Edelman - at de brukte tre år på å skape Julia fordi de var grådig. De var lei av kompromissene mellom Matlab, Lisp, Python, Ruby, Perl, Mathematica, R og C, og ønsket et enkelt språk som ville være bra for vitenskapelig databehandling, maskinlæring, datautvinning, storskala lineær algebra , parallell databehandling og distribuert databehandling.

Hvem er Julia for? I tillegg til å være attraktiv for forskere og ingeniører, er Julia også attraktiv for dataforskere og for finansanalytikere og kvantister.

Språkdesignerne og to andre grunnla Julia Computing i juli 2015 for å "utvikle produkter som gjør Julia enkle å bruke, enkle å distribuere og enkle å skalere." I skrivende stund har selskapet 28 ansatte og kunder, alt fra nasjonale laboratorier til banker til økonomer til autonome bilforskere. I tillegg til å opprettholde Julia open source-arkiver på GitHub, tilbyr Julia Computing kommersielle produkter, inkludert JuliaPro, som kommer i både gratis og betalte versjoner.

Hvorfor Julia?

Julia "har som mål å skape en enestående kombinasjon av brukervennlighet, kraft og effektivitet på ett enkelt språk." Når det gjelder problemet med effektivitet, bør du vurdere grafen nedenfor:

Julia Computing

Julia referanser

Det vi ser her er at Julia-koden kan være raskere enn C for noen få typer operasjoner, og ikke mer enn noen få ganger tregere enn C for andre. Sammenlign det med for eksempel R, som kan være nesten 1000 ganger tregere enn C for noen operasjoner.

Merk at en av de tregeste testene for Julia er Fibonacci-rekursjon; det er fordi Julia for øyeblikket mangler optimering av halen rekursjon. Rekursjon er iboende tregere enn looping. For ekte Julia-programmer du vil kjøre i produksjon, vil du implementere loop (iterasjon) form av slike algoritmer.

Julia JIT kompilering

Det er en kostnad for JIT (just-in-time) kompilatortilnærming i motsetning til en ren tolk: Kompilatoren må analysere kildekoden og generere maskinkode før koden din kan kjøres. Det kan bety en merkbar oppstartstid for Julia-programmer første gang hver funksjon og makro kjøres i en økt. Så på skjermbildet nedenfor ser vi at den andre gangen vi genererer en million tilfeldige flytende tall, er tiden det tar en størrelsesorden mindre enn ved første utførelse. Begge @tid makro og rand () funksjonen måtte kompileres første gang gjennom koden, fordi Julia-bibliotekene er skrevet i Julia.

julia> @time rand (10 ^ 6);

0,62081 sekunder (14,44 k tildelinger: 8,415 MiB)

julia> @time rand (10 ^ 6);

0.004881 sekunder (7 tildelinger: 7.630 MiB)

Julia-fans hevder forskjellig at det er enkelt å bruke Python, R eller til og med Matlab. Disse sammenligningene blir gransket, da Juliaspråket er elegant, kraftig og orientert mot vitenskapelig databehandling, og bibliotekene tilbyr et bredt spekter av avansert programmeringsfunksjonalitet.

Julia-eksempel

Som et raskt eksempel på Julia-språk, bør du vurdere følgende Mandelbrot-angitte referansekode:

Som du kan se, er komplekse tallregninger innebygd i språket, som makroer for tester og timing. Som du også kan se, er de etterfølgende semikolonene som plager C-lignende språk, og de nestede parentesene som plager Lisp-lignende språk, fraværende fra Julia. Noter det mandelperf () kalles to ganger, i linjene 61 og 62. Den første samtalen tester resultatet for korrekthet og gjør JIT-kompilering; den andre samtalen får timingen.

Julia programmering

Julia har mange andre funksjoner det er verdt å nevne. For en er brukerdefinerte typer like raske og kompakte som innebygde. Faktisk kan du erklære abstrakte typer som oppfører seg som generiske typer, bortsett fra at de er kompilert for argumenttypene de sendes.

For en annen betyr Julias innebygde kodevektorisering at det ikke er behov for en programmerer å vektorisere kode for ytelse; vanlig devectorized kode er rask. Kompilatoren kan dra nytte av SIMD-instruksjoner og registre hvis de er til stede på den underliggende CPU-en, og rulle løkkene i en sekvensiell prosess for å vektorisere dem så mye som maskinvaren tillater. Du kan merke løkkene som vektoriserbare med @simd kommentar.

Julia parallellitet

Julia ble også designet for parallellitet og distribuert beregning ved å bruke to primitiver: eksterne referanser og eksterne samtaler. Eksterne referanser kommer i to smaker:Framtid ogRemoteChannel. EN Framtid tilsvarer et JavaScript love; en RemoteChannel er omskrivbar og kan brukes til kommunikasjon mellom prosesser, som en Unix rør eller en Go kanal. Forutsatt at du har startet Julia med flere prosesser (f.eks. julia -p 8 for en åtte-kjerne CPU som en Intel Core i7), kan du @spawn eller fjernkall () funksjonskall for å utføre en annen Julia-prosess asynkront og senere hente () de Framtid returneres når du vil synkronisere og bruke resultatet.

Hvis du ikke trenger å kjøre på flere kjerner, kan du bruke lett "grønn" gjenger, kalt a Oppgave() i Julia og en coroutine på noen andre språk. EN Oppgave() eller @oppgave fungerer sammen med en Kanal, som er enprosessversjonen av RemoteChannel.

Julia-system

Julia har et diskret, men likevel kraftig typesystem som er dynamisk med inferens med kjøretid som standard, men tillater valgfri typekommentarer. Dette ligner på TypeScript. For eksempel:

julia> (1 + 2) :: AbstractFloat

FEIL: TypeFeil: typeassert: forventet AbstractFloat, fikk Int64

julia> (1 + 2) :: Int

3

Her hevder vi en inkompatibel type første gang, forårsaker en feil, og en kompatibel type andre gang.

Julia strenger

Julia har effektiv støtte for Unicode-strenger og tegn, lagret i UTF-8-format, samt effektiv støtte for ASCII-tegn, siden i UTF-8 er kodepunktene mindre enn 0x80 (128) kodet med et enkelt tegn. Ellers er UTF-8 en koding med variabel lengde, så du kan ikke anta at lengden på en Julia-streng er lik den siste tegnindeksen.

Full støtte for UTF-8 betyr blant annet at du enkelt kan definere variabler ved hjelp av greske bokstaver, noe som kan få vitenskapelig Julia-kode til å ligne veldig på lærebokforklaringene til formlene, f.eks. synd (2π). EN transkode () funksjonen er tilgjengelig for å konvertere UTF-8 til og fra andre Unicode-kodinger.

C og Fortran funksjoner

Julia kan ringe C- og Fortran-funksjonene direkte, uten innpakning eller spesielle API-er nødvendig, selv om du trenger å kjenne det “dekorerte” funksjonsnavnet som sendes ut av Fortran-kompilatoren. Den eksterne C- eller Fortran-funksjonen må være i et delt bibliotek; du bruker Julia ccall () funksjon for selve utropet. På et Unix-lignende system kan du for eksempel bruke denne Julia-koden for å få verdien av en miljøvariabel ved å bruke getenv funksjon i libc:

funksjon getenv (var :: AbstractString)

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

Streng, (Streng,), var)

hvis val == C_NULL

feil ("getenv: udefinert variabel:", var)

slutt

usikker_streng (val)

slutt

julia> getenv ("SHELL")

"/ bin / bash"

Julia makroer

Julia har Lisp-lignende makroer, til forskjell fra makroforprosessorene som brukes av C og C ++. Julia har også andre metaprogrammeringsanlegg, for eksempel refleksjon, kodegenerering, symbol (f.eks. : foo) og uttrykk (f.eks. : (a + b * c + 1) ) gjenstander, eval ()og genererte funksjoner. Julia-makroer blir evaluert ved analyse.

Genererte funksjoner utvides derimot når parametertypene er kjent før funksjonssammensetning. Genererte funksjoner har fleksibiliteten til generiske funksjoner (som implementert i C ++ og Java) og effektiviteten til sterkt typte funksjoner, ved å eliminere behovet for kjøretidssending for å støtte parametrisk polymorfisme.

GPU-støtte

Julia har GPU-støtte ved bruk av blant annet MXNet deep learning-pakken, ArrayFire GPU-arraybiblioteket, cuBLAS og cuDNN lineær algebra og dype nevrale nettverksbiblioteker, og CUDA-rammeverket for generell GPU-databehandling. Julia-innpakningene og deres respektive biblioteker er vist i diagrammet nedenfor.

Julia Computing

JuliaPro og Juno IDE

Du kan laste ned gratis åpen kildekode Julia-kommandolinje for Windows, MacOS, generisk Linux eller generisk FreeBSD fra Julia-språkstedet. Du kan klone Julia-kildekodedepotet fra GitHub.

Alternativt kan du laste ned JuliaPro fra Julia Computing. I tillegg til kompilatoren gir JuliaPro deg Atom-baserte Juno IDE (vist nedenfor) og mer enn 160 kuraterte pakker, inkludert visualisering og plotting.

Utover det som er i gratis JuliaPro, kan du legge til abonnementer for bedriftsstøtte, kvantitativ økonomifunksjonalitet, databasestøtte og tidsserieanalyse. JuliaRun er en skalerbar server for en klynge eller sky.

Jupyter-notatbøker og IJulia

I tillegg til å bruke Juno som Julia IDE, kan du bruke Visual Studio Code med Julia-utvidelsen (vist rett nedenfor), og Jupyter-notatbøker med IJulia-kjernen (vist i det andre og tredje skjermbildet nedenfor). Det kan hende du må installere Jupyter-notatblokker for Python 2 eller (helst) Python 3 med Anaconda eller pip.

JuliaBox

Du kan kjøre Julia i Jupyter-notatbøker online ved å bruke JuliaBox (vist nedenfor), et annet produkt fra Julia Computing, uten å gjøre noen installasjon på din lokale maskin. JuliaBox inneholder for øyeblikket mer enn 300 pakker, kjører Julia 0.6.2, og inneholder dusinvis av opplærbare Jupyter-notatbøker. Den øverste listen over opplæringsmapper vises nedenfor. Det gratis nivået av JuliaBox-tilgang gir deg 90-minutters økter med tre CPU-kjerner; det personlige abonnementet på $ 14 per måned gir deg fire timers økter med fem kjerner; og $ 70 per måned pro-abonnement gir deg åtte timers økter med 32 kjerner. GPU-tilgang er foreløpig ikke tilgjengelig fra juni 2018.

Julia-pakker

Julia "går som Python, men løper som C." Som min kollega Serdar Yegulalp skrev i desember 2017, begynner Julia å utfordre Python for datavitenskapsprogrammering, og begge språk har fordeler. Som en indikasjon på den raskt modne støtten til datavitenskap i Julia, bør du vurdere at det allerede er to bøker med tittelen Julia for datavitenskap, den ene av Zacharias Voulgaris, og den andre av Anshul Joshi, selv om jeg ikke kan snakke med kvaliteten til noen av dem.

Hvis du ser på de samlede høyest rangerte Julia-pakkene fra Julia Observer, vist nedenfor, ser du en Julia-kjerne for Jupyter-notatbøker, Gadfly-grafikkpakken (ligner på ggplot2 i R), et generisk plottgrensesnitt, flere dyplærings- og maskinlæringspakker, differensialligningsløsere, DataFrames, New York Fed dynamiske stokastiske generelle likevektsmodeller (DSGE) modeller, et optimaliseringsmodellspråk og grensesnitt til Python og C ++. Hvis du går litt lenger ned på denne generelle listen, finner du også QuantEcon, PyPlot, ScikitLearn, en bioinformatikkpakke og en implementering av latelister for funksjonell programmering.

Hvis Julia-pakkene ikke er tilstrekkelig for dine behov, og Python-grensesnittet ikke får deg dit du vil, kan du også installere en pakke som gir deg generiske grensesnitt til R (RCall) og Matlab.

Julia for finansanalytikere og kvanter

Quants og finansanalytikere vil finne mange gratispakker for å øke arbeidet sitt, som vist på skjermbildet nedenfor. I tillegg tilbyr Julia Computing JuliaFin-suiten, bestående av Miletus (en DSL for finansielle kontrakter),JuliaDB (en høy ytelse i minnet og distribuert database),JuliaInXL (ring Julia fra Excel-ark), ogBloomberg tilkobling (tilgang til sanntid og historiske markedsdata).

$config[zx-auto] not found$config[zx-overlay] not found