Джулия, на данный момент (май 2019, Джулия v1.1 с v1.2 скоро выйдет) вполне готова для научных вычислений. Релиз v1.0 означал конец ежегодной поломки кода . При этом многие научные вычислительные библиотеки успели просто расти без сбоев. Широкий обзор пакетов Julia можно найти на pkg.julialang.org .
Для основных научных вычислений, то DifferentialEquations.jl библиотека для дифференциальных уравнений (ОДУ, сдесь, ДАЕС, DDEs, Gillespie моделирования и т.д.), Flux.jl для нейронных сетей, а JuMP библиотека для математического программирования (оптимизации: линейная, квадратичная, смешанное целое и т. д. программирование) - три краеугольных камня научной вычислительной экосистемы. В частности, библиотека дифференциальных уравнений гораздо более развита, чем то, что вы видели бы на других языках, с большой группой разработчиков, реализующей такие функции, как интеграторы EPIRK , Рунге-Кутта-Нистром , дифференциальное уравнение с жесткой / дифференциально-алгебраической задержкой иИнтеграторы адаптивных стохастических дифференциальных уравнений с адаптивным по времени , наряду с кучей других полезностей, таких как анализ сопряженной чувствительности , DSL химических реакций, безматричный матрица Ньютона-Крылова и полная совместимость с GPU (без передачи данных), с обучением нейронных дифференциальных уравнений , все с фантастические результаты тестов (отказ от ответственности: я ведущий разработчик).
То, что немного ошеломляет в зрелой экосистеме Джулии, - это ее сочетаемость. По сути, когда кто-то создает универсальную библиотечную функцию, подобную тем, которые используются в DifferentialEquations.jl, вы можете использовать любой тип AbstractArray / Number для генерации нового кода на лету. Так, например, есть библиотека для распространения ошибок ( Measurements.jl ), и когда вы вставляете ее в решатель ODE, она автоматически компилирует новую версию решателя ODE, которая выполняет распространение ошибок без выборки параметров . Из-за этого вы можете не найти некоторые документированные функции, потому что код для функций генерирует сам себя, и поэтому вам нужно больше думать о компоновке библиотеки.
Одним из способов, где композиция наиболее полезна, является линейная алгебра. Решатели ODE, например, позволяют вам указывать jac_prototype
, давая вам возможность указать тип якобиана, который будет использоваться для внутренних целей. Конечно , есть вещи , в стандартной библиотеке LineraAlgebra , как Symmetric
и Tridiagonal
вы можете использовать здесь, но , учитывая полезность composibility в общих алгоритмах типа, люди теперь пошли и построили целые библиотеки типа массива. BandedMatrices.jl и BlockBandedMatrices.jl являются библиотеками, которые определяют ( блочные ) типы полосовых матриц, которые имеют быстрые lu
перегрузки, что делает их хорошим способом ускорить решение жестких MOL-дискретизаций систем уравнений в частных производных. PDMats.jlпозволяет задавать положительно определенные матрицы. Elemental.jl позволяет вам определять распределенный разреженный якобиан. CuArrays.jl определяет массивы на GPU. И т.п.
Тогда у вас есть все ваши типы чисел. Unitful.jl выполняет проверку модулей во время компиляции, поэтому это библиотека модулей без лишних затрат. DoubleFloats.jl - это быстрая библиотека с более высокой точностью, наряду с Quadmath.jl и ArbFloats.jl . ForwardDiff.jl - это библиотека для автоматического дифференцирования в прямом режиме, использующая арифметику двойных чисел. И я могу продолжать перечислять их. И да, вы можете добавить их в достаточно универсальные библиотеки Julia, такие как DifferentialEquations.jl, чтобы скомпилировать версию, специально оптимизированную для этих числовых типов. Даже что-то вроде ApproxFun.jlкоторая функционирует как алгебраические объекты (например, Chebfun) работает с этой общей системой, позволяя задавать PDE как ODE на скалярах в функциональном пространстве.
Учитывая преимущества компоновки и то, как типы могут использоваться для генерации нового и эффективного кода на универсальных функциях Julia, было проделано много работы, чтобы внедрить основные функциональные возможности научных вычислений в чистую Julia. Optim.jl для нелинейной оптимизации, NLsolve.jl для решения нелинейных систем, IterativeSolvers.jl для итерационных решателей линейных систем и собственных систем, BlackBoxOptim.jl для оптимизации черного ящика и т. Д. Даже библиотека нейронных сетей Flux.jl просто использует CuArrays. jl - автоматическая компиляция кода в GPU для его возможностей GPU. Эта совместимость была основой того, что создавало такие вещи, как нейронные дифференциальные уравнения в DiffEqFlux.jl, Вероятностные языки программирования, такие как Turing.jl , также достаточно развиты и используют те же базовые инструменты.
Поскольку библиотеки Джулии основаны на инструментах генерации кода, неудивительно, что существует множество инструментов для генерации кода. Система вещания Джулии генерирует слитые ядра на лету, которые перегружены типами массивов, чтобы предоставить множество функций, упомянутых выше. CUDAnative.jl позволяет компилировать код Julia для ядер GPU. ModelingToolkit.jl автоматически удаляет сахара из AST в символическую систему для преобразования математического кода. Cassette.jlпозволяет вам «перезаписать» чужую существующую функцию, используя правила, чтобы изменить их функцию перед временем компиляции (например: изменить все их распределения массива на статические распределения массива и перенести операции в графический процессор). Это более продвинутый инструментарий (я не ожидаю, что все, кто занимается научными вычислениями, получат прямой контроль над компилятором), но именно так строится множество инструментов следующего поколения (или, скорее, как сами функции пишут).
Что касается параллелизма, я упомянул графические процессоры, а у Юлии встроены многопоточность и распределенные вычисления . Многопоточность Julia очень скоро будет использовать архитектуру выполнения параллельных задач (PARTR), которая позволяет автоматизировать планирование вложенной многопоточности . Если вы хотите использовать MPI, вы можете просто использовать MPI.jl . И, конечно же, самый простой способ использовать все это - просто использовать настройку типа AbstractArray для использования параллелизма в своих операциях.
У Джулии также есть базовая экосистема, которую можно ожидать от языка общего назначения, используемого для научных приложений. Он имеет Juno IDE со встроенным отладчиком с точками останова , имеет Plots.jl для создания всевозможных графиков. Многие специальные инструменты также хороши, например, Revise.jl автоматически обновляет ваши функции / библиотеку при сохранении файла. У вас есть DataFrames.jl , библиотеки статистики и т. Д. На самом деле одна из самых хороших библиотек - это Distributions.jl, которая позволяет вам писать алгоритмы, общие для дистрибутива (например:rand(dist)
принимает случайное число независимо от того, какой дистрибутив был передан), и существует целая масса одномерных и многомерных распределений (и, конечно, диспетчеризация происходит во время компиляции, что делает все это так же быстро, как жесткое кодирование функции, специфичной для данного распределения). Существует множество инструментов обработки данных , веб-серверов и т. Д. Вы называете это. На данный момент он достаточно зрел, чтобы, если есть фундаментальная научная вещь, и вы ожидаете, что она будет существовать, вы просто отправите ее в Google с помощью .jl или Джулии, и она появится.
Тогда есть несколько вещей, которые нужно иметь в виду на горизонте. PackageCompiler ищет сборки двоичных файлов из библиотек Julia, и он уже имеет некоторые успехи, но нуждается в доработке. Makie.jl - это целая библиотека для графического ускорения с интерактивностью, и ей все еще нужно немного поработать, но она действительно стремится стать главной библиотекой для графиков в Юлии. Zygote.jl - это библиотека автоматического разграничения от источника к источнику, в которой нет проблем с производительностью AD на основе трассировки (Flux's Tracker, PyTorch, Jax) и которая работает со всеми чистыми кодами Julia. И т.п.
В заключение, вы можете найти много движений во многих местах, но в большинстве областей уже есть солидная зрелая библиотека. Это больше не в том месте, где вы спрашиваете «будет ли это принято?»: Юлия была усыновлена достаточным количеством людей (миллионы загрузок), что у нее есть импульс, чтобы остаться навсегда. У него действительно приятное сообщество, так что если вы когда-нибудь захотите просто попутаться и поговорить о параллельных вычислениях или численных дифференциальных уравнениях, некоторые из лучших чатов для этого находятся в Julialang Slack . Является ли это языком, который вы должны выучить, это личный вопрос, и является ли это правильным языком для вашего проекта, это технический вопрос, и это разные. Но разве это язык, который созрел и пользуется поддержкой большой последовательной группы разработчиков? Это кажется утвердительным да.