Apa itu Julia? Pendekatan baru untuk pengkomputeran berangka

Julia adalah bahasa pengaturcaraan sumber terbuka, tahap tinggi, prestasi tinggi, dinamik percuma untuk pengkomputeran berangka. Ini memiliki kemudahan pengembangan bahasa yang dinamis dengan prestasi bahasa yang ditaip secara statik yang disusun, terima kasih sebahagiannya untuk penyusun JIT berdasarkan LLVM yang menghasilkan kod mesin asli, dan sebahagiannya untuk reka bentuk yang menerapkan kestabilan jenis melalui pengkhususan melalui beberapa penghantaran, yang memudahkan penyusunan kod yang cekap.

Dalam catatan blog yang mengumumkan pembebasan awal Julia pada tahun 2012, pengarang bahasa itu — Jeff Bezanson, Stefan Karpinski, Viral Shah, dan Alan Edelman — menyatakan bahawa mereka menghabiskan tiga tahun untuk mencipta Julia kerana mereka tamak . Mereka bosan dengan pertukaran antara Matlab, Lisp, Python, Ruby, Perl, Mathematica, R, dan C, dan menginginkan satu bahasa yang baik untuk pengkomputeran saintifik, pembelajaran mesin, perlombongan data, aljabar linear skala besar , pengkomputeran selari, dan pengkomputeran diedarkan.

Untuk siapa Julia? Selain menarik bagi saintis dan jurutera penyelidikan, Julia juga menarik bagi saintis data dan penganalisis kewangan dan jumlah.

Pereka bahasa dan dua yang lain mengasaskan Julia Computing pada bulan Julai 2015 untuk "mengembangkan produk yang menjadikan Julia mudah digunakan, mudah digunakan, dan mudah dibuat skala." Pada penulisan ini, syarikat ini mempunyai kakitangan seramai 28 orang dan pelanggan mulai dari makmal nasional hingga bank hingga ahli ekonomi hingga penyelidik kenderaan autonomi. Selain menjaga repositori sumber terbuka Julia di GitHub, Julia Computing menawarkan produk komersial, termasuk JuliaPro, yang terdapat dalam versi percuma dan berbayar.

Kenapa Julia?

Julia "bertujuan untuk menciptakan kombinasi kemudahan, kekuatan, dan kecekapan yang belum pernah terjadi sebelumnya dalam satu bahasa." Untuk masalah kecekapan, pertimbangkan grafik di bawah:

Pengkomputeran Julia

Tanda aras Julia

Apa yang kita lihat di sini adalah bahawa kod Julia dapat lebih cepat daripada C untuk beberapa jenis operasi, dan tidak lebih dari beberapa kali lebih lambat daripada C untuk yang lain. Bandingkan dengan, katakanlah, R, yang hampir 1,000 kali lebih perlahan daripada C untuk beberapa operasi.

Perhatikan bahawa salah satu ujian paling lambat untuk Julia adalah rekursi Fibonacci; itu kerana Julia pada masa ini tidak mempunyai pengoptimuman pengulangan ekor. Kekambuhan secara semula jadi lebih perlahan daripada gelung. Untuk program Julia sebenar yang ingin anda jalankan dalam pengeluaran, anda pasti mahu melaksanakan bentuk gelung (lelaran) algoritma tersebut.

Penyusunan Julia JIT

Terdapat kos untuk pendekatan penyusun JIT (tepat pada waktunya) berbanding dengan jurubahasa yang murni: Pengompil harus menguraikan kod sumber dan menghasilkan kod mesin sebelum kod anda dapat dijalankan. Itu boleh bermakna masa permulaan yang ketara untuk program Julia pada kali pertama setiap fungsi dan makro dijalankan dalam satu sesi. Jadi, dalam tangkapan skrin di bawah, kita melihat bahawa kali kedua kita menghasilkan sejuta nombor titik terapung rawak, masa yang diambil adalah urutan besarnya kurang daripada pada pelaksanaan pertama. Kedua-dua @timemakro dan rand()fungsi perlu menyusun kali pertama melalui kod, kerana perpustakaan Julia ditulis dalam Julia.

