Apa Julia? Pendekatan baru untuk komputasi numerik

Julia adalah bahasa pemrograman dinamis sumber terbuka, tingkat tinggi, berkinerja tinggi, dan gratis untuk komputasi numerik. Ini memiliki kenyamanan pengembangan bahasa dinamis dengan kinerja bahasa yang diketik secara statis terkompilasi, sebagian berkat JIT-compiler berdasarkan LLVM yang menghasilkan kode mesin asli, dan sebagian untuk desain yang mengimplementasikan stabilitas jenis melalui spesialisasi melalui beberapa dispatch, yang membuatnya mudah untuk dikompilasi menjadi kode yang efisien.

Dalam entri blog yang mengumumkan perilisan awal Julia pada 2012, penulis bahasanya — Jeff Bezanson, Stefan Karpinski, Viral Shah, dan Alan Edelman — menyatakan bahwa mereka menghabiskan waktu tiga tahun untuk membuat Julia karena mereka rakus . Mereka bosan dengan pertukaran antara Matlab, Lisp, Python, Ruby, Perl, Mathematica, R, dan C, dan menginginkan satu bahasa yang akan bagus untuk komputasi ilmiah, pembelajaran mesin, penambangan data, aljabar linier skala besar , komputasi paralel, dan komputasi terdistribusi.

Untuk siapa Julia? Selain menarik bagi ilmuwan dan insinyur riset, Julia juga menarik bagi ilmuwan data dan analis keuangan serta quants.

Perancang bahasa dan dua lainnya mendirikan Julia Computing pada Juli 2015 untuk "mengembangkan produk yang membuat Julia mudah digunakan, mudah diterapkan, dan mudah diskalakan". Saat tulisan ini dibuat, perusahaan memiliki 28 staf dan pelanggan mulai dari laboratorium nasional hingga bank hingga ekonom hingga peneliti kendaraan otonom. Selain mempertahankan repositori open source Julia di GitHub, Julia Computing menawarkan produk komersial, termasuk JuliaPro, yang tersedia dalam versi gratis dan berbayar.

Mengapa Julia?

Julia "bertujuan untuk menciptakan kombinasi yang belum pernah terjadi sebelumnya antara kemudahan penggunaan, daya, dan efisiensi dalam satu bahasa." Untuk masalah efisiensi, perhatikan grafik di bawah ini:

Julia Computing

Tolok ukur Julia

Apa yang kami lihat di sini adalah bahwa kode Julia bisa lebih cepat daripada C untuk beberapa jenis operasi, dan tidak lebih dari beberapa kali lebih lambat dari C untuk yang lain. Bandingkan dengan, katakanlah, R, yang bisa hampir 1.000 kali lebih lambat dari C untuk beberapa operasi.

Perhatikan bahwa salah satu tes paling lambat untuk Julia adalah rekursi Fibonacci; Itu karena Julia saat ini tidak memiliki pengoptimalan rekursi ekor. Rekursi secara inheren lebih lambat daripada perulangan. Untuk program Julia nyata yang ingin Anda jalankan dalam produksi, Anda akan ingin mengimplementasikan bentuk loop (iterasi) dari algoritme tersebut.

Kompilasi Julia JIT

Pendekatan compiler JIT (just-in-time) dikenai biaya dibandingkan dengan interpreter murni: Compiler harus mengurai kode sumber dan membuat kode mesin sebelum kode Anda dapat dijalankan. Itu bisa berarti waktu start-up yang nyata untuk program Julia saat pertama kali setiap fungsi dan makro berjalan dalam satu sesi. Jadi, pada tangkapan layar di bawah, kita melihat bahwa kedua kalinya kita menghasilkan satu juta angka floating point acak, waktu yang dibutuhkan adalah urutan besarnya kurang dari pada eksekusi pertama. Baik @timemakro dan rand()fungsi yang dibutuhkan untuk dikompilasi pertama kalinya melalui kode, karena perpustakaan Julia ditulis dalam Julia.

