Какво е Джулия? Свеж подход към числените изчисления

Julia е безплатен отворен код, високоефективен, динамичен език за програмиране за цифрови изчисления. Той има удобството за разработка на динамичен език с изпълнението на компилиран статично типизиран език, отчасти благодарение на JIT-компилатор, базиран на LLVM, който генерира собствен машинен код, и отчасти на дизайн, който прилага стабилност на типа чрез специализация чрез множество изпращане, което улеснява компилирането до ефективен код.

В публикацията в блога, която обявява първоначалното освобождаване на Джулия през 2012 г., авторите на езика - Джеф Безансън, Стефан Карпински, Вирусен шах и Алън Еделман - заявяват, че са прекарали три години, създавайки Джулия, защото са били алчни . Те бяха уморени от компромисите между Matlab, Lisp, Python, Ruby, Perl, Mathematica, R и C и искаха един език, който да е добър за научни изчисления, машинно обучение, извличане на данни, мащабна линейна алгебра , паралелни изчисления и разпределени изчисления.

За кого е Джулия? Освен че е привлекателна за изследователите и инженерите, Джулия е привлекателна и за изследователите на данни и за финансовите анализатори и квантовете.

Дизайнерите на езика и двама други създадоха Julia Computing през юли 2015 г., за да „разработят продукти, които правят Julia лесна за използване, лесна за внедряване и мащабиране“. Към момента на написването, компанията има персонал от 28 души и клиенти, вариращи от национални лаборатории през банки до икономисти до автономни изследователи на автомобили. В допълнение към поддържането на хранилищата с отворен код Julia на GitHub, Julia Computing предлага търговски продукти, включително JuliaPro, който се предлага както в безплатна, така и в платена версия.

Защо Джулия?

Джулия „цели да създаде безпрецедентна комбинация от лекота на използване, мощност и ефективност на един език.“ По въпроса за ефективността разгледайте графиката по-долу:

Julia Computing

Референтни стойности на Джулия

Това, което виждаме тук, е, че кодът на Джулия може да бъде по-бърз от C за няколко вида операции и не повече от няколко пъти по-бавен от C за други. Сравнете това с, да речем, R, което може да бъде почти 1000 пъти по-бавно от C за някои операции.

Имайте предвид, че един от най-бавните тестове за Джулия е рекурсията на Фибоначи; това е така, защото Джулия в момента няма оптимизация на рекурсията на опашката. Рекурсията по своята същност е по-бавна от цикъла. За реални програми на Julia, които искате да стартирате в производство, ще искате да приложите цикъла (итерация) на такива алгоритми.

Джулия JIT компилация

Подходът на компилатора JIT (точно навреме) струва, за разлика от чистия интерпретатор: Компилаторът трябва да анализира изходния код и да генерира машинен код, преди кодът ви да може да се стартира. Това може да означава забележимо време за стартиране на програмите Julia при първото стартиране на всяка функция и макрос в сесия. И така, на екранната снимка по-долу виждаме, че вторият път, когато генерираме милион произволни числа с плаваща запетая, необходимото време е с порядък по-малко, отколкото при първото изпълнение. И @timeмакросът, и rand()функцията трябваше да бъдат компилирани за първи път чрез кода, защото библиотеките на Julia са написани на Julia.

julia> @time rand (10 ^ 6);

  0,62081 секунди (14,44 k разпределения: 8,415 MiB)

julia> @time rand (10 ^ 6);

  0,004881 секунди (7 разпределения: 7,630 MiB)

Феновете на Джулия твърдят по различен начин, че има лекотата на използване на Python, R или дори Matlab. Тези сравнения подлежат на проверка, тъй като езикът Джулия е елегантен, мощен и ориентиран към научни изчисления, а библиотеките предлагат широк спектър от усъвършенствани функционални възможности за програмиране.

Пример за Джулия

Като бърз пример за език на Джулия, помислете за следния код на бенчмарк на Mandelbrot:

Както можете да видите, аритметиката със сложни числа е вградена в езика, както и макросите за тестове и синхронизация. Както можете също да видите, последващите точки и запетая, които тормозят езици, подобни на C, и вложените скоби, които тормозят езици, подобни на Lisp, отсъстват от Julia. Обърнете внимание, че mandelperf()се извиква два пъти, в редове 61 и 62. Първото повикване тества резултата за коректност и прави JIT-компилация; второто повикване получава времето.

