Programavimas

Kas yra Julija? Naujas požiūris į skaitmeninį skaičiavimą

„Julia“ yra nemokama atviro kodo, aukšto lygio, didelio našumo, dinaminė programavimo kalba, skirta skaitmeniniam skaičiavimui. Ji turi dinamiškos kalbos kūrimo patogumą, sudarydama kompiliuotą, statiškai įvestą kalbą, iš dalies dėka JIT kompiliatoriaus, pagrįsto LLVM, kuris generuoja gimtąjį mašinos kodą, ir iš dalies dizaino, kuris įgyvendina tipo stabilumą per specializaciją per kelis siuntimas, todėl jį lengva sukompiliuoti į efektyvų kodą.

Tinklaraščio įraše, kuriame paskelbtas pradinis Julijos išleidimas 2012 m., Kalbos autoriai - Jeffas Bezansonas, Stefanas Karpinskis, „Viral Shah“ ir Alanas Edelmanas - pareiškė, kad trejus metus praleido kurdami Juliją, nes buvo godus. Jie buvo pavargę nuo kompromisų tarp „Matlab“, „Lisp“, „Python“, „Ruby“, „Perl“, „Mathematica“, „R“ ir „C“, ir norėjo vienos kalbos, kuri būtų tinkama moksliniam skaičiavimui, mašininiam mokymuisi, duomenų gavybai, didelio masto tiesinei algebrai , lygiagretus ir paskirstytasis skaičiavimas.

Kam skirta Julija? Be to, kad Julija yra patraukli mokslininkams ir inžinieriams, ji taip pat yra patraukli duomenų mokslininkams, finansų analitikams ir kvantams.

Kalbos dizaineriai ir dar du žmonės 2015 m. Liepos mėn. Įkūrė „Julia Computing“, norėdami „sukurti produktus, kurie Juliją padėtų lengvai naudoti, lengvai pritaikyti ir lengvai keisti mastelį“. Šiuo metu įmonėje dirba 28 darbuotojai ir klientai - nuo nacionalinių laboratorijų iki bankų, ekonomistų ar savarankiškų transporto priemonių tyrėjų. Be to, kad „Julia Computing“ palaiko „GitHub“ atvirojo kodo saugyklas, „Julia Computing“ siūlo komercinius produktus, įskaitant „JuliaPro“, kurie tiek nemokami, tiek mokami.

Kodėl Julija?

Julija „siekia sukurti beprecedentį paprasto naudojimo, galingumo ir efektyvumo derinį viena kalba“. Efektyvumo klausimu apsvarstykite toliau pateiktą diagramą:

Julia Computing

Julijos etalonai

Tai, ką matome čia, yra tai, kad Julia kodas gali būti greitesnis už C kelių rūšių operacijoms ir ne daugiau kaip kelis kartus lėtesnis nei C kitiems. Palyginkite tai su, tarkime, R, kuris kai kurioms operacijoms gali būti beveik 1000 kartų lėtesnis nei C.

Atkreipkite dėmesį, kad vienas iš lėčiausių Julijos testų yra Fibonači rekursija; taip yra todėl, kad Julijai šiuo metu trūksta uodegos rekursijos optimizavimo. Rekursija savaime yra lėtesnė nei kilpinė. Tikrose „Julia“ programose, kurias norite paleisti gamyboje, norėsite įgyvendinti tokių algoritmų ciklo (iteracijos) formą.

Julia JIT rinkinys

JIT (just-in-time) kompiliatoriaus metodas kainuoja, o ne grynas vertėjas: Kad jūsų kodas galėtų paleisti, kompiliatorius turi išanalizuoti šaltinio kodą ir sugeneruoti mašininį kodą. Tai gali reikšti pastebimą „Julia“ programų paleidimo laiką pirmą kartą, kai kiekviena funkcija ir makrokomanda vykdoma sesijos metu. Taigi, žemiau esančiame ekrano paveikslėlyje matome, kad antrą kartą sugeneravus milijoną atsitiktinių slankiojo kablelio skaičių, užtrukęs laikas yra dydžio eilės mažesnis nei pirmą kartą vykdant. Tiek @laikas makrokomanda ir randas () Pirmą kartą reikėjo sukompiliuoti funkciją naudojant kodą, nes Julijos bibliotekos parašytos Julijoje.

