Programmēšana

Kas ir Jūlija? Jauna pieeja skaitliskai skaitļošanai

Jūlija ir bezmaksas atvērtā koda, augsta līmeņa, augstas veiktspējas, dinamiska programmēšanas valoda ciparu skaitļošanai. Tam ir dinamiskas valodas izstrādes ērtības, izmantojot kompilētu, statiski ierakstītu valodu, daļēji pateicoties JIT kompilatoram, kura pamatā ir LLVM un kurš ģenerē vietējo mašīnkodu, un daļēji dizainam, kas nodrošina tipa stabilitāti, specializējoties, izmantojot vairākus nosūtīšanu, kas ļauj viegli apkopot efektīvā kodā.

Emuāra ziņā, kurā tika paziņots par Jūlijas sākotnējo atbrīvošanu 2012. gadā, valodas autori - Džefs Bezansons, Stefans Karpinskis, Virāls Šahs un Alans Edelmans - paziņoja, ka viņi trīs gadus pavadīja Jūlijas radīšanā, jo bija mantkārīgs. Viņi bija noguruši no kompromisiem starp Matlab, Lisp, Python, Ruby, Perl, Mathematica, R un C un vēlējās vienu valodu, kas būtu piemērota zinātniskai skaitļošanai, mašīnmācībai, datu ieguvei, liela mēroga lineārai algebrai. , paralēlā skaitļošana un sadalītā skaitļošana.

Kam domāta Jūlija? Papildus tam, ka Džūlija ir pievilcīga pētniekiem un inženieriem, tā ir pievilcīga arī datu zinātniekiem, finanšu analītiķiem un kvantitatīvajiem jautājumiem.

Valodas dizaineri un vēl divi citi nodibināja Julia Computing 2015. gada jūlijā, lai “izstrādātu produktus, kas padara Džūliju viegli lietojamu, viegli izvietojamu un viegli mērogojamu”. Šajā rakstā uzņēmumā strādā 28 darbinieki un klienti, sākot no nacionālajām laboratorijām līdz bankām, ekonomistiem un patstāvīgiem transportlīdzekļu pētniekiem. Papildus Julia atvērtā pirmkoda krātuvju uzturēšanai GitHub, Julia Computing piedāvā komerciālus produktus, tostarp JuliaPro, kas ir gan bezmaksas, gan maksas versijā.

Kāpēc Jūlija?

Jūlijas mērķis ir izveidot vēl nebijušu lietošanas ērtuma, jaudas un efektivitātes apvienojumu vienā valodā. Efektivitātes jautājumā apsveriet zemāk redzamo diagrammu:

Julia Computing

Jūlijas etaloni

Šeit mēs redzam, ka Džulijas kods dažu veidu darbībām var būt ātrāks par C un citiem - ne vairāk kā dažas reizes lēnāks nekā C. Salīdziniet to ar, teiksim, R, kas dažām operācijām var būt gandrīz 1000 reizes lēnāks nekā C.

Ņemiet vērā, ka viens no lēnākajiem Jūlijas testiem ir Fibonači rekursija; tas ir tāpēc, ka Džūlijai pašlaik trūkst astes rekursijas optimizācijas. Rekursija pēc būtības ir lēnāka nekā cilpa. Īstām Jūlijas programmām, kuras vēlaties palaist ražošanā, vēlēsities ieviest šādu algoritmu cilpas (iterācijas) formu.

Jūlijas JIT apkopojums

JIT (tieši laikā) kompilatora pieeja maksā atšķirībā no tīra tulka: pirms koda darbības var kompilatoram parsēt avota kodu un ģenerēt mašīnkodu. Tas var nozīmēt ievērojamu sākuma laiku Julia programmām, kad katra funkcija un makro tiek palaistas sesijas laikā. Tātad zemāk redzamajā ekrānuzņēmumā mēs redzam, ka otro reizi, kad mēs ģenerējam miljonu nejaušu peldošā komata skaitļu, laiks, kas nepieciešams, ir par mazāku par pirmo izpildi. Gan @laiks makro un rand () Funkcija bija jāapkopo pirmo reizi, izmantojot kodu, jo Jūlijas bibliotēkas ir rakstītas Jūlijā.