julia> @time rand (10 ^ 6);

  0,62081 detik (alokasi 14,44 k: 8,415 MiB)

julia> @time rand (10 ^ 6);

  0,004881 detik (7 alokasi: 7,630 MiB)

Penggemar Julia mengklaim, dengan beragam, bahwa ia memiliki kemudahan penggunaan Python, R, atau bahkan Matlab. Perbandingan ini patut dicermati, karena bahasa Julia elegan, kuat, dan berorientasi pada komputasi ilmiah, dan perpustakaan menyediakan berbagai fungsi pemrograman tingkat lanjut.

Contoh Julia

Sebagai contoh cepat bahasa Julia, pertimbangkan kode patokan set Mandelbrot berikut:

Seperti yang Anda lihat, aritmatika bilangan kompleks dibangun ke dalam bahasa, seperti juga makro untuk pengujian dan pengaturan waktu. Seperti yang juga Anda lihat, tanda titik koma yang mengganggu bahasa mirip C, dan tanda kurung bersarang yang mengganggu bahasa mirip Lisp, tidak ada di Julia. Perhatikan bahwa mandelperf()dipanggil dua kali, pada baris 61 dan 62. Panggilan pertama menguji kebenaran hasil dan melakukan kompilasi JIT; panggilan kedua mendapatkan waktunya.

Pemrograman Julia

Julia memiliki banyak fitur lain yang patut disebutkan. Untuk satu, tipe yang ditentukan pengguna secepat dan kompak seperti built-in. Nyatanya, Anda bisa mendeklarasikan tipe abstrak yang berperilaku seperti tipe generik, kecuali tipe tersebut dikompilasi untuk tipe argumen yang diteruskan.

Di sisi lain, vektorisasi kode bawaan Julia berarti bahwa programmer tidak perlu melakukan vektorisasi kode untuk kinerja; kode devektorisasi biasa cepat. Kompiler dapat memanfaatkan instruksi dan register SIMD jika ada pada CPU yang mendasarinya, dan membuka gulungan loop dalam proses berurutan untuk memvektoralnya sebanyak yang dimungkinkan oleh perangkat keras. Anda dapat menandai loop sebagai dapat di-vektorisasi dengan @simdanotasi.

Paralelisme Julia

Julia juga dirancang untuk paralelisme dan komputasi terdistribusi, menggunakan dua primitif: referensi jarak jauh dan panggilan jarak jauh. Referensi jarak jauh hadir dalam dua bentuk:  Future dan  RemoteChannel. A Futuresetara dengan JavaScript promise; a RemoteChanneldapat ditulis ulang dan dapat digunakan untuk komunikasi antar proses, seperti Unix pipeatau Go channel. Dengan asumsi bahwa Anda sudah mulai Julia dengan beberapa proses (misalnya julia -p 8untuk CPU delapan inti seperti prosesor Intel Core i7), Anda bisa @spawnatau remotecall()fungsi panggilan untuk mengeksekusi pada proses Julia lain asynchronous, dan kemudian fetch()yang Futuredikembalikan ketika Anda ingin sinkronisasi dan menggunakan hasil.

Jika Anda tidak perlu menjalankan banyak core, Anda dapat menggunakan threading "hijau" ringan, yang disebut a Task()in Julia dan coroutine dalam beberapa bahasa lain. A Task()atau @taskbekerja bersama dengan a Channel, yang merupakan versi proses tunggal RemoteChannel.

Sistem tipe Julia

Julia memiliki sistem tipe yang tidak mengganggu namun kuat yang dinamis dengan inferensi tipe run-time secara default, tetapi memungkinkan untuk anotasi tipe opsional. Ini mirip dengan TypeScript. Sebagai contoh:

julia> (1 + 2) :: AbstractFloat

ERROR: TypeError: typeassert: expected AbstractFloat, mendapatkan Int64

