Julia는이 시점 (2019 년 5 월, v1.2가 출시 될 Julia v1.1)이 과학 컴퓨팅에 매우 적합합니다. v1.0 릴리스 는 연간 코드 중단으로 끝났다 . 이를 통해 많은 과학적 컴퓨팅 라이브러리가 중단없이 단순히 성장할 시간이있었습니다. Julia 패키지에 대한 광범위한 개요는 pkg.julialang.org 에서 찾을 수 있습니다 .
코어 과학 컴퓨팅 들어 DifferentialEquations.jl의 미분 방정식 (미분 방정식, SDES, DAE에, DDEs, 길레스피 시뮬레이션 등)을위한 라이브러리 Flux.jl 신경망 및 점프 수학적 프로그래밍 (최적화 라이브러리 : 선형, 이차, 혼합 정수 등 프로그래밍)은 과학 컴퓨팅 생태계의 세 가지 초석입니다. 특히 EPIRK 적분기 , Runge-Kutta-Nystrom , Stiff / Differential-Algebraic 지연 미분 방정식 등의 기능을 구현하는 대규모 개발 팀과 함께 미분 방정식 라이브러리는 다른 언어에서 볼 수있는 것보다 훨씬 더 개발되었습니다.적응 시간 강성 확률 론적 미분 방정식 적분기와 함께 인접 감도 분석 , 화학 반응 DSL , 행렬이없는 뉴턴-크릴 로프, 완전한 (데이터 전송이없는) GPU 호환성, 신경 미분 방정식의 훈련 과 함께 환상적인 벤치 마크 결과 (면책 조항 : 저는 수석 개발자입니다).
성숙 된 Julia 생태계에 대해 약간 염려하는 것은 그 호환성입니다. 기본적으로 누군가 누군가 DifferentialEquations.jl에있는 것과 같은 일반 라이브러리 함수를 작성할 때 모든 AbstractArray / Number 유형을 사용하여 새 코드를 즉시 생성 할 수 있습니다. 예를 들어, 오류 전파 라이브러리 ( Measurements.jl )가 있으며이를 ODE 솔버에 고정하면 매개 변수 샘플링없이 오류 전파를 수행 하는 새 버전의 ODE 솔버 가 자동으로 컴파일됩니다 . 이로 인해 기능 코드가 자체 생성되므로 라이브러리 기능에 대해 더 많이 생각해야하므로 일부 기능이 문서화되어 있지 않을 수 있습니다.
구성이 가장 유용한 방법 중 하나는 선형 대수학입니다. 예를 들어 ODE 솔버를 사용하면 jac_prototype
내부적으로 사용될 Jacobian에 대한 유형 을 지정할 수 있도록을 지정할 수 있습니다. 물론 물건을 거기에 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 은 이중 숫자 산술을 사용하는 순방향 모드 자동 차별화를위한 라이브러리입니다. 그리고 나는 이것을 계속 나열 할 수 있습니다. 그리고 예, DifferentialEquations.jl과 같은 충분히 일반적인 Julia 라이브러리에 넣어 이러한 숫자 유형에 맞게 특별히 최적화 된 버전을 컴파일 할 수 있습니다. ApproxFun.jl 와 같은 것 조차Chebfun과 같은 대수 객체로 기능하는이 일반 시스템에서 작동하므로 함수 공간의 스칼라에서 PDE를 ODE로 지정할 수 있습니다.
호환성의 장점과 유형이 일반적인 Julia 함수에서 새롭고 효율적인 코드를 생성하는 데 사용할 수있는 방법을 고려할 때 핵심 과학 컴퓨팅 기능을 순수한 Julia로 구현하기위한 많은 작업이있었습니다. Optim.jl 비선형 최적화는 NLsolve.jl는 비선형를 해결하기위한, IterativeSolvers.jl는 선형 시스템 eigensystems의 반복 해법 들어 BlackBoxOptim.jl는 블랙 박스 최적화 등과도 신경망 라이브러리 Flux.jl는 단지 CuArrays를 이용한다. GPU의 기능을 위해 GPU에 대한 코드의 자동 컴파일. 이 호환성은 DiffEqFlux.jl에서 신경 미분 방정식 과 같은 것을 생성 한 핵심 이었습니다.. Turing.jl 과 같은 확률 적 프로그래밍 언어 도 이제는 매우 성숙하고 동일한 기본 툴링을 사용합니다.
Julia의 라이브러리는 기본적으로 코드 생성 도구를 기반으로하기 때문에 코드 생성과 관련하여 많은 도구가 있다는 것은 놀라운 일이 아닙니다. Julia의 브로드 캐스트 시스템 은 위에서 언급 한 많은 기능을 제공하기 위해 어레이 유형 에 의해 오버로드 된 융합 커널을 즉시 생성 합니다. CUDAnative.jl을 사용하면 Julia 코드를 GPU 커널로 컴파일 할 수 있습니다. ModelingToolkit.jl은 자동으로 AST를 수학 코드를 변환하기위한 상징적 시스템으로 추출합니다. 카세트 .jl규칙을 사용하여 컴파일 시간 전에 함수를 변경하는 규칙을 사용하여 다른 사람의 기존 함수를 "더빙"할 수 있습니다 (예 : 모든 배열 할당을 정적 배열 할당으로 변경하고 GPU로 작업 이동). 이것은 고급 도구입니다 (과학 컴퓨팅을하는 모든 사람들이 컴파일러를 직접 제어 할 것으로 기대하지는 않습니다). 그러나 이것은 많은 차세대 도구가 작성되는 방법 (또는 기능 자체 작성 방법)입니다.
병렬 처리에 관해서는 GPU를 언급했으며 Julia는 내장 멀티 스레딩 및 분산 컴퓨팅을 제공 합니다. Julia의 멀티 스레딩은 곧 병렬 작업 런타임 (PARTR) 아키텍처를 사용하여 중첩 된 멀티 스레딩의 자동 스케줄링을 가능하게합니다 . MPI를 사용하려면 MPI.jl을 사용 하면 됩니다. 물론 모든 것을 사용하는 가장 쉬운 방법은 AbstractArray 유형 설정을 사용하여 작업에서 병렬 처리를 사용하는 것입니다.
Julia는 또한 과학 응용 프로그램에 사용되는 범용 언어를 기대할 수있는 기본적인 기본 에코 시스템을 보유하고 있습니다. 그것은이 주노 IDE A를 중단 점과 내장 디버거 , 그것은이 Plots.jl를 플롯의 모든 종류를 만들기위한. Revise.jl 이 파일을 저장할 때 함수 / 라이브러리를 자동으로 업데이트하는 것과 같이 많은 특정 도구도 유용 합니다. 당신은 당신이 DataFrames.jl , 통계 라이브러리 등 가장 좋은 라이브러리 중 하나는 실제로 Distributions.jl 당신은 예를 들어 분포 (제네릭 알고리즘을 작성할 수 있습니다 :rand(dist)
임의의 분포가 전달 된 임의의 수를 취하고 일 변량 및 다변량 분포의 전체로드가 있습니다 (물론 디스패치는 컴파일 타임에 발생하므로 분포에 특정한 함수를 하드 코딩하는 것만 큼 빠릅니다). 이름을 지정 하는 많은 데이터 처리 툴링 , 웹 서버 등이 있습니다. 이 시점에서 기본적인 과학적인 것이 있고 그것이 존재하기를 기대한다면 .jl 또는 Julia를 사용하여 Google에 표시하면 나타날 것입니다.
그런 다음 수평선에 명심해야 할 것이 몇 가지 있습니다. PackageCompiler 는 Julia 라이브러리에서 바이너리를 빌드하려고 시도하고 있으며 이미 성공했지만 더 많은 개발이 필요합니다. Makie.jl 은 대화 형 기능이있는 GPU 가속 플로팅을위한 전체 라이브러리이며 여전히 더 많은 작업이 필요하지만 Julia의 기본 플로팅 라이브러리가 되고자합니다. Zygote.jl 은 추적 기반 AD (Flux 's Tracker, PyTorch, Jax)의 성능 문제가없고 모든 순수 Julia 코드에서 작동하는 소스-소스 자동 차별화 라이브러리입니다. 기타.
결론적으로 많은 곳에서 많은 움직임을 찾을 수 있지만 대부분의 지역에는 이미 성숙 된 도서관이 있습니다. 더 이상 "어떻게 채택 할 것인가?"라는 질문을받는 곳이 아닙니다. 줄리아는 충분한 사람들 (수백만 다운로드)에 의해 입양되어 좋은 상태를 유지하기위한 추진력이 있습니다. 정말 멋진 커뮤니티가 있으므로 바람을 parallel 고 병렬 컴퓨팅 또는 수치 미분 방정식에 대해 이야기하고 싶다면 Julialang Slack 에 가장 적합한 대화방이 있습니다 . 학습해야 할 언어인지 여부는 개인적인 질문이며, 프로젝트에 적합한 언어인지는 기술적 인 문제이며 다른 것입니다. 그러나 언어가 성숙하고 일관된 대규모 개발자 그룹의 지원을받는 언어입니까? 그것은 긍정적 인 예인 것 같습니다.