julia> @time rand (10 ^ 6);

0.62081 sekundes (14.44 k piešķiršana: 8.415 MiB)

julia> @time rand (10 ^ 6);

0,004881 sekundes (7 piešķīrumi: 7,630 MiB)

Jūlijas fani dažādi apgalvo, ka tam ir ērti izmantot Python, R vai pat Matlab. Šie salīdzinājumi patiešām tiek pārbaudīti, jo Jūlijas valoda ir eleganta, spēcīga un orientēta uz zinātnisko skaitļošanu, un bibliotēkas piedāvā plašu progresīvu programmēšanas funkcionalitāti.

Jūlijas piemērs

Kā ātru Džūlijas valodas piemēru ņemiet vērā šādu Mandelbrot iestatītā etalona kodu:

Kā redzat, valodā ir iebūvēta sarežģīta skaitļu aritmētika, tāpat kā testu un laika makro. Kā redzat arī, Jūlijā trūkst semikolu, kas nomoka C līdzīgas valodas, un ligzdotās iekavas, kas nomoka Lisp līdzīgās valodas. Pieraksti to mandelperf () tiek izsaukts divreiz, 61. un 62. rindā. Pirmais izsaukums pārbauda rezultāta pareizību un veic JIT apkopošanu; otrais zvans saņem laiku.

Jūlija programmē

Jūlijai ir daudz citu pieminēšanas vērtu īpašību. Pirmkārt, lietotāja noteikti veidi ir tikpat ātri un kompakti kā iebūvētie. Faktiski jūs varat pasludināt abstraktus tipus, kas darbojas kā vispārīgi tipi, izņemot to, ka tie ir apkopoti argumentu tipiem, kuriem tie tiek nodoti.

Citam Džūlijas iebūvētā koda vektorizācija nozīmē, ka programmētājam nav nepieciešams vektorizēt kodu veiktspējas nodrošināšanai; parasts devektorizēts kods ir ātrs. Kompilators var izmantot SIMD instrukciju un reģistru priekšrocības, ja tās atrodas pamatā esošajā centrālajā procesorā, un atritināt cilpas secīgā procesā, lai tās vektorizētu, cik vien aparatūra atļauj. Jūs varat atzīmēt cilpas kā vektorizējamas ar @simd anotācija.

Jūlijas paralēlisms

Jūlija tika izstrādāta arī paralēlismam un izplatītai skaitļošanai, izmantojot divus primitīvus: attālinātās atsauces un attālinātos zvanus. Attālās atsauces ir divos aromātos:Nākotne unRemoteChannel. A Nākotne ir ekvivalents JavaScript apsolīt; a RemoteChannel ir pārrakstāms un to var izmantot starpprocesu saziņai, piemēram, Unix caurule vai Go kanāls. Pieņemot, ka esat sākusi Jūliju ar vairākiem procesiem (piem., julija -p 8 astoņu kodolu procesoram, piemēram, Intel Core i7), varat @spawn vai attālināts zvans () funkciju izsaukumi, lai asinhroni un vēlāk izpildītu citu Jūlijas procesu atnest () Nākotne tiek atgriezta, kad vēlaties sinhronizēt un izmantot rezultātu.

Ja jums nav nepieciešams palaist uz vairākiem kodoliem, varat izmantot vieglu “zaļo” vītni, sauktu par a Uzdevums () Džūlijā un korutīna dažās citās valodās. A Uzdevums () vai @ uzdevums darbojas kopā ar a Kanāls, kas ir viena procesa versija RemoteChannel.

Jūlijas tipa sistēma

Džūlijai ir neuzkrītoša, tomēr spēcīga tipa sistēma, kas pēc noklusējuma ir dinamiska ar secinājumu par izpildes laika tipu, bet pieļauj izvēles tipa piezīmes. Tas ir līdzīgs TypeScript. Piemēram:

julia> (1 + 2) :: AbstractFloat

KĻŪDA: TypeError: typeassert: paredzamais AbstractFloat, ieguva Int64

