Bahasa Pemrograman Julia 1.8 Rilis

Rilis bahasa pemrograman Julia 1.8 tersedia, menggabungkan kualitas seperti kinerja tinggi, dukungan untuk pengetikan dinamis dan alat bawaan untuk pemrograman paralel. Sintaks Julia mirip dengan MATLAB, meminjam beberapa elemen dari Ruby dan Lisp. Metode manipulasi string mengingatkan pada Perl. Kode proyek didistribusikan di bawah lisensi MIT.

Fitur utama bahasa:

  • Kinerja tinggi: salah satu tujuan utama proyek ini adalah mencapai kinerja yang mendekati program C. Kompiler Julia didasarkan pada proyek LLVM dan menghasilkan kode mesin asli yang efisien untuk banyak platform target;
  • Dukungan untuk berbagai paradigma pemrograman, termasuk elemen pemrograman berorientasi objek dan fungsional. Pustaka standar menyediakan, antara lain, fungsi untuk I/O asinkron, manajemen proses, logging, pembuatan profil, dan manajemen paket;
  • Pengetikan dinamis: bahasa tidak memerlukan definisi tipe variabel secara eksplisit, dengan analogi dengan bahasa pemrograman scripting. Mendukung mode interaktif;
  • Kemampuan opsional untuk menentukan jenis secara eksplisit;
  • Sintaks yang sangat baik untuk kalkulasi numerik, kalkulasi ilmiah, sistem pembelajaran mesin, dan visualisasi data. Dukungan untuk banyak tipe data numerik dan alat untuk memparalelkan perhitungan.
  • Kemampuan untuk langsung memanggil fungsi dari pustaka C tanpa lapisan tambahan.

