Programiranje

Kaj je Julia? Nov pristop k numeričnemu računalništvu

Julia je brezplačen odprtokodni, visokozmogljiv, zmogljiv, dinamičen programski jezik za numerično računalništvo. Ima priročnost za razvoj dinamičnega jezika z zmogljivostjo sestavljenega statično natipkanega jezika, deloma zahvaljujoč JIT-prevajalniku, ki temelji na LLVM, ki ustvarja izvorno strojno kodo, in deloma zasnovi, ki izvaja stabilnost tipa s specializacijo prek več dispatch, kar olajša prevajanje v učinkovito kodo.

V objavi v blogu, ki napoveduje prvo izdajo Julije leta 2012, so avtorji jezika - Jeff Bezanson, Stefan Karpinski, Viral Shah in Alan Edelman - navedli, da so tri leta ustvarjali Julijo, ker so bili požrešen. Utrujeni so bili od kompromisov med Matlabom, Lispom, Pythonom, Rubyjem, Perlom, Mathematico, R in C in želeli so en sam jezik, ki bi bil primeren za znanstveno računalništvo, strojno učenje, podatkovno rudarjenje, obsežno linearno algebro , vzporedno računalništvo in porazdeljeno računalništvo.

Komu je namenjena Julia? Poleg tega, da je privlačna za raziskovalce in inženirje, je Julia privlačna tudi za podatkovne znanstvenike ter finančne analitike in kvante.

Oblikovalci jezika in še dva druga so julija 2015 ustanovili podjetje Julia Computing, da bi "razvili izdelke, ki olajšajo uporabo Julie, njeno enostavno namestitev in prilagodljivost." Od tega pisanja ima podjetje 28 zaposlenih in strank, od državnih laboratorijev do bank, ekonomistov in avtonomnih raziskovalcev vozil. Poleg vzdrževanja odprtokodnih skladišč Julia na GitHub, Julia Computing ponuja komercialne izdelke, vključno z JuliaPro, ki je na voljo v brezplačni in plačljivi različici.

Zakaj Julia?

Julia "želi ustvariti kombinacijo brez primere enostavnosti uporabe, moči in učinkovitosti v enem jeziku." Za vprašanje učinkovitosti upoštevajte spodnji graf:

Julia Computing

Merila Julia

Tukaj vidimo, da je koda Julia pri nekaterih vrstah operacij lahko hitrejša od C in pri drugih največ nekajkrat počasnejša od C. Primerjajte to z recimo R, ki je lahko pri nekaterih operacijah skoraj 1000-krat počasnejši od C.

Upoštevajte, da je eden najpočasnejših testov za Julijo Fibonaccijeva rekurzija; to je zato, ker Julia trenutno nima optimizacije rekurzije repa. Rekurzija je sama po sebi počasnejša od zanke. Za prave programe Julia, ki jih želite zagnati v proizvodnji, boste želeli uvesti obliko zanke (iteracije) takšnih algoritmov.

Kompilacija Julia JIT

Pristop prevajalnika JIT (ravno ob pravem času) je strošek v primerjavi s čistim tolmačem: prevajalnik mora razčleniti izvorno kodo in ustvariti strojno kodo, preden se lahko vaša koda zažene. To lahko pomeni opazen čas zagona programov Julia, ko se vsaka funkcija in makro zaženeta v seji. Na spodnjem posnetku zaslona torej vidimo, da je čas, ko drugič generiramo milijon naključnih števil s plavajočo vejico, za velikost manjši kot pri prvi izvedbi. Oba @time makro in rand () funkcijo je bilo treba najprej prevesti s kodo, ker so knjižnice Julia napisane v Juliji.

julia> @time rand (10 ^ 6);

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

julia> @time rand (10 ^ 6);

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

Oboževalci Julije različno trdijo, da je enostaven za uporabo Pythona, R ali celo Matlaba. Te primerjave so pod drobnogledom, saj je jezik Julia eleganten, zmogljiv in usmerjen v znanstveno računalništvo, knjižnice pa ponujajo široko paleto naprednih programskih funkcij.

Primer Julije

Kot hiter primer jezika Julia si oglejte naslednjo kodo referenčne vrednosti Mandelbrot:

Kot lahko vidite, je v jezik vgrajena aritmetika zapletenih števil, prav tako pa tudi makri za teste in čas. Kot lahko tudi vidite, pri Juliji odsotni podpičji, ki pestijo jezike, podobne C, in ugnezdeni oklepaji, ki jezijo jezike, podobne Lispu. Upoštevajte to mandelperf () se pokliče dvakrat, v vrsticah 61 in 62. Prvi klic preizkusi rezultat za pravilnost in izvede JIT-kompilacijo; drugi klic dobi čas.

Julia programiranje