julia> (1 + 2) :: Int

3

Šeit mēs pirmo reizi apgalvojam nesaderīgu tipu, izraisot kļūdu, un otro reizi - saderīgu tipu.

Jūlijas stīgas

Jūlijai ir efektīvs atbalsts Unicode virknēm un rakstzīmēm, kas saglabātas UTF-8 formātā, kā arī efektīvs atbalsts ASCII rakstzīmēm, jo ​​UTF-8 koda punkti, kas mazāki par 0x80 (128), ir kodēti vienā rakstzīmē. Pretējā gadījumā UTF-8 ir mainīga garuma kodējums, tāpēc jūs nevarat pieņemt, ka Džūlijas virknes garums ir vienāds ar pēdējo rakstzīmju indeksu.

Pilnīgs UTF-8 atbalsts cita starpā nozīmē, ka jūs varat viegli definēt mainīgos, izmantojot grieķu burtus, kas zinātnisko Jūlijas kodu var padarīt ļoti līdzīgu formulu skaidrojumiem mācību grāmatā, piem. grēks (2π). A pārkodēt () funkcija ir paredzēta, lai pārveidotu UTF-8 uz citiem Unicode kodējumiem un no tiem.

C un Fortran funkcijas

Jūlija var tieši izsaukt C un Fortran funkcijas, bez iesaiņotājiem vai īpašām API, kaut arī jums jāzina Fortran kompilatora izstarotais funkcijas nosaukums. Ārējai C vai Fortran funkcijai jābūt koplietojamā bibliotēkā; jūs izmantojat Džūliju zvans () faktiskā izsaukuma funkcija. Piemēram, Unix līdzīgā sistēmā varat izmantot šo Jūlijas kodu, lai iegūtu vides mainīgā vērtību, izmantojot getenv funkcija libc:

funkcija getenv (var :: AbstractString)

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

Cstring, (Cstring,), var)

ja val == C_NULL

kļūda ("getenv: undefined variable:", var)

beigas

nedroša_string (val)

beigas

julia> getenv ("čaumala")

"/ bin / bash"

Jūlijas makro

Jūlijai ir Lisp līdzīgi makro, kas atšķiras no makro priekšapstrādātājiem, kurus izmanto C un C ++. Jūlijai ir arī citas metaprogrammēšanas iespējas, piemēram, pārdomas, kodu ģenerēšana, simbols (piem., : foo) un izteiksme (piem. : (a + b * c + 1) ) objekti, eval ()un ģenerētās funkcijas. Jūlijas makro tiek novērtēti parsēšanas laikā.

Savukārt ģenerētās funkcijas pirms funkciju kompilēšanas tiek paplašinātas, kad ir zināmi to parametru veidi. Ģenerētajām funkcijām ir vispārīgo funkciju elastīgums (kā tas tiek ieviests C ++ un Java) un stingri tipētu funkciju efektivitāte, novēršot nepieciešamību pēc izpildes laika nosūtīšanas, lai atbalstītu parametru polimorfismu.

GPU atbalsts

Jūlijai ir GPU atbalsts, cita starpā izmantojot MXNet dziļo mācību paketi, ArrayFire GPU masīvu bibliotēku, lineāro algebras cuBLAS un cuDNN un dziļo neironu tīkla bibliotēkas un CUDA ietvaru vispārējas nozīmes GPU skaitļošanai. Jūlijas iesaiņotāji un to attiecīgās bibliotēkas ir parādītas zemāk redzamajā diagrammā.

Julia Computing

DžūlijaPro un Juno IDE

No Julia valodas vietnes varat lejupielādēt bezmaksas atvērtā koda Julia komandrindu operētājsistēmai Windows, MacOS, vispārīgajiem Linux vai FreeBSD. Jūs varat klonēt Džūlijas pirmkodu krātuvi no GitHub.

Varat arī lejupielādēt JuliaPro no Julia Computing. Papildus kompilatoram JuliaPro piešķir jums Atom balstītu Juno IDE (parādīts zemāk) un vairāk nekā 160 kopētas paketes, ieskaitot vizualizāciju un grafiku.