julia> (1 + 2) :: Int

3

Di sini kami menegaskan jenis yang tidak kompatibel untuk pertama kalinya, menyebabkan kesalahan, dan jenis yang kompatibel untuk kedua kalinya.

String Julia

Julia memiliki dukungan yang efisien untuk string dan karakter Unicode, disimpan dalam format UTF-8, serta dukungan yang efisien untuk karakter ASCII, karena dalam UTF-8 titik kode kurang dari 0x80 (128) dikodekan dalam satu karakter. Jika tidak, UTF-8 adalah pengkodean panjang variabel, jadi Anda tidak dapat mengasumsikan bahwa panjang string Julia sama dengan indeks karakter terakhir.

Dukungan penuh untuk UTF-8 berarti, antara lain, Anda dapat dengan mudah menetapkan variabel menggunakan huruf Yunani, yang dapat membuat kode Julia ilmiah terlihat sangat mirip dengan penjelasan rumus di buku teks, misalnya sin(2π). Sebuah transcode()fungsi disediakan untuk mengonversi UTF-8 ke dan dari pengkodean Unicode lainnya.

Fungsi C dan Fortran

Julia dapat memanggil fungsi C dan Fortran secara langsung, tanpa perlu pembungkus atau API khusus, meskipun Anda memang perlu mengetahui nama fungsi "yang didekorasi" yang dikeluarkan oleh compiler Fortran. Fungsi C atau Fortran eksternal harus ada di perpustakaan bersama; Anda menggunakan ccall()fungsi Julia untuk pemanggilan sebenarnya. Misalnya, pada sistem mirip Unix Anda dapat menggunakan kode Julia ini untuk mendapatkan nilai variabel lingkungan menggunakan getenvfungsi di libc:

function getenv (var :: AbstractString)

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

                 Cstring, (Cstring,), var)

     jika val == C_NULL

         error ("getenv: variabel tidak terdefinisi:", var)

     akhir

     unsafe_string (val)

akhir

julia> getenv ("SHELL")

"/ bin / bash"

Julia makro

Julia memiliki makro mirip Lisp, yang dibedakan dari praprosesor makro yang digunakan oleh C dan C ++. Julia juga memiliki fasilitas meta-pemrograman lainnya, seperti refleksi, pembuatan kode, simbol (misalnya :foo) dan ekspresi (misalnya :(a+b*c+1)) objek eval(), dan fungsi yang dihasilkan. Makro Julia dievaluasi pada waktu penguraian.

Fungsi yang dihasilkan, sebaliknya, akan diperluas ketika jenis parameternya diketahui, sebelum kompilasi fungsi. Fungsi yang dihasilkan memiliki fleksibilitas fungsi generik (seperti yang diterapkan di C ++ dan Java) dan efisiensi fungsi yang diketik dengan kuat, dengan menghilangkan kebutuhan pengiriman run-time untuk mendukung polimorfisme parametrik.

Dukungan GPU

Julia memiliki dukungan GPU yang menggunakan, antara lain, paket pembelajaran mendalam MXNet, pustaka array GPU ArrayFire, aljabar linier cuBLAS dan cuDNN, dan pustaka jaringan neural dalam, serta kerangka kerja CUDA untuk komputasi GPU tujuan umum. Bungkus Julia dan perpustakaannya masing-masing ditunjukkan pada diagram di bawah ini.

Julia Computing

JuliaPro dan Juno IDE

Anda dapat mengunduh baris perintah Julia open source gratis untuk Windows, MacOS, Linux generik, atau FreeBSD generik dari situs bahasa Julia. Anda dapat mengkloning repositori kode sumber Julia dari GitHub.

Atau Anda dapat mengunduh JuliaPro dari Julia Computing. Selain kompiler, JuliaPro memberi Anda Juno IDE berbasis Atom (ditampilkan di bawah) dan lebih dari 160 paket yang dikurasi, termasuk visualisasi dan plot.