Програмиране на Джулия

Джулия има много други функции, които си струва да се споменат. Първо, потребителските типове са толкова бързи и компактни, колкото и вградените. Всъщност можете да декларирате абстрактни типове, които се държат като общи типове, с изключение на това, че са компилирани за типовете аргументи, които са предадени.

От друга страна, вградената векторизация на кода на Джулия означава, че няма нужда програмист да векторизира кода за изпълнение; обикновеният девекторизиран код е бърз. Компилаторът може да се възползва от инструкциите и регистрите на SIMD, ако присъстват на основния процесор, и да развие контурите в последователен процес, за да ги векторизира, доколкото хардуерът позволява. Можете да маркирате цикли като векторизуеми с @simdанотацията.

Паралелизъм на Джулия

Джулия също е проектирана за паралелизъм и разпределено изчисление, използвайки два примитива: отдалечени препратки и отдалечени повиквания. Отдалечените референции се предлагат в два вида:  Future и  RemoteChannel. A Futureе еквивалентът на JavaScript promise; a RemoteChannelможе да се презаписва и може да се използва за комуникация между процесите, като Unix pipeили Go channel. Ако приемем, че сте започнали Джулия с множество процеси (например julia -p 8за осем-ядрен процесор, като например Intel Core i7), можете да @spawnили remotecall()извиквания на функции за изпълнение на друг процес Джулия асинхронно, а по-късно fetch()на Futureвърнати, когато искате да синхронизирате и използвайте резултат.

Ако не е необходимо да работите на множество ядра, можете да използвате лека „зелена“ резба, наречена a Task()на Julia и съпрограма на някои други езици. A Task()или @taskработи съвместно с a Channel, което е еднопроцесната версия на RemoteChannel.

Система тип Джулия

Джулия има ненатрапчива, но мощна система от тип, която е динамична с умозаключване по подразбиране, но позволява опции за незадължителен тип. Това е подобно на TypeScript. Например:

julia> (1 + 2) :: AbstractFloat

ГРЕШКА: TypeError: typeassert: очаквано AbstractFloat, има Int64

Джулия> (1 + 2) :: Международна

3

Тук заявяваме несъвместим тип за първи път, причинявайки грешка, и съвместим тип за втори път.

Струни на Джулия

Джулия има ефективна поддръжка за Unicode низове и символи, съхранявани във формат UTF-8, както и ефективна поддръжка за ASCII символи, тъй като в UTF-8 кодовите точки под 0x80 (128) са кодирани в един символ. В противен случай UTF-8 е кодиране с променлива дължина, така че не можете да приемете, че дължината на низ Julia е равна на последния индекс на символа.

Пълната поддръжка за UTF-8 означава, наред с други неща, че можете лесно да дефинирате променливи, използвайки гръцки букви, което може да направи научния код на Джулия много подобен на обясненията на формулите в учебника, напр sin(2π). Предвидена е transcode()функция за конвертиране на UTF-8 към и от други Unicode кодирания.

C и Fortran функции

Джулия може да извиква директно функции C и Fortran, без да са необходими обвивки или специални API, въпреки че трябва да знаете „декорираното“ име на функцията, излъчвано от компилатора Fortran. Външната функция C или Fortran трябва да е в споделена библиотека; използвате функцията Julia ccall()за реалния разговор. Например в Unix-подобна система можете да използвате този Julia код, за да получите стойността на променливата на околната среда, използвайки getenvфункцията в libc:

функция getenv (var :: AbstractString)

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

                 Cstring, (Cstring,), var)

     ако val == C_NULL

         грешка ("getenv: недефинирана променлива:", var)

     край

     unsafe_string (val)

край

julia> getenv ("SHELL")

"/ bin / bash"

Джулия макроси

Джулия има подобни на Lisp макроси, за разлика от макропроцесорите, използвани от C и C ++. Джулия има и други средства за метапрограмиране, като отражение, генериране на код, символи (например :foo) и изрази (например :(a+b*c+1)) обекти eval()и генерирани функции. Макросите на Джулия се оценяват по време на синтактичен анализ.

Генерираните функции, от друга страна, се разширяват, когато типовете на техните параметри са известни, преди компилирането на функциите. Генерираните функции имат гъвкавостта на общите функции (както е внедрена в C ++ и Java) и ефективността на силно типизирани функции, като елиминира необходимостта от изпращане по време на изпълнение, за да поддържа параметричен полиморфизъм.