julia> @time rand (10 ^ 6);

0.62081 sekundės (14.44 k paskirstymas: 8.415 MiB)

julia> @time rand (10 ^ 6);

0,004881 sekundės (7 paskirstymai: 7,630 MiB)

„Julia“ gerbėjai įvairiai tvirtina, kad juo lengva naudotis „Python“, „R“ ar net „Matlab“. Šie palyginimai yra kruopščiai tikrinami, nes Julijos kalba yra elegantiška, galinga ir orientuota į mokslinį skaičiavimą, o bibliotekos teikia platų pažangių programavimo funkcijų spektrą.

Julijos pavyzdys

Kaip greitą Julijos kalbos pavyzdį apsvarstykite šį „Mandelbrot“ nustatytą etalono kodą:

Kaip matote, sudėtinga skaičių aritmetika yra integruota į kalbą, kaip ir testų bei laiko makrokomandos. Kaip matote, Julijos nėra kabliataškių, kankinančių C kalbas, ir įdėtų skliaustų, kankinančių į Lisp kalbas. Prisimink tai mandelperf () yra iškviečiamas du kartus, 61 ir 62 eilutėse. Pirmasis kvietimas tikrina rezultato teisingumą ir atlieka JIT kompiliaciją; antrasis skambutis gauna laiką.

Julija programuoja

Julija turi daug kitų savybių, kurias verta paminėti. Pirma, vartotojo apibrėžti tipai yra tokie pat greiti ir kompaktiški, kaip integruoti. Tiesą sakant, galite paskelbti abstrakčius tipus, kurie elgiasi kaip bendrieji tipai, išskyrus tai, kad jie yra sudaryti argumentų tipams, kuriuos jie perduoda.

Kitam Julijos integruotas kodo vektorizavimas reiškia, kad programuotojui nereikia vektorizuoti kodo, kad jis būtų atliktas; įprastas devektorizuotas kodas yra greitas. Kompiliatorius gali pasinaudoti SIMD instrukcijomis ir registrais, jei jie yra pagrindiniame procesoriuje, ir išvynioti kilpas nuosekliame procese, kad jas vektorizuotų tiek, kiek leidžia aparatūra. Galite pažymėti kilpas kaip vektorizuojamas naudojant @simd anotacija.

Julijos lygiagretumas

Julija taip pat buvo sukurta lygiagretumui ir paskirstytam skaičiavimui, naudojant du primityvius dalykus: nuotolines nuorodas ir nuotolinius skambučius. Nuotolinės nuorodos yra dviejų skonių:Ateitis ir„RemoteChannel“. A Ateitis yra „JavaScript“ atitikmuo pažadas; a „RemoteChannel“ yra perrašomas ir gali būti naudojamas procesų bendravimui, pvz., „Unix“ vamzdis arba „Go“ kanalą. Darant prielaidą, kad pradėjote Juliją keliais procesais (pvz., julija -p 8 aštuonių branduolių procesoriui, pvz., „Intel Core i7“, galite @spawn arba nuotolinis skambutis () funkcijos iškvietimai asinchroniškai ir vėliau vykdyti kitą Julijos procesą gauti () Ateitis grąžinama, kai norite sinchronizuoti ir naudoti rezultatą.

Jei jums nereikia paleisti kelių branduolių, galite naudoti lengvą „žalią“ sriegį, vadinamą a Užduotis () Julijoje ir korutinas kai kuriomis kitomis kalbomis. A Užduotis () arba @ užduotis veikia kartu su a Kanalas, kuri yra vieno proceso versija „RemoteChannel“.

Julijos tipo sistema

Julija turi netrukdomą, tačiau galingą tipo sistemą, kuri pagal numatytuosius nustatymus yra dinamiška, atsižvelgiant į vykdymo laiko tipą, tačiau leidžia pasirinkti neprivalomas tipo anotacijas. Tai panašu į „TypeScript“. Pavyzdžiui:

julia> (1 + 2) :: AbstractFloat

KLAIDA: TypeError: typeassert: tikimasi AbstractFloat, gavo Int64

julia> (1 + 2) :: Vid

3

Čia mes pirmą kartą teigiame nesuderinamą tipą, sukeldami klaidą, o antrą kartą - suderinamą tipą.

Julijos stygos

Julija palaiko veiksmingą „Unicode“ eilutes ir simbolius, saugomus UTF-8 formatu, taip pat efektyviai palaiko ASCII simbolius, nes UTF-8 kodo taškai, mažesni nei 0x80 (128), užkoduoti viename simbolyje. Kitu atveju UTF-8 yra kintamo ilgio kodavimas, todėl negalima manyti, kad „Julia“ eilutės ilgis yra lygus paskutiniam simbolių indeksui.

Visiškas palaikymas UTF-8, be kita ko, reiškia, kad jūs galite lengvai apibrėžti kintamuosius naudodamiesi graikiškomis raidėmis, todėl mokslinis Julijos kodas gali atrodyti panašus į vadovėlių formulių paaiškinimus, pvz. nuodėmė (2π). A perkoduoti () funkcija yra skirta konvertuoti UTF-8 į ir iš kitų „Unicode“ koduočių.

C ir Fortran funkcijos

Julija gali tiesiogiai skambinti C ir „Fortran“ funkcijoms, nereikia jokių įvyniojimų ar specialių API, nors jums reikia žinoti „dekoruoto“ funkcijos pavadinimą, kurį išleido „Fortran“ kompiliatorius. Išorinė C arba „Fortran“ funkcija turi būti bendroje bibliotekoje; jūs naudojatės Julija skambutis () tikrojo iškvietimo funkcija. Pavyzdžiui, „Unix“ tipo sistemoje galite naudoti šį „Julia“ kodą, kad gautumėte aplinkos kintamojo vertę naudodami getenv funkcija libc:

funkcija getenv (var :: AbstractString)

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

Cstring, (Cstring,), var)