Julia ima še veliko drugih lastnosti, ki jih je vredno omeniti. Za enega so uporabniško določeni tipi tako hitri in kompaktni kot vgrajeni. Dejansko lahko deklarirate abstraktne tipe, ki se obnašajo kot splošni tipi, le da so prevedeni za vrste argumentov, ki jih posredujejo.

Drugič, vgrajena Julijina vektorizacija kode pomeni, da programerju ni treba vektorizirati kode za delovanje; navadna devektorizirana koda je hitra. Prevajalnik lahko izkoristi navodila in registre SIMD, če so prisotni na osnovnem CPU, in zanke odvrti v zaporednem postopku, da jih vektorizira, kolikor strojna oprema omogoča. Zanke lahko označite kot vektorizirane s @simd pripis.

Julijski paralelizem

Julia je bila zasnovana tudi za vzporednost in porazdeljeno računanje z dvema primitivoma: oddaljenimi referencami in oddaljenimi klici. Oddaljene reference so na voljo v dveh okusih:Prihodnost inRemoteChannel. A Prihodnost je enakovreden JavaScriptu obljubi; a RemoteChannel je zapisljiv in se lahko uporablja za medprocesno komunikacijo, kot je Unix cev ali Go kanal. Ob predpostavki, da ste Julijo zagnali z več postopki (npr. julia -p 8 za osemjedrni CPU, kot je Intel Core i7), lahko @spawn ali oddaljeni klic () klici funkcije, da se asinhrono in kasneje izvede v drugem procesu Julia prinesi () Prihodnost vrne, ko želite sinhronizirati in uporabiti rezultat.

Če vam ni treba zagnati več jeder, lahko uporabite lahke "zelene" navoje, imenovane a Naloga () v Juliji in podprogram v nekaterih drugih jezikih. A Naloga () ali @task deluje v povezavi z a Kanal, ki je enoprocesna različica RemoteChannel.

Sistem tipa Julia

Julia ima nevsiljiv, a zmogljiv sistem tipov, ki je privzeto dinamičen s sklepanjem o tipu časa izvajanja, vendar omogoča neobvezne opombe tipa. To je podobno kot TypeScript. Na primer:

julia> (1 + 2) :: AbstractFloat

NAPAKA: TypeError: typeassert: pričakovano AbstractFloat, dobil Int64

julija> (1 + 2) :: Int

3

Tu prvič trdimo o nezdružljivem tipu, ki povzroči napako, in o združljivem tipu drugič.

Strune Julije

Julia ima učinkovito podporo za nize in znake Unicode, shranjene v formatu UTF-8, pa tudi učinkovito podporo za znake ASCII, saj so v UTF-8 kodne točke manj kot 0x80 (128) kodirane v en sam znak. Sicer je UTF-8 kodiranje s spremenljivo dolžino, zato ne morete domnevati, da je dolžina niza Julia enaka zadnjemu indeksu znakov.

Popolna podpora za UTF-8 med drugim pomeni, da lahko z grškimi črkami enostavno določite spremenljivke, zaradi česar je znanstvena koda Julia zelo podobna učbeniškim razlagam formul, npr. greh (2π). A pretvori () Na voljo je funkcija za pretvorbo UTF-8 v in iz drugih kodiranj Unicode.

C in Fortran funkcije

Julia lahko neposredno pokliče funkcije C in Fortran, pri čemer niso potrebni ovojniki ali posebni API-ji, čeprav morate vedeti "okrašeno" ime funkcije, ki ga oddaja prevajalnik Fortran. Zunanja funkcija C ali Fortran mora biti v skupni knjižnici; uporabljate Julijo klic () funkcija za dejanski klic. Na primer v sistemu, podobnem Unixu, lahko s to kodo Julia dobite vrednost spremenljivke okolja s pomočjo getenv funkcija v libc:

funkcija getenv (var :: AbstractString)

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

Cstring, (Cstring,), var)

če je val == C_NULL

napaka ("getenv: nedefinirana spremenljivka:", var)

konec

unsafe_string (val)

konec

julia> getenv ("SHELL")

"/ bin / bash"

Makra Julije

Julia ima Lisp podobne makre, kar se razlikuje od makroprocesorjev, ki jih uporabljata C in C ++. Julia ima tudi druge pripomočke za metaprogramiranje, kot so odsev, generiranje kode, simbol (npr. : foo) in izraz (npr. : (a + b * c + 1) ) predmeti, eval ()in ustvarjene funkcije. Makre Julia se ocenjujejo v času razčlenjevanja.

Po drugi strani pa se generirane funkcije pred kompilacijo funkcij razširijo, ko so znani tipi njihovih parametrov. Ustvarjene funkcije imajo prilagodljivost generičnih funkcij (kot je implementirano v C ++ in Java) in učinkovitost močno tipkanih funkcij, tako da odpravlja potrebo po pošiljanju v času izvajanja, ki podpira parametrični polimorfizem.

