Programování

Co je Julia? Nový přístup k numerickým výpočtům

Julia je bezplatný open source, vysoce výkonný, vysoce výkonný a dynamický programovací jazyk pro numerické výpočty. Má vývojové pohodlí dynamického jazyka s výkonem kompilovaného staticky typovaného jazyka, částečně díky kompilátoru JIT založenému na LLVM, který generuje nativní strojový kód, a částečně díky designu, který implementuje stabilitu typu prostřednictvím specializace prostřednictvím více Expedice, což usnadňuje kompilaci do efektivního kódu.

V příspěvku na blogu, který oznamoval první vydání Julie v roce 2012, autoři jazyka - Jeff Bezanson, Stefan Karpinski, Viral Shah a Alan Edelman - uvedli, že strávili tři roky tvorbou Julie, protože byli chamtivý. Byli unaveni z kompromisů mezi Matlab, Lisp, Python, Ruby, Perl, Mathematica, R a C a chtěli jediný jazyk, který by byl vhodný pro vědecké výpočty, strojové učení, dolování dat, rozsáhlou lineární algebru , paralelní výpočty a distribuované výpočty.

Pro koho je Julia? Kromě toho, že je přitažlivá pro vědecké pracovníky a inženýry, je atraktivní také pro datové vědce a finanční analytiky a kvantity.

Návrháři jazyka a další dva založili společnost Julia Computing v červenci 2015, aby „vyvinuli produkty, díky nimž bude Julia snadno použitelná, snadno nasaditelná a snadno škálovatelná.“ V době psaní tohoto článku má společnost 28 zaměstnanců a zákazníky od národních laboratoří přes banky, ekonomy až po výzkumníky autonomních vozidel. Kromě údržby úložišť open source Julia na GitHubu nabízí Julia Computing komerční produkty, včetně JuliaPro, který je k dispozici v bezplatné i placené verzi.

Proč Julia?

Julia „si klade za cíl vytvořit bezprecedentní kombinaci snadnosti použití, síly a efektivity v jediném jazyce.“ K otázce efektivity zvažte následující graf:

Julia Computing

Julia měřítka

Vidíme zde, že kód Julia může být rychlejší než C pro několik druhů operací a ne více než několikrát pomalejší než C pro ostatní. Porovnejte to s řekněme R, které může být u některých operací téměř 1 000krát pomalejší než C.

Všimněte si, že jedním z nejpomalejších testů pro Julii je Fibonacciho rekurze; to je proto, že Julii v současné době chybí optimalizace rekurze ocasu. Rekurze je ze své podstaty pomalejší než opakování. U skutečných programů Julia, které chcete spustit v produkci, budete chtít implementovat smyčkovou (iterační) formu takových algoritmů.

Julia JIT kompilace

Přístup kompilátoru JIT (just-in-time) je na rozdíl od čistého tlumočníka nákladný: Kompilátor musí před spuštěním kódu analyzovat zdrojový kód a vygenerovat strojový kód. To může znamenat znatelný čas spuštění programů Julia při prvním spuštění každé funkce a makra v relaci. Na níže uvedeném snímku obrazovky tedy vidíme, že podruhé, kdy vygenerujeme milion náhodných čísel s plovoucí desetinnou čárkou, je doba potřebná o řádově méně než při prvním provedení. Oba @čas makro a rand () funkce musela být poprvé zkompilována prostřednictvím kódu, protože knihovny Julia jsou psány v Julii.

julia> @time rand (10 ^ 6);

0,62081 sekundy (přidělení 14,44 k: 8,415 MiB)

julia> @time rand (10 ^ 6);

0,004881 sekundy (7 přidělení: 7 630 MiB)

Fanoušci Julie různě tvrdí, že má snadné použití Pythonu, R nebo dokonce Matlabu. Tato srovnání jsou podrobně zkoumána, protože jazyk Julia je elegantní, výkonný a orientovaný na vědecké výpočty a knihovny poskytují širokou škálu pokročilých programovacích funkcí.

Příklad Julie

Jako rychlý příklad jazyka Julia zvažte následující referenční kód sady Mandelbrot:

Jak vidíte, do jazyka je zabudována aritmetika komplexních čísel, stejně jako makra pro testy a načasování. Jak můžete také vidět, koncové středníky, které trápí jazyky podobné C, a vnořené závorky, které trápí jazyky podobné Lispu, v Julii chybí. Všimněte si, že mandelperf () je volán dvakrát, na řádcích 61 a 62. První volání testuje správnost výsledku a provádí kompilaci JIT; druhý hovor dostane načasování.