jei val == C_NULL

klaida ("getenv: neapibrėžtas kintamasis:", var)

galas

nesaugi_string (val)

galas

julia> getenv („LEVELĖ“)

"/ bin / bash"

Julijos makrokomandos

Julija turi į Lisp panašių makrokomandų, kurias išskiria iš makroprocesorių, naudojamų C ir C ++. Julija taip pat turi kitų metaprogramavimo galimybių, tokių kaip atspindys, kodo generavimas, simbolis (pvz. : foo) ir išraiška (pvz. : (a + b * c + 1) ) objektai, eval ()ir sugeneruotas funkcijas. Julijos makrokomandos vertinamos analizuojant.

Kita vertus, sugeneruotos funkcijos išplečiamos, kai yra žinomi jų parametrų tipai, prieš sudarant funkcijas. Sukurtos funkcijos turi bendrųjų funkcijų lankstumą (kaip įdiegta „C ++“ ir „Java“) ir labai tipiškų funkcijų efektyvumą, pašalinant poreikį paleisti vykdymo laiką, kad būtų palaikomas parametrinis polimorfizmas.

GPU palaikymas

Julija turi GPU palaikymą, be kitų dalykų, naudodama „MXNet“ giluminio mokymosi paketą, „ArrayFire“ GPU masyvo biblioteką, linijinę „cuBLAS“ ir „cuDNN“ algebros bei giliųjų neuronų tinklo bibliotekas ir CUDA sistemą, skirtą bendrosios paskirties GPU skaičiavimams. „Julia“ pakuotės ir jų atitinkamos bibliotekos parodytos toliau pateiktoje diagramoje.

Julia Computing

JuliaPro ir Juno IDE

Iš „Julia“ kalbos svetainės galite atsisiųsti nemokamą atvirojo kodo „Julia“ komandinę eilutę, skirtą „Windows“, „MacOS“, „Linux“ ar „FreeBSD“. „Julia“ šaltinio kodo saugyklą galite klonuoti iš „GitHub“.

Arba galite atsisiųsti „JuliaPro“ iš „Julia Computing“. Be kompiliatoriaus, „JuliaPro“ suteikia jums „Atom“ pagrindu pagamintą „Juno IDE“ (parodyta žemiau) ir daugiau nei 160 kuruotų paketų, įskaitant vizualizaciją ir braižymą.