Perubahan besar di Julia 1.8:

  • Fitur bahasa baru
    • Bidang dari struct yang dapat diubah sekarang dapat dianotasi sebagai konstanta untuk mencegahnya diubah dan memungkinkan pengoptimalan.
    • Anotasi tipe dapat ditambahkan ke variabel global.
    • Array n-dimensi kosong dapat dibuat menggunakan beberapa titik koma di dalam tanda kurung siku, misalnya "[;;;]" membuat array 0x0x0.
    • Blok try sekarang secara opsional dapat memiliki blok else, yang dieksekusi segera setelah isi utama jika tidak ada kesalahan yang terjadi.
    • @inline dan @noinline dapat ditempatkan di dalam badan fungsi, memungkinkan Anda memberi anotasi pada fungsi anonim.
    • @inline dan @noinline sekarang dapat diterapkan ke fungsi di situs panggilan atau blok untuk memaksa panggilan fungsi terkait untuk disertakan (atau tidak disertakan).
    • βˆ€, βˆƒ dan βˆ„ diperbolehkan sebagai karakter pengenal.
    • Menambahkan dukungan untuk spesifikasi Unicode 14.0.0.
    • Metode Module(:name, false, false) dapat digunakan untuk membuat modul yang tidak berisi nama, tidak mengimpor Base atau Core, dan tidak berisi referensi ke modul itu sendiri.
  • Perubahan bahasa
    • Objek Tugas yang baru dibuat (@spawn, @async, dll.) kini memiliki world_age untuk metode dari Tugas induk saat dibuat, sehingga memungkinkan eksekusi yang dioptimalkan. Opsi aktivasi sebelumnya tersedia menggunakan metode Base.invokelatest.
    • Arahan pemformatan dua arah Unicode yang tidak seimbang sekarang dilarang dalam string dan komentar untuk menghindari injeksi.
    • Base.ifelse sekarang didefinisikan sebagai fungsi generik dan bukan fungsi bawaan, sehingga paket dapat memperluas definisinya.
    • Setiap penugasan ke variabel global sekarang terlebih dahulu melalui panggilan ke convert(Any, x) atau convert(T, x) jika variabel global dideklarasikan bertipe T. Sebelum menggunakan variabel global, pastikan bahwa invarian convert(Any , x) === x selalu benar, jika tidak maka dapat menyebabkan perilaku yang tidak diharapkan.
    • Fungsi bawaan sekarang mirip dengan fungsi generik dan dapat dihitung secara terprogram menggunakan metode.
  • Kompiler/Peningkatan Waktu Proses
    • Waktu booting berkurang sekitar 25%.
    • Kompiler berbasis LLVM telah dipisahkan dari perpustakaan runtime menjadi perpustakaan baru, libjulia-codegen. Ini dimuat secara default, jadi tidak akan ada perubahan selama penggunaan normal. Dalam penerapan yang tidak memerlukan kompiler (misalnya, citra sistem yang semua kode yang diperlukan telah dikompilasi sebelumnya), pustaka ini (dan ketergantungan LLVM-nya) dapat dihilangkan begitu saja.
    • Inferensi tipe bersyarat sekarang dimungkinkan dengan meneruskan argumen ke suatu metode. Misalnya, untuk Base.ifelse(isa(x, Int), x, 0) mengembalikan ::Int meskipun tipe x tidak diketahui.
    • SROA (Scalar Replacement of Aggregates) telah ditingkatkan: menghilangkan panggilan getfield dengan bidang global yang persisten, menghilangkan struktur yang dapat diubah dengan bidang yang tidak diinisialisasi, meningkatkan kinerja dan penanganan panggilan getfield bersarang.
    • Jenis inferensi melacak berbagai efekβ€”efek samping dan non-jatuh. Propagasi konstan diperhitungkan, yang secara signifikan meningkatkan kinerja waktu kompilasi. Dalam beberapa kasus, misalnya, panggilan ke fungsi yang tidak dapat dimasukkan tetapi tidak mempengaruhi hasilnya akan dibuang pada saat runtime. Aturan untuk efek dapat ditimpa secara manual menggunakan makro Base.@assume_effects.
    • Prakompilasi (dengan arahan prakompilasi eksplisit atau beban kerja tertentu) kini menyimpan lebih banyak kode yang ditentukan jenisnya, sehingga menghasilkan eksekusi pertama kali yang lebih cepat. Kombinasi metode/tipe baru apa pun yang diperlukan oleh paket Anda, di mana pun metode tersebut didefinisikan, kini dapat disimpan dalam cache di file prakompilasi jika dipanggil oleh metode milik paket Anda.
  • Perubahan parameter baris perintah
    • Perilaku default untuk memantau deklarasi @inbounds sekarang menjadi opsi otomatis di "--check-bounds=yes|no|auto".
    • Opsi "--strip-metadata" baru untuk menghapus dokumen, informasi lokasi sumber, dan nama variabel lokal saat membuat image sistem.
    • Opsi baru "--strip-ir" untuk memungkinkan kompiler menghapus representasi kode sumber perantara saat membangun citra sistem. Gambar yang dihasilkan hanya akan berfungsi jika "--compile=all" digunakan atau jika semua kode yang diperlukan telah dikompilasi sebelumnya.
    • Jika karakter "-" ditentukan alih-alih nama file, maka kode yang dapat dieksekusi dibaca dari aliran input standar.
  • Perubahan dukungan multithreading
    • Threads.@threads secara default menggunakan opsi penjadwalan baru :dinamis, yang berbeda dari mode sebelumnya karena iterasi akan dijadwalkan secara dinamis di seluruh thread pekerja yang tersedia daripada ditetapkan ke setiap thread. Mode ini memungkinkan distribusi loop bersarang yang lebih baik dengan @spawn dan @threads.
  • Fungsi perpustakaan baru
    • masing-masingsplit(str) untuk mengeksekusi split(str) beberapa kali.
    • allequal(itr) untuk menguji apakah semua elemen dalam iterator sama.
    • hardlink(src, dst) dapat digunakan untuk membuat tautan keras.
    • setcpuaffinity(cmd, cpus) untuk mengatur afinitas inti prosesor dengan proses yang diluncurkan.
    • diskstat(path=pwd()) untuk mendapatkan statistik disk.
    • Makro @showtime baru untuk menampilkan baris yang sedang dievaluasi dan laporan @time.
    • Makro LazyString dan malas"str" ​​telah ditambahkan untuk mendukung konstruksi pesan kesalahan yang lambat di jalur kesalahan.
    • Memperbaiki masalah konkurensi di Dict dan objek turunan lainnya seperti kunci(::Dict), nilai(::Dict) dan Set. Metode iterasi sekarang dapat dipanggil pada kamus atau himpunan, selama tidak ada panggilan yang mengubah kamus atau himpunan.
    • @time dan @timev kini memiliki deskripsi opsional, yang memungkinkan Anda memberi anotasi pada sumber laporan waktu, misalnya. @time "Mengevaluasi foo" foo().
    • range menggunakan stop atau length sebagai satu-satunya argumen kata kuncinya.
    • presisi dan setprecision sekarang menerima basis sebagai kata kunci
    • Objek soket TCP sekarang menyediakan metode closewrite dan mendukung penggunaan mode setengah terbuka.
    • extrema sekarang menerima argumen init.
    • Iterators.countfrom sekarang menerima tipe apa pun yang mendefinisikan metode +.
    • @time sekarang mengalokasikan% waktu yang dihabiskan untuk mengkompilasi ulang metode dengan tipe yang diubah.
  • Perubahan Perpustakaan Standar
    • Kunci dengan nilai Tidak ada yang sekarang dihapus dari lingkungan di addenv.
    • Iterators.reverse (dan karena itu yang terakhir) mendukung setiap baris.
    • Fungsi panjang untuk rentang tipe tertentu tidak lagi memeriksa luapan bilangan bulat. Fungsi baru, check_length, tersedia; berisi logika kontrol transfer bit. Jika perlu, gunakan SaferIntegers.jl untuk membuat tipe rentang.
    • Iterators.Reverse iterator mengimplementasikan setiap pembalikan indeks jika memungkinkan.
  • Manajer Paket
    • Indikator βŒƒ dan βŒ… baru di sebelah paket dalam status β€œpkg>” yang versi barunya tersedia. βŒ… menunjukkan bahwa versi baru tidak dapat diinstal.
    • Argumen baru yang ketinggalan jaman::Bool ke Pkg.status (--outdated atau -o dalam mode REPL) untuk menampilkan informasi tentang paket dari versi sebelumnya.
    • Argumen compat::Bool baru ke Pkg.status (--compat atau -c dalam mode REPL) untuk menampilkan entri [compat] apa pun di Project.toml.
    • Mode "pkg>compat" (dan Pkg.compat) baru untuk mengatur entri kompatibilitas proyek. Menyediakan editor interaktif melalui "pkg>compat" atau kontrol catatan langsung melalui "pkg>Foo 0.4,0.5", yang dapat memuat catatan saat ini melalui penyelesaian tab. Artinya, "pkg> kompatibel Fo " secara otomatis diperbarui ke "pkg>Foo 0.4,0.5" untuk memungkinkan pengeditan entri yang sudah ada.
    • Pkg sekarang hanya mencoba mengunduh paket dari server paket jika server memantau registri yang berisi paket tersebut.
    • Pkg.instantiate sekarang akan mengeluarkan peringatan ketika Project.toml tidak sinkron dengan Manifest.toml. Hal ini dilakukan berdasarkan hash dari deps dan catatan compat proyek (bidang lain diabaikan) dalam manifes ketika menyelesaikannya, sehingga perubahan apa pun pada deps atau catatan compat Project.toml dapat dideteksi tanpa penyelesaian ulang.
    • Jika "pkg>add" tidak dapat menemukan paket dengan nama yang diberikan, sekarang ia akan menyarankan paket dengan nama serupa yang dapat ditambahkan.
    • Versi julia yang disimpan dalam manifes tidak lagi menyertakan nomor build, artinya master sekarang akan ditulis sebagai 1.9.0-DEV.
    • Tes batalkan "pkg>" sekarang akan terdeteksi lebih konsisten, dan akan dikembalikan dengan benar ke REPL.
  • Utilitas Interaktif
    • Makro @time_imports baru untuk melaporkan waktu yang dihabiskan untuk mengimpor paket dan ketergantungannya, menyoroti waktu kompilasi dan kompilasi ulang sebagai persentase impor.
  • Aljabar linier
    • Submodul BLAS sekarang mendukung fungsi BLAS spr! level-2.
    • Pustaka standar LinearAlgebra.jl sekarang sepenuhnya independen dari SparseArrays.jl, baik dari perspektif kode sumber dan pengujian unit. Sebagai konsekuensinya, array renggang tidak lagi dikembalikan (secara implisit) oleh metode dari LinearAlgebra yang diterapkan ke objek Base atau LinearAlgebra. Secara khusus, hal ini menyebabkan perubahan yang dapat menyebabkan gangguan berikut:
      • Penggabungan yang menggunakan matriks khusus "jarang" (misalnya diagonal) kini menghasilkan matriks padat; Sebagai konsekuensinya, bidang D1 dan D2 objek SVD yang dibuat oleh panggilan getproperty kini menjadi matriks padat.
      • Metode serupa(::SpecialSparseMatrix, ::Type, ::Dims) mengembalikan matriks nol padat. Akibatnya, hasil kali matriks dua, tiga, dan tridiagonal simetris satu sama lain menghasilkan matriks padat. Selain itu, membuat matriks serupa dengan tiga argumen dari matriks "jarang" khusus dari matriks (non-statis) kini gagal karena "nol(::Jenis{Matrix{T}})".
  • Cetak
    • %s dan %c sekarang menggunakan argumen textwidth untuk memformat lebarnya.
  • Profil
    • Pembuatan profil beban CPU sekarang mencatat metadata termasuk thread dan tugas. Profile.print() memiliki argumen groupby baru yang memungkinkan Anda mengelompokkan thread, tugas atau subthread/tugas, tugas/thread, dan argumen thread dan tugas untuk menyediakan pemfilteran. Selain itu, persentase pemanfaatan kini dilaporkan secara keseluruhan atau per thread, bergantung pada apakah thread menganggur atau tidak di setiap sampel. Profile.fetch() menyertakan metadata baru secara default. Untuk kompatibilitas mundur dengan konsumen eksternal data pembuatan profil, data tersebut dapat dikecualikan dengan meneruskan include_meta=false.
    • Modul Profile.Allocs baru memungkinkan Anda membuat profil alokasi memori. Pelacakan tumpukan jenis dan ukuran setiap alokasi memori dicatat, dan argumen sample_rate memungkinkan sejumlah alokasi yang dapat dikonfigurasi dilewati, sehingga mengurangi overhead kinerja.
    • Pembuatan profil CPU dengan durasi tetap sekarang dapat dijalankan oleh pengguna saat tugas sedang berjalan tanpa terlebih dahulu memuat profil, dan laporan akan ditampilkan saat berjalan. Di MacOS dan FreeBSD, tekan ctrl-t atau hubungi SIGINFO. Untuk platform lain, aktifkan SIGUSR1, mis. % bunuh -USR1 $julia_pid. Ini tidak tersedia di Windows.
  • REPL
    • RadioMenu sekarang mendukung pintasan keyboard tambahan untuk pemilihan opsi langsung.
    • Urutan "?(x, y" diikuti dengan menekan TAB menampilkan semua metode yang dapat dipanggil dengan argumen x, y, .... (Spasi di depan mencegah Anda memasuki mode bantuan.) "MyModule.?(x, y " membatasi pencarian pada "MyModule". Menekan TAB mengharuskan setidaknya satu argumen bertipe lebih spesifik daripada Any. Atau gunakan SHIFT-TAB alih-alih TAB untuk mengizinkan metode apa pun yang kompatibel.
    • Variabel global baru err memungkinkan Anda mendapatkan pengecualian terbaru, mirip dengan perilaku ans dengan respons terakhir. Memasukkan err akan mencetak ulang informasi pengecualian.
  • ArraySparse
    • Memindahkan kode SparseArrays dari repositori Julia ke repositori SparseArrays.jl eksternal.
    • Fungsi rangkaian baru sparse_hcat, sparse_vcat, dan sparse_hvcat mengembalikan tipe SparseMatrixCSC terlepas dari tipe argumen input. Hal ini menjadi perlu untuk menyatukan mekanisme perekatan matriks setelah memisahkan kode LinearAlgebra.jl dan SparseArrays.jl.
  • Logging
    • Level logging standar BelowMinLevel, Debug, Info, Warn, Error, dan AboveMaxLevel kini diekspor dari pustaka Logging standar.
  • Unicode
    • Menambahkan fungsi isequal_normalized untuk memeriksa kesetaraan Unicode tanpa secara eksplisit membuat string yang dinormalisasi.
    • Fungsi Unicode.normalize sekarang menerima kata kunci charttransform, yang dapat digunakan untuk menyediakan pemetaan karakter khusus, dan fungsi Unicode.julia_chartransform juga disediakan untuk mereproduksi pemetaan yang digunakan ketika parser Julia menormalkan pengidentifikasi.
  • uji
    • '@test_throws "some message" triggers_error()' sekarang dapat digunakan untuk menguji apakah teks kesalahan yang ditampilkan berisi kesalahan "some message", terlepas dari jenis pengecualian spesifiknya. Ekspresi reguler, daftar string, dan fungsi pencocokan juga didukung.
    • @testset foo() sekarang dapat digunakan untuk membuat set pengujian dari fungsi tertentu. Nama test case adalah nama fungsi yang dipanggil. Fungsi yang dipanggil mungkin berisi @test dan definisi @testset lainnya, termasuk untuk panggilan ke fungsi lain, sekaligus mencatat semua hasil pengujian antara.
    • TestLogger dan LogRecord kini diekspor dari perpustakaan Tes standar.
  • didistribusikan
    • SSHManager sekarang mendukung thread pekerja dengan pembungkus csh/tcsh melalui metode addprocs() dan parameter shell=:csh.
  • Perubahan lainnya
    • GC.enable_logging(true) dapat digunakan untuk mencatat setiap operasi pengumpulan sampah dengan waktu dan jumlah memori yang dikumpulkan.

Sumber: opennet.ru

Tambah komentar