julia> @time rand (10 ^ 6);

  0.62081 saat (peruntukan 14.44 k: 8.415 MiB)

julia> @time rand (10 ^ 6);

  0.004881 saat (7 peruntukan: 7.630 MiB)

Peminat Julia menyatakan, dengan cara yang berbeza, bahawa ia mempunyai kemudahan penggunaan Python, R, atau bahkan Matlab. Perbandingan ini perlu diteliti, kerana bahasa Julia elegan, kuat, dan berorientasi pada pengkomputeran saintifik, dan perpustakaan menyediakan pelbagai fungsi pengaturcaraan lanjutan.

Contoh Julia

Sebagai contoh bahasa Julia yang cepat, pertimbangkan kod penanda aras set Mandelbrot berikut:

Seperti yang anda lihat, aritmetik nombor kompleks dimasukkan ke dalam bahasa, begitu juga makro untuk ujian dan masa. Seperti yang anda lihat juga, titik koma akhir yang melanda bahasa seperti C, dan tanda kurung bersarang yang menyerang bahasa seperti Lisp, tidak ada di Julia. Perhatikan bahawa mandelperf()dipanggil dua kali, di baris 61 dan 62. Panggilan pertama menguji hasilnya untuk kebenaran dan melakukan penyusunan JIT; panggilan kedua mendapat masa.

Pengaturcaraan Julia

Julia mempunyai banyak ciri lain yang perlu disebut. Untuk satu, jenis yang ditentukan pengguna secepat dan padat seperti built-in. Sebenarnya, anda boleh menyatakan jenis abstrak yang berkelakuan seperti jenis generik, kecuali bahawa ia disusun untuk jenis argumen yang mereka lalui.

Untuk yang lain, vektorisasi kod terbina dalam Julia bermaksud bahawa tidak ada keperluan untuk pengaturcara untuk vektorisasi kod untuk prestasi; kod devectorized biasa cepat. Pengkompilasi dapat memanfaatkan arahan dan daftar SIMD jika terdapat pada CPU yang mendasari, dan membuka gelung dalam proses yang berurutan untuk membuat vektornya sebanyak yang dibenarkan oleh perkakasan. Anda boleh menandakan gelung sebagai vektor dengan @simdanotasi.

Selari Julia

Julia juga dirancang untuk keseimbangan dan pengiraan yang diedarkan, menggunakan dua primitif: rujukan jarak jauh dan panggilan jarak jauh. Rujukan jarak jauh terdapat dalam dua rasa:  Future dan  RemoteChannel. A Futureadalah setara dengan JavaScript promise; a RemoteChannelboleh ditulis semula dan boleh digunakan untuk komunikasi antara proses, seperti Unix pipeatau Go channel. Dengan mengandaikan bahawa anda telah mula Julia dengan pelbagai proses (contohnya julia -p 8dengan CPU lapan teras seperti i7 Intel Core), anda boleh @spawnatau remotecall()fungsi panggilan untuk melaksanakan proses Julia lain tak segerak, dan kemudian fetch()yang Futuredikembalikan apabila anda mahu untuk menyegerakkan dan menggunakan hasil.

Sekiranya anda tidak perlu menggunakan beberapa core, anda dapat menggunakan threading "hijau" ringan, disebut Task()di Julia dan coroutine dalam beberapa bahasa lain. A Task()atau @taskberfungsi bersama dengan a Channel, yang merupakan versi proses tunggal dari RemoteChannel.

Sistem jenis Julia

Julia mempunyai sistem jenis yang tidak mencolok namun kuat yang dinamik dengan inferensi jenis jangka masa secara lalai, tetapi memungkinkan untuk memberi anotasi jenis pilihan. Ini serupa dengan TypeScript. Sebagai contoh:

julia> (1 + 2) :: AbstractFloat

RALAT: TypeError: typeassert: dijangka AbstractFloat, mendapat Int64