Programování Julia

Julia má mnoho dalších funkcí, které stojí za zmínku. Jedním z nich jsou uživatelem definované typy stejně rychlé a kompaktní jako vestavěné moduly. Ve skutečnosti můžete deklarovat abstraktní typy, které se chovají jako obecné typy, kromě toho, že jsou kompilovány pro typy argumentů, které jsou předány.

Pro jiného, ​​Juliaina vestavěná kódování vektorů znamená, že není nutné, aby programátor vektorizoval kód pro výkon; obyčejný devektorizovaný kód je rychlý. Kompilátor může využít instrukcí a registrů SIMD, pokud jsou přítomny na podkladovém CPU, a rozbalit smyčky v postupném procesu, aby je vektorizoval, jak to hardware umožňuje. Smyčky můžete označit jako vektorizovatelné pomocí @simd anotace.

Julia paralelismus

Julia byla také navržena pro paralelismus a distribuovaný výpočet pomocí dvou primitiv: vzdálené reference a vzdálená volání. Vzdálené odkazy přicházejí ve dvou variantách:Budoucnost aRemoteChannel. A Budoucnost je ekvivalent JavaScriptu slib; A RemoteChannel je přepisovatelný a lze jej použít pro meziprocesovou komunikaci, jako Unix trubka nebo Go kanál. Za předpokladu, že jste spustili Julii s více procesy (např. julia -p 8 pro osmijádrový procesor, jako je Intel Core i7), můžete @potěr nebo remotecall () volání funkcí k provedení na jiném procesu Julia asynchronně a později vynést() the Budoucnost vráceno, když chcete synchronizovat a použít výsledek.

Pokud nepotřebujete běžet na více jádrech, můžete využít lehké „zelené“ závitování, zvané a Úkol() v Julii a coututin v některých dalších jazycích. A Úkol() nebo @úkol pracuje ve spojení s a Kanál, což je jednoprocesová verze RemoteChannel.

Systém typu Julia

Julia má nenápadný, ale výkonný systém typů, který je ve výchozím nastavení dynamický s odvozením typu run-time, ale umožňuje volitelné anotace typu. Je to podobné jako s TypeScriptem. Například:

julia> (1 + 2) :: AbstractFloat

ERROR: TypeError: typeassert: expect AbstractFloat, got Int64

julia> (1 + 2) :: Int

3

Zde poprvé prosazujeme nekompatibilní typ, který způsobí chybu, a kompatibilní typ podruhé.

Julia struny

Julia má účinnou podporu pro řetězce a znaky Unicode uložené ve formátu UTF-8, stejně jako účinnou podporu pro znaky ASCII, protože v UTF-8 jsou kódové body menší než 0x80 (128) zakódovány do jednoho znaku. Jinak je UTF-8 kódování s proměnnou délkou, takže nemůžete předpokládat, že délka řetězce Julia se rovná poslednímu indexu znaků.

Plná podpora UTF-8 znamená mimo jiné to, že můžete snadno definovat proměnné pomocí řeckých písmen, díky nimž bude vědecký kód Julia vypadat podobně jako vysvětlivky k učebnicím vzorců, např. hřích (2π). A transkód () je poskytována funkce pro převod UTF-8 do az jiných kódování Unicode.

Funkce C a Fortran

Julia může volat funkce C a Fortran přímo, bez nutnosti obalů nebo speciálních API, i když potřebujete znát „zdobený“ název funkce vydávaný kompilátorem Fortran. Externí funkce C nebo Fortran musí být ve sdílené knihovně; používáte Julii ccall () funkce pro aktuální volání. Například v systému podobném Unixu můžete pomocí tohoto kódu Julia získat hodnotu proměnné prostředí pomocí getenv funkce v libc:

funkce getenv (var :: AbstractString)

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

Cstring, (Cstring,), var)

if val == C_NULL

chyba ("getenv: nedefinovaná proměnná:", var)

konec

unsafe_string (val)

konec

julia> getenv ("SHELL")

„/ bin / bash“

Makra Julia

Julia má makra podobná Lisp, na rozdíl od preprocesorů maker používaných v C a C ++. Julia má také další metaprogramovací zařízení, jako je reflexe, generování kódu, symbol (např. : foo) a výraz (např. : (a + b * c + 1) ) objekty, eval ()a generované funkce. Makra Julia se vyhodnocují při analýze.

Generované funkce se na druhou stranu rozšiřují, když jsou známy typy jejich parametrů, před kompilací funkcí. Generované funkce mají flexibilitu obecných funkcí (implementovaných v C ++ a Javě) a účinnost funkcí se silným typem, protože eliminují potřebu odesílání za běhu na podporu parametrického polymorfismu.