Selain apa yang ada di JuliaPro gratis, Anda dapat menambahkan langganan untuk dukungan perusahaan, fungsionalitas keuangan kuantitatif, dukungan database, dan analisis deret waktu. JuliaRun adalah server yang dapat diskalakan untuk cluster atau cloud.

Notebook Jupyter dan IJulia

Selain menggunakan Juno sebagai Julia IDE Anda, Anda dapat menggunakan Visual Studio Code dengan ekstensi Julia (ditampilkan langsung di bawah), dan notebook Jupyter dengan kernel IJulia (ditampilkan di screenshot kedua dan ketiga di bawah). Anda mungkin perlu menginstal notebook Jupyter untuk Python 2 atau (lebih disukai) Python 3 dengan Anaconda atau pip.

JuliaBox

Anda dapat menjalankan Julia di notebook Jupyter secara online menggunakan JuliaBox (ditampilkan di bawah), produk lain dari Julia Computing, tanpa melakukan instalasi apa pun di komputer lokal Anda. JuliaBox saat ini menyertakan lebih dari 300 paket, menjalankan Julia 0.6.2, dan berisi lusinan buku catatan Jupyter tutorial. Daftar folder tutorial tingkat atas ditunjukkan di bawah ini. Tingkat akses gratis JuliaBox memberi Anda sesi 90 menit dengan tiga inti CPU; langganan pribadi $ 14 per bulan memberi Anda sesi empat jam dengan lima inti; dan langganan pro $ 70 per bulan memberi Anda sesi delapan jam dengan 32 core. Akses GPU belum tersedia mulai Juni 2018.

Paket Julia

Julia “berjalan seperti Python, tapi berlari seperti C.” Seperti yang rekan saya Serdar Yegulalp tulis pada Desember 2017, Julia mulai menantang Python untuk pemrograman ilmu data, dan kedua bahasa tersebut memiliki kelebihan. Sebagai indikasi semakin matangnya dukungan ilmu data di Julia, pertimbangkan bahwa sudah ada dua buku berjudul Julia untuk Ilmu Data , satu oleh Zacharias Voulgaris, dan yang lainnya oleh Anshul Joshi, meskipun saya tidak dapat berbicara tentang kualitas keduanya. satu.

Jika Anda melihat keseluruhan paket Julia berperingkat tertinggi dari Julia Observer, yang ditunjukkan di bawah ini, Anda akan melihat kernel Julia untuk notebook Jupyter, paket grafis Gadfly (mirip dengan ggplot2di R), antarmuka plotting generik, beberapa pembelajaran mendalam dan mesin paket pembelajaran, pemecah persamaan diferensial, DataFrames, model dynamic stochastic general equilibrium (DSGE) New York Fed, bahasa pemodelan pengoptimalan, dan antarmuka ke Python dan C ++. Jika Anda melangkah lebih jauh ke bawah daftar umum ini, Anda juga akan menemukan QuantEcon, PyPlot, ScikitLearn, paket bioinformatika, dan implementasi daftar malas untuk pemrograman fungsional.

Jika paket Julia tidak mencukupi kebutuhan Anda, dan antarmuka Python tidak membawa Anda ke tempat yang Anda inginkan, Anda juga dapat menginstal paket yang memberi Anda antarmuka umum ke R (RCall) dan Matlab.

Julia untuk analis keuangan dan quants

Quant dan analis keuangan akan menemukan banyak paket gratis untuk mempercepat pekerjaan mereka, seperti yang ditunjukkan pada gambar di bawah. Selain itu, Julia Computing menawarkan suite JuliaFin, yang terdiri dari Miletus (DSL untuk kontrak keuangan),  JuliaDB (database dalam memori dan terdistribusi berkinerja tinggi),  JuliaInXL (hubungi Julia dari lembar Excel), dan  konektivitas Bloomberg (akses ke real -waktu dan data pasar historis).