Podpora za GPU

Julia ima podporo za GPU, ki med drugim uporablja paket globokega učenja MXNet, knjižnico arrayFire GPU array, linearno algebro cuBLAS in cuDNN in globoke nevronske mreže ter ogrodje CUDA za splošne GPU računalnike. Ovitki Julia in njihove knjižnice so prikazani na spodnjem diagramu.

Julia Computing

JuliaPro in Juno IDE

Brezplačno odprtokodno ukazno vrstico Julia za Windows, MacOS, generični Linux ali generični FreeBSD lahko prenesete s spletnega mesta v jeziku Julia. Skladišče izvorne kode Julia lahko klonirate iz GitHub-a.

Lahko pa prenesete tudi JuliaPro iz Julia Computing. Poleg prevajalnika vam JuliaPro ponuja Juno IDE na osnovi Atoma (prikazano spodaj) in več kot 160 kuriranih paketov, vključno z vizualizacijo in risanjem.

Poleg tega, kar je v brezplačni JuliaPro, lahko dodate naročnine na podporo podjetjem, kvantitativne finančne funkcije, podporo baz podatkov in analizo časovnih vrst. JuliaRun je razširljiv strežnik za gručo ali oblak.

Zvezki Jupyter in IJulia

Poleg tega, da Juno uporabljate kot svoj Julia IDE, lahko uporabite Visual Studio Code z razširitvijo Julia (prikazano neposredno spodaj) in zvezke Jupyter z jedrom IJulia (prikazano na drugem in tretjem posnetku zaslona spodaj). Morda boste morali namestiti prenosnike Jupyter za Python 2 ali (po možnosti) Python 3 z Anacondo ali pip.

JuliaBox

S pomočjo JuliaBox (prikazano spodaj), drugega izdelka Julia Computing, lahko Julia v prenosnih računalnikih Jupyter zaženete prek spleta, ne da bi pri tem nameščali na vaš lokalni računalnik. JuliaBox trenutno vključuje več kot 300 paketov, poganja Julia 0.6.2 in vsebuje na desetine učnih zvezkov Jupyter. Spodnji seznam zgornjih map vadnic je prikazan. Brezplačna raven dostopa JuliaBox vam omogoča 90-minutne seje s tremi CPU jedri; z osebno naročnino 14 USD na mesec dobite štiri ure s petimi jedri; in naročnina pro na 70 USD na mesec vam nudi osemurne seje z 32 jedri. Dostop do GPU od junija 2018 še ni na voljo.

Paketi Julia

Julia "hodi kot Python, a teče kot C." Kot je decembra 2017 zapisal moj kolega Serdar Yegulalp, Julia začne Python izzivati ​​za programiranje podatkovnih znanosti in oba jezika imata prednosti. Kot pokazatelj hitro dozorele podpore znanosti o podatkih v Juliji upoštevajte, da že obstajata dve knjigi z naslovom Julia za Data Science, enega Zachariasa Voulgarisa, drugega pa Anshul Joshi, čeprav ne morem govoriti o kakovosti nobenega.

Če si ogledate splošno najvišje ocenjene pakete Julia podjetja Julia Observer, prikazane spodaj, boste videli jedro Julia za zvezke Jupyter, grafični paket Gadfly (podobno kot ggplot2 v R), generični vmesnik za načrtovanje, več paketov za globoko učenje in strojno učenje, reševalci diferencialnih enačb, DataFrames, modeli dinamičnega stohastičnega splošnega ravnovesja (DSGE) New York Fed, jezik za optimizacijsko modeliranje ter vmesniki za Python in C ++. Če greste nekoliko dlje po tem splošnem seznamu, boste našli tudi QuantEcon, PyPlot, ScikitLearn, paket za bioinformatiko in izvedbo lenih seznamov za funkcionalno programiranje.

Če paketi Julia ne zadostujejo za vaše potrebe in vas vmesnik Python ne pripelje tja, kamor želite iti, lahko namestite tudi paket, ki vam daje splošne vmesnike za R (RCall) in Matlab.

Julia za finančne analitike in kvante

Quants in finančni analitiki bodo našli veliko brezplačnih paketov za pospešitev dela, kot je prikazano na spodnjem posnetku zaslona. Poleg tega Julia Computing ponuja tudi paket JuliaFin, sestavljen iz Mileta (DSL za finančne pogodbe),JuliaDB (visoko zmogljiva pomnilniška in porazdeljena baza podatkov),JuliaInXL (pokličite Julijo z Excelovih listov) inBloomberg povezljivost (dostop do sprotnih in zgodovinskih tržnih podatkov).

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