julia> (1 + 2) :: Int

3

Di sini kami menegaskan jenis yang tidak sesuai pada kali pertama, menyebabkan ralat, dan jenis yang serasi untuk kali kedua.

Julia bertali

Julia mempunyai sokongan yang cekap untuk rentetan dan watak Unicode, disimpan dalam format UTF-8, serta sokongan yang cekap untuk watak ASCII, kerana dalam UTF-8 titik kod kurang dari 0x80 (128) dikodkan dalam satu karakter. Jika tidak, UTF-8 adalah pengekodan panjang berubah, jadi anda tidak boleh menganggap bahawa panjang tali Julia sama dengan indeks aksara terakhir.

Sokongan penuh untuk UTF-8 bermaksud, antara lain, bahawa anda dapat dengan mudah menentukan pemboleh ubah menggunakan huruf Yunani, yang dapat membuat kod Julia ilmiah sangat mirip dengan penjelasan buku teks mengenai formula, misalnya sin(2π). A transcode()fungsi disediakan untuk convert UTF-8 ke dan dari pengekodan Unicode lain.

Fungsi C dan Fortran

Julia dapat memanggil fungsi C dan Fortran secara langsung, tanpa pembungkus atau API khas yang diperlukan, walaupun anda perlu mengetahui nama fungsi "dihiasi" yang dipancarkan oleh penyusun Fortran. Fungsi C atau Fortran luaran mesti ada di perpustakaan bersama; anda menggunakan ccall()fungsi Julia untuk panggilan sebenar. Sebagai contoh, pada sistem seperti Unix, anda boleh menggunakan kod Julia ini untuk mendapatkan nilai pemboleh ubah persekitaran menggunakan getenvfungsi di libc:

fungsi getenv (var :: AbstractString)

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

                 Cstring, (Cstring,), var)

     jika val == C_NULL

         ralat ("getenv: undefined variabel:", var)

     akhir

     tidak selamat_string (val)

akhir

julia> getenv ("SHELL")

"/ bin / bash"

Makro Julia

Julia mempunyai makro seperti Lisp, seperti yang dibezakan dari praprosesor makro yang digunakan oleh C dan C ++. Julia juga mempunyai kemudahan meta-pengaturcaraan lain, seperti refleksi, penjanaan kod, simbol (misalnya :foo) dan ekspresi (misalnya :(a+b*c+1)) objek eval(), dan fungsi yang dihasilkan. Makro Julia dinilai pada masa penghuraian.

Fungsi yang dihasilkan, sebaliknya, diperluas apabila jenis parameternya diketahui, sebelum penyusunan fungsi. Fungsi yang dihasilkan mempunyai fleksibiliti fungsi generik (seperti yang dilaksanakan di C ++ dan Java) dan kecekapan fungsi yang ditaip dengan kuat, dengan menghilangkan keperluan pengiriman waktu berjalan untuk menyokong polimorfisme parametrik.

Sokongan GPU

Julia mempunyai sokongan GPU menggunakan, antara lain, pakej pembelajaran mendalam MXNet, perpustakaan array GPU ArrayFire, aljabar linier cuBLAS dan cuDNN dan perpustakaan rangkaian neural dalam, dan kerangka CUDA untuk pengkomputeran GPU tujuan umum. Pembungkus Julia dan perpustakaan masing-masing ditunjukkan dalam rajah di bawah.

Pengkomputeran Julia

JuliaPro dan Juno IDE

Anda boleh memuat turun baris arahan Julia sumber terbuka percuma untuk Windows, MacOS, Linux generik, atau FreeBSD generik dari laman bahasa Julia. Anda boleh mengklon repositori kod sumber Julia dari GitHub.

Sebagai alternatif anda boleh memuat turun JuliaPro dari Julia Computing. Sebagai tambahan kepada penyusun, JuliaPro memberi anda Juno IDE berasaskan Atom (ditunjukkan di bawah) dan lebih daripada 160 paket yang disusun, termasuk visualisasi dan plot.