Be to, kas yra nemokamoje „JuliaPro“, galite pridėti įmonės palaikymo, kiekybinių finansų funkcijų, duomenų bazių palaikymo ir laiko eilučių analizės prenumeratas. „JuliaRun“ yra klasterio ar debesies keičiamo dydžio serveris.

„Jupyter“ sąsiuviniai ir „IJulia“

Be to, kad „Juno“ naudojate kaip savo „Julia IDE“, galite naudoti „Visual Studio Code“ su „Julia“ plėtiniu (rodomas tiesiogiai žemiau) ir „Jupyter“ užrašų knygelėmis su „IJulia“ branduoliu (parodyta žemiau esančioje antroje ir trečioje ekrano kopijose). Jums gali tekti įdiegti „Jupyter“ bloknotus, skirtus „Python 2“ arba (pageidautina) „Python 3“ su „Anaconda“ arba „pip“.

JuliaBox

„Julia“ galite paleisti „Jupyter“ užrašų knygelėse internete naudodami „JuliaBox“ (parodyta žemiau), kitą „Julia Computing“ produktą, neatlikdami jokio diegimo savo vietiniame kompiuteryje. Šiuo metu „JuliaBox“ yra daugiau nei 300 paketų, veikia „Julia 0.6.2“ ir dešimtys „Jupyter“ mokomųjų sąsiuvinių. Aukščiausio lygio mokymo aplankų sąrašas rodomas žemiau. Nemokamas „JuliaBox“ prieigos lygis suteikia jums 90 minučių sesijas su trimis procesoriaus branduoliais; asmeninė 14 USD per mėnesį prenumerata suteikia keturių valandų sesijas su penkiais branduoliais; 70 USD per mėnesį prenumerata suteikia aštuonių valandų sesijas su 32 branduoliais. GPU prieiga dar nėra prieinama nuo 2018 m. Birželio mėn.

Julija pakuoja

Julija „vaikšto kaip Python, bet bėga kaip C.“ Kaip 2017 m. Gruodžio mėn. Rašė mano kolega Serdaras Yegulalpas, Julija pradeda mesti iššūkį „Python“ dėl duomenų mokslo programavimo, o abi kalbos turi pranašumų. Nurodykite, kad Julijoje greitai bręsta parama duomenų mokslui, apsvarstykite, ar jau yra dvi knygos, turinčios teisę Julija už duomenų mokslą, vieną - Zacharias Voulgaris, o kitą - Anshulas Joshi, nors aš negaliu kalbėti nei su vienu, nei su kitu.

Pažvelgus į žemiau pateiktus bendrai geriausiai įvertintus „Julia Observer“ „Julia“ paketus, pamatysite „Jupyter“ bloknotų „Julia“ branduolį, „Gadfly“ grafikos paketą (panašų į ggplot2 R), bendroji braižymo sąsaja, keli gilaus mokymosi ir mašininio mokymosi paketai, diferencialinių lygčių sprendėjai, „DataFrames“, Niujorko „Fed“ dinaminės stochastinės bendros pusiausvyros (DSGE) modeliai, optimizavimo modeliavimo kalba ir sąsajos su „Python“ ir „C ++“. Šiek tiek žemyn žengdami žemyn šiuo bendruoju sąrašu, taip pat rasite „QuantEcon“, „PyPlot“, „ScikitLearn“, bioinformatikos paketą ir tingių funkcinių programų sąrašų įgyvendinimą.

Jei „Julia“ paketų nepakanka jūsų poreikiams, o „Python“ sąsaja nepatenka ten, kur norite eiti, taip pat galite įdiegti paketą, kuris suteikia jums bendrąsias sąsajas su „R (RCall)“ ir „Matlab“.

Julija finansų analitikams ir kvantams

Kaip parodyta žemiau esančioje ekrano kopijoje, kiekiai ir finansų analitikai ras daug nemokamų paketų, kad pagreitintų jų darbą. Be to, „Julia Computing“ siūlo „JuliaFin“ rinkinį, kurį sudaro: Miletas (DSL finansinėms sutartims),JuliaDB (didelio našumo atmintyje ir paskirstyta duomenų bazė),JuliaInXL (paskambinkite Julijai iš „Excel“ lapų) ir„Bloomberg“ ryšys (prieiga prie realaus laiko ir istorinių rinkos duomenų).