Поддръжка на GPU

Джулия има GPU поддръжка, използвайки, наред с други, пакета за дълбоко обучение MXNet, библиотеката с масиви на ArrayFire GPU, линейната алгебра cuBLAS и cuDNN и дълбоките невронни мрежи, както и рамката CUDA за GPU изчисления с общо предназначение. Опаковките на Julia и съответните им библиотеки са показани на диаграмата по-долу.

Julia Computing

JuliaPro и Juno IDE

Можете да изтеглите безплатния команден ред Julia с отворен код за Windows, MacOS, общ Linux или общ FreeBSD от езиковия сайт Julia. Можете да клонирате хранилището на изходния код на Julia от GitHub.

Като алтернатива можете да изтеглите JuliaPro от Julia Computing. В допълнение към компилатора, JuliaPro ви предоставя базираната на Atom Juno IDE (показана по-долу) и повече от 160 подбрани пакета, включително визуализация и графика.

Освен това, което е в безплатната JuliaPro, можете да добавите абонаменти за корпоративна поддръжка, количествена финансова функционалност, поддръжка на база данни и анализ на времеви редове. JuliaRun е мащабируем сървър за клъстер или облак.

Бележници на Юпитер и Юлия

В допълнение към използването на Juno като вашата Julia IDE, можете да използвате Visual Studio Code с разширението Julia (показано директно по-долу) и тетрадки Jupyter с ядрото IJulia (показано на втория и третия екранни снимки по-долу). Може да се наложи да инсталирате преносими компютри Jupyter за Python 2 или (за предпочитане) Python 3 с Anaconda или pip.

JuliaBox

Можете да стартирате Julia в тетрадки Jupyter онлайн, като използвате JuliaBox (показан по-долу), друг продукт на Julia Computing, без да правите никаква инсталация на вашата локална машина. Понастоящем JuliaBox включва повече от 300 пакета, изпълнява Julia 0.6.2 и съдържа десетки учебни тетрадки Jupyter. Списъкът с най-високо ниво на папки с уроци е показан по-долу. Безплатното ниво на достъп на JuliaBox ви дава 90-минутни сесии с три процесорни ядра; личният абонамент от $ 14 на месец ви дава четиричасови сесии с пет ядра; и $ 70 на месец професионален абонамент ви дава осемчасови сесии с 32 ядра. Достъпът до GPU все още не е наличен от юни 2018 г.

Пакети Джулия

Джулия „ходи като Python, но тича като C.“ Както колегата Сердар Йегулалп писа през декември 2017 г., Джулия започва да оспорва Python за програмиране на науката за данни и двата езика имат предимства. Като индикация за бързо узряващата подкрепа за науката за данни в Джулия, помислете, че вече има две книги, озаглавени „ Джулия за наука за данни“ , едната от Захариас Вулгарис, а другата от Аншул Джоши, въпреки че не мога да говоря за качеството на нито едната, нито другата. един.

Ако разгледате общите най-високо оценени пакети Julia от Julia Observer, показани по-долу, ще видите ядро ​​Julia за тетрадки Jupyter, графичен пакет Gadfly (подобен на ggplot2R), общ интерфейс за начертаване, няколко дълбоки обучения и машина обучителни пакети, диференциални уравнения, DataFrames, динамични стохастични модели на общо равновесие (DSGE) на Ню Йорк, език за оптимизиране на моделиране и интерфейси към Python и C ++ Ако отидете малко по-надолу по този общ списък, ще намерите също QuantEcon, PyPlot, ScikitLearn, пакет за биоинформатика и внедряване на мързеливи списъци за функционално програмиране.

Ако пакетите Julia не са достатъчни за вашите нужди и интерфейсът на Python не ви отведе там, където искате да отидете, можете също да инсталирате пакет, който ви дава общи интерфейси за R (RCall) и Matlab.

Джулия за финансови анализатори и квантове

Quants и финансови анализатори ще намерят много безплатни пакети, за да ускорят работата си, както е показано на екранната снимка по-долу. В допълнение, Julia Computing предлага пакет JuliaFin, състоящ се от Miletus (DSL за финансови договори),  JuliaDB (високоефективна памет и разпределена база данни),  JuliaInXL (обаждане на Julia от листове на Excel) и  свързаност Bloomberg (достъп до реални -време и исторически пазарни данни).