Selain JuliaPro percuma, anda boleh menambahkan langganan untuk sokongan perusahaan, fungsi kewangan kuantitatif, sokongan pangkalan data, dan analisis siri masa. JuliaRun adalah pelayan berskala untuk kluster atau awan.

Buku nota Jupyter dan IJulia

Selain menggunakan Juno sebagai Julia IDE anda, anda dapat menggunakan Visual Studio Code dengan sambungan Julia (ditunjukkan langsung di bawah), dan buku nota Jupyter dengan kernel IJulia (ditunjukkan pada tangkapan skrin kedua dan ketiga di bawah). Anda mungkin perlu memasang buku nota Jupyter untuk Python 2 atau (lebih baik) Python 3 dengan Anaconda atau pip.

JuliaBox

Anda boleh menjalankan buku nota Julia di Jupyter secara dalam talian menggunakan JuliaBox (ditunjukkan di bawah), produk lain dari Julia Computing, tanpa melakukan pemasangan pada mesin tempatan anda. JuliaBox pada masa ini merangkumi lebih daripada 300 pakej, menjalankan Julia 0.6.2, dan mengandungi puluhan buku nota tutorial Jupyter. Senarai folder tutorial peringkat atas ditunjukkan di bawah. Tahap percuma JuliaBox memberi anda sesi 90 minit dengan tiga teras CPU; langganan peribadi $ 14 sebulan memberi anda sesi empat jam dengan lima teras; dan langganan pro $ 70 sebulan memberi anda sesi lapan jam dengan 32 teras. Akses GPU belum tersedia mulai Jun 2018.

Pakej Julia

Julia "berjalan seperti Python, tetapi berjalan seperti C." Seperti yang ditulis oleh rakan saya Serdar Yegulalp pada bulan Disember 2017, Julia mula mencabar Python untuk pengaturcaraan sains data, dan kedua-dua bahasa mempunyai kelebihan. Sebagai petunjuk sokongan yang cepat matang untuk sains data di Julia, pertimbangkan bahawa sudah ada dua buku berjudul Julia untuk Sains Data , satu karya Zacharias Voulgaris, dan satu lagi oleh Anshul Joshi, walaupun saya tidak dapat memahami kualiti kedua-duanya satu.

Sekiranya anda melihat keseluruhan pakej Julia dengan penilaian tertinggi dari Julia Observer, ditunjukkan di bawah, anda akan melihat kernel Julia untuk buku nota Jupyter, pakej grafik Gadfly (serupa dengan ggplot2R), antara muka plot generik, beberapa pembelajaran mendalam dan mesin pakej pembelajaran, pemecah persamaan pembezaan, DataFrames, model keseimbangan umum stokastik dinamik Fed New York (DSGE), bahasa pemodelan pengoptimuman, dan antara muka ke Python dan C ++. Sekiranya anda pergi jauh ke senarai umum ini, anda juga akan menemui QuantEcon, PyPlot, ScikitLearn, pakej bioinformatik, dan pelaksanaan senarai malas untuk pengaturcaraan berfungsi.

Sekiranya pakej Julia tidak mencukupi untuk keperluan anda, dan antara muka Python tidak membawa anda ke mana anda mahu pergi, anda juga boleh memasang pakej yang memberi anda antara muka generik ke R (RCall) dan Matlab.

Julia untuk penganalisis kewangan dan kuantiti

Quant dan penganalisis kewangan akan menemui banyak pakej percuma untuk mempercepat kerja mereka, seperti yang ditunjukkan dalam tangkapan skrin di bawah. Di samping itu, Julia Computing menawarkan suite JuliaFin, yang terdiri daripada Miletus (DSL untuk kontrak kewangan),  JuliaDB (pangkalan data dalam memori berprestasi tinggi dan diedarkan),  JuliaInXL (panggilan Julia dari helaian Excel), dan  penyambungan Bloomberg (akses ke sebenar -data pasaran masa dan sejarah).