Papildus bezmaksas JuliaPro saturam varat pievienot abonementus uzņēmuma atbalstam, kvantitatīvai finanšu funkcionalitātei, datu bāzes atbalstam un laika rindu analīzei. JuliaRun ir mērogojams klastera vai mākoņa serveris.

Jupyter piezīmjdatori un IJulia

Papildus tam, ka Juno izmantojat kā savu Julia IDE, varat izmantot Visual Studio kodu ar paplašinājumu Julia (parādīts tieši zemāk) un Jupyter piezīmjdatorus ar IJulia kodolu (parādīts otrajā un trešajā ekrānuzņēmumā zemāk). Jums var būt jāinstalē Jupyter piezīmjdatori Python 2 vai (vēlams) Python 3 ar Anaconda vai pip.

DžūlijaBox

Jūs varat palaist Julia tiešsaistē Jupyter piezīmjdatoros, izmantojot JuliaBox (parādīts zemāk), citu Julia Computing produktu, neveicot nekādu instalēšanu vietējā mašīnā. Pašlaik JuliaBox ietver vairāk nekā 300 pakotnes, darbojas Julia 0.6.2 un satur desmitiem Jupyter piezīmju grāmatiņu. Apmācību mapju augšējā līmeņa saraksts ir parādīts zemāk. Bezmaksas JuliaBox piekļuves līmenis nodrošina 90 minūšu sesijas ar trim CPU kodoliem; personīgais abonements 14 USD mēnesī sniedz četru stundu sesijas ar pieciem kodoliem; un 70 USD mēnesī pro abonements sniedz astoņu stundu sesijas ar 32 kodoliem. GPU piekļuve vēl nav pieejama no 2018. gada jūnija.

Jūlija iesaiņo

Jūlija “staigā kā Python, bet skrien kā C.” Kā 2017. gada decembrī rakstīja mans kolēģis Serdars Jegulalps, Jūlija sāk izaicināt Python par datu zinātnes programmēšanu, un abām valodām ir priekšrocības. Kā norādi uz strauji nobriedušo atbalstu datu zinātnei Jūlijā, uzskatiet, ka jau ir divas grāmatas ar nosaukumu Jūlija par datu zinātni, vienu Zacharias Voulgaris un otru Anshul Joshi, lai gan es nevaru runāt ne ar vienu, ne otru.

Aplūkojot zemāk redzamos Julia Observer visaugstāk novērtētos Julia pakotņus, jūs redzēsit Jupyter piezīmjdatoru Julia kodolu, Gadfly grafikas paketi (līdzīgi kā ggplot2 R), vispārējs zīmēšanas interfeiss, vairākas padziļinātas mācīšanās un mašīnmācīšanās paketes, diferenciālvienādojumu risinātāji, DataFrames, Ņujorkas Fed dinamiskās stohastiskās vispārējās līdzsvara (DSGE) modeļi, optimizācijas modelēšanas valoda un saskarnes Python un C ++. Ja jūs iet mazliet tālāk šajā vispārīgajā sarakstā, jūs atradīsit arī QuantEcon, PyPlot, ScikitLearn, bioinformātikas paketi un slinku sarakstu ieviešanu funkcionālai programmēšanai.

Ja ar Julia pakotnēm nepietiek jūsu vajadzībām un Python interfeiss nenonāk jūs tur, kur vēlaties doties, varat arī instalēt pakotni, kas nodrošina vispārīgas saskarnes R (RCall) un Matlab.

Jūlija par finanšu analītiķiem un kvantiem

Kvanti un finanšu analītiķi atradīs daudz bezmaksas paku, lai paātrinātu viņu darbu, kā parādīts zemāk esošajā ekrānuzņēmumā. Turklāt Julia Computing piedāvā komplektu JuliaFin, kas sastāv no Miletus (DSL finanšu līgumiem),DžūlijaDB (augstas veiktspējas atmiņā un izplatītā datu bāze),JuliaInXL (piezvaniet Jūlijai no Excel lapām) unBlumbergs savienojamība (piekļuve reāllaika un vēsturiskajiem tirgus datiem).

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