Podpora GPU

Julia má podporu GPU, mimo jiné pomocí balíčku MXNet pro hluboké učení, knihovny polí GPU ArrayFire, lineární algebry cuBLAS a cuDNN a knihoven hlubokých neurálních sítí a rámce CUDA pro obecné GPU výpočty. Obálky Julia a jejich příslušné knihovny jsou zobrazeny na obrázku níže.

Julia Computing

JuliaPro a Juno IDE

Můžete si stáhnout bezplatný otevřený příkazový řádek Julia pro Windows, MacOS, obecný Linux nebo obecný FreeBSD z webového serveru Julia. Můžete naklonovat úložiště zdrojového kódu Julia z GitHubu.

Alternativně si můžete stáhnout JuliaPro z Julia Computing. Kromě kompilátoru vám JuliaPro nabízí Atom založené Juno IDE (viz níže) a více než 160 kurátorských balíčků, včetně vizualizace a vykreslování.

Kromě bezplatného obsahu JuliaPro můžete přidat předplatné pro podnikovou podporu, funkce kvantitativního financování, podporu databází a analýzu časových řad. JuliaRun je škálovatelný server pro cluster nebo cloud.

Notebooky Jupyter a IJulia

Kromě používání Juno jako svého Julia IDE můžete použít Visual Studio Code s příponou Julia (zobrazeno přímo níže) a notebooky Jupyter s jádrem IJulia (zobrazeno na druhém a třetím snímku obrazovky níže). Možná budete muset nainstalovat notebooky Jupyter pro Python 2 nebo (nejlépe) Python 3 pomocí Anacondy nebo pipu.

JuliaBox

Julii můžete spustit v noteboocích Jupyter online pomocí JuliaBoxu (zobrazeného níže), dalšího produktu Julia Computing, aniž byste museli provádět instalaci na místním počítači. JuliaBox v současné době obsahuje více než 300 balíčků, běží Julia 0.6.2 a obsahuje desítky výukových notebooků Jupyter. Seznam nejvyšší úrovně složek výukových programů je uveden níže. Bezplatná úroveň přístupu JuliaBox vám poskytuje 90minutové relace se třemi jádry CPU; osobní předplatné 14 $ za měsíc vám poskytuje čtyřhodinové sezení s pěti jádry; a předplatné 70 $ za měsíc vám poskytuje osmhodinové relace s 32 jádry. Od června 2018 ještě není přístup k GPU k dispozici.

Julia balíčky

Julia „chodí jako Python, ale běží jako C.“ Jak napsal můj kolega Serdar Yegulalp v prosinci 2017, Julia začíná napadat Python pro programování vědy o datech a oba jazyky mají výhody. Jako důkaz rychle se rozvíjející podpory vědy o datech v Julii zvažte, že již existují dvě knihy s názvem Julia pro datovou vědujeden Zachariáš Voulgaris a druhý Anshul Joshi, i když nemůžu mluvit o kvalitě ani jednoho z nich.

Pokud se podíváte na celkově nejlépe hodnocené balíčky Julia od Julia Observer, zobrazené níže, uvidíte jádro Julia pro notebooky Jupyter, grafický balíček Gadfly (podobný ggplot2 v R), obecné vykreslovací rozhraní, několik balíčků hlubokého učení a strojového učení, řešení diferenciálních rovnic, DataFrames, modely dynamické stochastické obecné rovnováhy (DSGE) z New Yorku, optimalizační modelovací jazyk a rozhraní pro Python a C ++. Pokud půjdete trochu dále v tomto obecném seznamu, najdete také QuantEcon, PyPlot, ScikitLearn, balíček bioinformatiky a implementaci líných seznamů pro funkční programování.

Pokud balíčky Julia nestačí pro vaše potřeby a rozhraní Pythonu vás nedostane tam, kam chcete, můžete také nainstalovat balíček, který vám poskytne obecná rozhraní pro R (RCall) a Matlab.

Julia pro finanční analytiky a žádosti

Quants a finanční analytici najdou mnoho bezplatných balíčků pro urychlení jejich práce, jak ukazuje obrázek níže. Kromě toho společnost Julia Computing nabízí sadu JuliaFin, která se skládá z Milétu (DSL pro finanční smlouvy),JuliaDB (vysoce výkonný v paměti a distribuovaná databáze),JuliaInXL (volejte Julii z listů aplikace Excel) aBloomberg konektivita (přístup k historickým tržním datům v reálném čase).