Julia, tại thời điểm này (tháng 5 năm 2019, Julia v1.1 với v1.2 sắp ra mắt) khá trưởng thành cho điện toán khoa học. Bản phát hành v1.0 biểu thị sự phá vỡ mã hàng năm . Cùng với đó, rất nhiều thư viện máy tính khoa học đã có thời gian đơn giản phát triển mà không bị gián đoạn. Tổng quan về các gói Julia có thể được tìm thấy tại pkg.julialang.org .
Đối với máy tính khoa học cốt lõi, các DifferentialEquations.jl thư viện cho phương trình vi phân (ODEs, SDEs, mô phỏng DAEs, DDEs, Gillespie, vv), Flux.jl cho các mạng thần kinh, và nhảy thư viện cho lập trình toán học (tối ưu hóa: tuyến tính, bậc hai, số nguyên hỗn hợp, vv lập trình) là ba trong số các nền tảng của hệ sinh thái điện toán khoa học. Thư viện phương trình vi phân nói riêng phát triển hơn nhiều so với những gì bạn thấy trong các ngôn ngữ khác, với một nhóm phát triển lớn thực hiện các tính năng như tích hợp EPIRK , Runge-Kutta-Nystrom , phương trình vi phân trì hoãn Stiff / vi sai-đại số vàCác nhà tích hợp phương trình vi phân ngẫu nhiên cứng thời gian thích ứng , cùng với một loạt các tính năng khác như phân tích độ nhạy của sự điều chỉnh , DSL phản ứng hóa học , Newton-Krylov không có ma trận và khả năng tương thích GPU đầy đủ (miễn phí truyền dữ liệu), với việc đào tạo các phương trình vi phân thần kinh , tất cả đều có kết quả điểm chuẩn tuyệt vời (từ chối trách nhiệm: Tôi là nhà phát triển chính).
Điều có một chút suy nghĩ về hệ sinh thái Julia trưởng thành là khả năng kết hợp của nó. Về cơ bản, khi ai đó xây dựng một hàm thư viện chung giống như các hàm trong differentialEquations.jl, bạn có thể sử dụng bất kỳ loại Tóm tắt / Số nào để tạo mã mới một cách nhanh chóng. Vì vậy, ví dụ, có một thư viện để truyền lỗi ( Methurements.jl ) và khi bạn dán nó vào bộ giải ODE, nó sẽ tự động biên dịch một phiên bản mới của bộ giải ODE thực hiện lan truyền lỗi mà không cần lấy mẫu tham số . Do đó, bạn có thể không tìm thấy một số tính năng được ghi lại vì mã cho các tính năng tự tạo và do đó bạn cần suy nghĩ thêm về thành phần thư viện.
Một trong những cách mà thành phần hữu ích nhất là trong đại số tuyến tính. Ví dụ, bộ giải ODE cho phép bạn chỉ định jac_prototype
, cho phép bạn cung cấp loại cho Jacobian sẽ được sử dụng nội bộ. Tất nhiên có những thứ trong thư viện tiêu chuẩn LineraAlgebra như Symmetric
và Tridiagonal
bạn có thể sử dụng ở đây, nhưng được cung cấp tiện ích về khả năng kết hợp trong các thuật toán chung loại, giờ đây mọi người đã đi và xây dựng toàn bộ thư viện kiểu mảng. BandedMatrices.jl và BlockBandedMatrices.jl là các thư viện xác định các loại ma trận dải (Block) có lu
quá tải nhanh , làm cho chúng trở thành một cách hay để tăng tốc độ giải quyết MOL cứng của các hệ phương trình vi phân từng phần. PDMats.jlcho phép đặc tả các ma trận xác định dương. Elemental.jl cho phép bạn xác định một Jacobian thưa thớt phân tán. CuArrays.jl định nghĩa các mảng trên GPU. Vân vân.
Sau đó, bạn có tất cả các loại số của bạn. Unitful.jl thực hiện kiểm tra đơn vị tại thời gian biên dịch để nó là thư viện đơn vị không có phí. DoubleFloats.jl là một thư viện có độ chính xác cao nhanh hơn, cùng với Quadmath.jl và ArbFloats.jl . ForwardDiff.jl là một thư viện để phân biệt tự động ở chế độ chuyển tiếp sử dụng số học số kép. Và tôi có thể tiếp tục liệt kê những thứ này ra. Và vâng, bạn có thể ném chúng vào các thư viện Julia đủ chung chung như differentialEquations.jl để biên dịch một phiên bản được tối ưu hóa cụ thể cho các loại số này. Thậm chí một cái gì đó giống như ApproxFun.jlcó chức năng như các đối tượng đại số (như Chebfun) hoạt động với hệ thống chung này, cho phép đặc tả các PDE dưới dạng ODE trên vô hướng trong một không gian hàm.
Với những lợi thế của khả năng kết hợp và cách các loại có thể được sử dụng để tạo mã mới và hiệu quả cho các hàm Julia chung, đã có rất nhiều công việc để triển khai chức năng tính toán khoa học cốt lõi vào Julia thuần túy. Optim.jl để tối ưu hóa phi tuyến, NLsolve.jl để giải quyết các hệ thống phi tuyến, IterativeSolvers.jl cho người giải quyết lặp đi lặp lại của các hệ thống tuyến tính và eigensystems, BlackBoxOptim.jl để tối ưu hóa hộp đen, vv Ngay cả thư viện mạng nơron Flux.jl chỉ sử dụng CuArrays. jl tự động biên dịch mã cho GPU cho các khả năng của GPU. Khả năng kết hợp này là cốt lõi của những thứ đã tạo ra những thứ như phương trình vi phân thần kinh trong DiffEqFlux.jl. Các ngôn ngữ lập trình xác suất như Turing.jl hiện cũng khá hoàn thiện và sử dụng cùng một công cụ cơ bản.
Vì các thư viện của Julia về cơ bản dựa trên các công cụ tạo mã, nên không có gì ngạc nhiên khi có rất nhiều công cụ xung quanh việc tạo mã. Hệ thống phát sóng của Julia tạo ra các hạt nhân hợp nhất khi đang bị quá tải bởi các loại mảng để cung cấp rất nhiều tính năng được đề cập ở trên. CUDAnative.jl cho phép biên dịch mã Julia thành hạt nhân GPU. ModellingToolkit.jl tự động khử đường AST thành một hệ thống ký hiệu để chuyển đổi mã toán học. Cassette.jlcho phép bạn "thay thế" chức năng hiện có của người khác, sử dụng các quy tắc để thay đổi chức năng của họ trước thời gian biên dịch (ví dụ: thay đổi tất cả phân bổ mảng của họ sang phân bổ mảng tĩnh và chuyển hoạt động sang GPU). Đây là công cụ nâng cao hơn (tôi không hy vọng mọi người làm máy tính khoa học sẽ kiểm soát trực tiếp trình biên dịch), nhưng đây là cách mà rất nhiều công cụ thế hệ tiếp theo được xây dựng (hay đúng hơn là cách các tính năng tự viết).
Đối với song song, tôi đã đề cập đến GPU và Julia đã tích hợp tính năng đa luồng và phân tán . Đa luồng đọc của Julia sẽ sớm sử dụng kiến trúc thời gian chạy tác vụ song song (PARTR) cho phép lập lịch tự động cho đa luồng lồng nhau . Nếu bạn muốn sử dụng MPI, bạn chỉ có thể sử dụng MPI.jl . Và dĩ nhiên, cách dễ nhất để sử dụng tất cả là chỉ sử dụng một thiết lập kiểu AbstractArray để sử dụng tính song song trong các hoạt động của nó.
Julia cũng có hệ sinh thái cơ bản cơ bản mà bạn mong đợi về một ngôn ngữ có mục đích chung được sử dụng cho các ứng dụng khoa học. Nó có IDE Juno với trình gỡ lỗi tích hợp với các điểm dừng , nó có Plots.jl để tạo tất cả các loại cốt truyện. Rất nhiều công cụ cụ thể cũng rất hay, như Revise.jl tự động cập nhật các chức năng / thư viện của bạn khi lưu tệp. Bạn có DataFrames.jl , thư viện thống kê , v.v. Một trong những thư viện đẹp nhất thực sự là Distribut.jl cho phép bạn viết các thuật toán chung cho bản phân phối (ví dụ:rand(dist)
có một số lượng ngẫu nhiên của bất kỳ phân phối nào được thông qua) và có toàn bộ các phân phối đơn biến và đa biến (và tất nhiên công văn xảy ra vào thời gian biên dịch, làm cho tất cả nhanh như mã hóa một chức năng cụ thể cho phân phối). Có một loạt các công cụ xử lý dữ liệu , máy chủ web , vv bạn đặt tên cho nó. Tại thời điểm này, nó đủ trưởng thành rằng nếu có một điều khoa học cơ bản và bạn mong đợi nó tồn tại, bạn chỉ cần Google với .jl hoặc Julia và nó sẽ xuất hiện.
Sau đó, có một vài điều cần ghi nhớ trên đường chân trời. GóiCompiler đang tìm cách xây dựng nhị phân từ các thư viện Julia và nó đã có một số thành công nhưng cần phát triển hơn. Makie.jl là toàn bộ thư viện cho âm mưu tăng tốc GPU với tính tương tác và nó vẫn cần thêm một số công việc nhưng nó thực sự mong muốn trở thành thư viện âm mưu chính trong Julia. Zygote.jl là một thư viện phân biệt tự động nguồn-nguồn không có vấn đề về hiệu năng của một AD dựa trên dấu vết (Flux's Tracker, PyTorch, Jax) và đang tìm cách hoạt động trên tất cả các mã Julia thuần túy. Vân vân.
Tóm lại, bạn có thể tìm thấy rất nhiều chuyển động ở rất nhiều nơi, nhưng ở hầu hết các khu vực đã có một thư viện trưởng thành vững chắc. Nó không còn ở một nơi mà bạn hỏi "nó sẽ được thông qua chứ?": Julia đã được nhận bởi đủ người (hàng triệu lượt tải xuống) mà nó có động lực để tồn tại mãi mãi. Nó có một cộng đồng thực sự tốt đẹp, vì vậy nếu bạn chỉ muốn chụp ảnh và nói về điện toán song song hoặc phương trình vi phân số, một số phòng trò chuyện tốt nhất dành cho Julialang Slack . Cho dù đó là ngôn ngữ bạn nên học là một câu hỏi cá nhân và liệu đó có phải là ngôn ngữ phù hợp cho dự án của bạn hay không là một câu hỏi kỹ thuật, và đó là những ngôn ngữ khác nhau. Nhưng nó có phải là một ngôn ngữ đã trưởng thành và có sự hỗ trợ của một nhóm lớn các nhà phát triển nhất quán không? Đó dường như là một khẳng định có.