Rilis bahasa pemrograman Julia 1.11 telah diterbitkan, menggabungkan kualitas seperti kinerja tinggi, dukungan untuk pengetikan dinamis, dan alat bawaan untuk pemrograman paralel. Sintaks Julia mirip dengan MATLAB, dengan beberapa elemen dipinjam 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 dalam Julia 1.11:
- Fitur bahasa baru
- Menambahkan tipe Memori, yang merupakan alternatif tingkat rendah untuk tipe Array. Tipe Memori membutuhkan lebih sedikit overhead dan memiliki konstruktor yang cepat, sekaligus menjadi alternatif untuk Array yang tidak memerlukan kemampuan lengkapnya. Misalnya array multidimensi. Secara internal, sebagian besar metode tipe Array diimplementasikan di atas tipe Memori, yang secara signifikan mempercepat beberapa fungsi, seperti push.
- Menambahkan kata kunci "publik". Pengidentifikasi yang ditandai "publik" diperlakukan sebagai antarmuka pemrograman eksternal. Pengidentifikasi dengan kata kunci "ekspor" diperlakukan dengan cara yang sama. Namun perbedaan utama antara "publik" dan "ekspor" adalah bahwa nama yang ditandai "publik" tidak disertakan dalam konteks modul saat menggunakan "menggunakan" dalam modul dependen.
- Paket ScopedValue mengimplementasikan pelingkupan dinamis ketika digunakan dalam pemrograman paralel Threads/tugas.
- File Manifest.toml sekarang dapat diganti namanya dalam format Manifest-v{major}.{minor}.toml untuk digunakan oleh versi Julia tertentu. Misalnya, file Manifest-v1.11.toml akan digunakan oleh versi 1.11, dan file Manifest.toml di direktori yang sama akan digunakan oleh Julia versi lain.
- Menambahkan dukungan untuk Unicode 15.1.
- Perubahan bahasa
- Selama proses prakompilasi, pengendali "atexit" dijalankan sebelum file yang dihasilkan dibuat. Hal ini memungkinkan pengguna untuk menghentikan eksekusi latar belakang dengan aman (seperti pemicu pengatur waktu atau peringatan berkala) dan secara eksplisit melepaskan sumber daya sebelum menghentikan program.
- Cakupan kode dan file alokasi memori tidak lagi dihasilkan selama prakompilasi. Selain itu, mode ini menggunakan cache pkgimage untuk paket yang juga tidak terlacak. Ini berarti bahwa pengujian cakupan (default untuk julia-actions/julia-runtest) menggunakan cache pkgimage untuk semua paket lain yang bergantung pada paket yang sedang diuji. Hal ini memungkinkan pengujian lebih cepat.
- Menentukan jalur di JULIA_DEPOT_PATH kini ditangani secara berbeda. Jika ada satu jalur, hanya jalur tersebut yang akan dimasukkan ke dalam nilai variabel internal DEPOT_PATH. Jika karakter terakhir adalah ":", maka variabel DEPOT_PATH akan menerima nilai yang berisi semua yang ditentukan sebelum ":", serta daftar jalur sistem tempat Julia berada.
- File cache yang telah dikompilasi sekarang dapat dipindahkan, dan relevansinya sekarang diperiksa menggunakan hash dari konten file sumber daripada menggunakan "mtime".
- Kompiler/Peningkatan Waktu Proses
- Heuristik pengumpul sampah telah diperbarui untuk memungkinkan bekerja dengan halaman memori secara keseluruhan, bukan objek individual.
- Menambahkan dukungan untuk anotasi Base.@assume_effects dalam kode.
- Perubahan parameter baris perintah
- Titik masuk sekarang didefinisikan secara ketat sebagai Main.main(args). Titik masuk harus ditentukan oleh makro @main (lihat dokumentasi). Jika titik masuk ditentukan dalam skrip yang dijalankan pada baris perintah (misalnya, "julia script.jl atau julia -e expr"), julia akan menjalankan fungsi Main.main secara otomatis. Hal ini dilakukan untuk menyatukan eksekusi skrip dan kompilasinya, ketika kode dapat dimuat untuk kompilasi, dan eksekusi metode Main.main hanya pada tahap peluncuran file yang dapat dieksekusi. Tidak ada perubahan saat menggunakan Julia secara interaktif. Semua kode dijalankan secara berurutan. Argumen "--compiled-modules" dan "--pkgimages" dapat disetel ke mode yang ada, yang menyebabkan Julia menggunakan cache yang ada tetapi tidak membuat yang baru.
- Argumen "--project" sekarang dapat mengambil nilai @script untuk menunjukkan lokasi file Project.toml relatif terhadap skrip yang sedang dijalankan. Misalnya, “—project=@script/foo” untuk subdirektori foo. Jika tidak ada yang ditentukan, yaitu "--project=@script", itu akan sama dengan "--project=@." saat mencari file Project.toml di direktori saat ini.
- Perubahan multi-utas
- Di makro Threads.@threads, Anda dapat menentukan mode penjadwal :greedy, yang berguna untuk beban komputasi yang tidak merata. Struktur baru (dengan penentu publik tetapi bukan ekspor) “struct Base.Lockable{T, L<:AbstractLock}” adalah pembungkus untuk menyederhanakan akses paralel ke elemen tipe komposit, umumnya menyederhanakan kode.
- Membangun perubahan sistem
- Pembuatan Makefile untuk Julia dan LLVM menggunakan strategi pengoptimalan PGO dan LTO. Lihat contrib/pgo-lto/Makefile.
- Fungsi perpustakaan baru
- Menambahkan tiga tipe baru dalam ide teks beranotasi - Pair{Symbol, Any}, misalnya ':lang => "en"' atau ':face => :magenta'. Jika memungkinkan, anotasi dipertahankan selama operasi string seperti penggabungan.
- Tipe konkret AnnotatedString mengimplementasikan AbstrakString. Tipe ini membungkus string, memungkinkan Anda menambahkan anotasi pada rentang karakter. Tipe AnnotatedString digunakan secara luas di pustaka standar StyledStrings baru untuk menampilkan informasi di layar dengan gaya.
- Tipe konkret AnnotatedChar mengimplementasikan AbstrakChar. Ini adalah pembungkus simbol dan memungkinkan Anda melampirkan daftar anotasi ke dalamnya.
- Tipe konkret AnnotatedIOBuffer mengimplementasikan IO, mereplikasi antarmuka tipe IOBuffer, namun memiliki metode baca/tulis khusus untuk membuat anotasi aliran. Dapat digunakan sebagai pembuat string atau sebagai alat untuk menggabungkan string beranotasi dan non-anotasi.
- Metode "in!(x, s::AbstractSet)" selalu mengembalikan nilai true. Namun jika elemen x tidak ada di s, maka akan disisipkan.
- Fungsi baru Libc.mkfifo adalah pembungkus fungsi C mkfifo untuk platform Unix.
- Metode "logrange(mulai, berhenti; panjang)" membuat urutan logaritmik dengan nomor yang ditentukan, bukan langkah tetap.
- Metode "copyuntil(out, io, delim)" dan "copyline(out, io)" menyalin data dari aliran io ke aliran out::IO.
- Metode "eachrsplit(string, pattern)" mengembalikan iterator pada elemen string yang terpisah dari kanan ke kiri.
- Metode Sys.username() mengembalikan nama pengguna saat ini.
- Metode Sys.isreadable(), Sys.iswritable() dapat digunakan untuk menentukan izin pengguna untuk membaca dan menulis data.
- Metode GC.logging_enabled() mengembalikan nilai true jika logging GC diaktifkan melalui GC.enable_logging.
- Tipe IdSet sekarang diekspor dari Base dan bersifat publik.
- Makro "@time" sekarang melaporkan nilai penghitung konflik kunci jika ReentrantLock digunakan, yang harus ditunggu. Dan juga menambahkan makro “@lock_conflicts”, yang dikembalikan oleh penghitung ini.
- Makro Base.Cartesian.@ncallkw didesain mirip dengan Base.Cartesian.@ncall, namun memungkinkan Anda menambahkan argumen berupa kata kunci untuk memanggil suatu fungsi.
- Fungsi baru Docs.hasdoc(module, simbol) melaporkan apakah nama simbol yang diminta memiliki deskripsi docstring.
- Fungsi baru Docs.undocumented_names(module) mengembalikan nama fungsi tidak berdokumen dari modul modul yang diminta.
- Kemampuan baru dari metode yang diketahui
- Metode invmod(n, T) untuk tipe bilangan bulat T yang telah ditentukan sekarang menghitung invers modulo dari bilangan bulat n menggunakan algoritma baru.
- Metode invmod(n) menyediakan bentuk singkat pemanggilan invmod(n, typeof(n)) untuk tipe integer.
- Metode replace(string, pattern...) sekarang mendukung argumen IO opsional untuk mengembalikan nilai ke aliran alih-alih mengembalikan String.
- Metode baru allequal(f, itr) dan allunique(f, itr) dengan argumen fungsi predikat.
- Metode sizehint!(s, n) sekarang mendukung opsi “shrink”, yang memungkinkan Anda menonaktifkan kliping elemen.
- Meneruskan IOBuffer sebagai argumen stdout saat proses pemijahan kini berfungsi dengan sinkronisasi "tunggu" atau "sukses" penuh, sehingga Base.BufferStream tidak perlu lagi memeriksa ketersediaan.
- Metode "closewrite" tidak lagi dipanggil secara otomatis pada aliran yang diteruskan setelah proses ditutup. Gunakan metode "tunggu" pada proses dan kemudian paksakan panggilan "closewrite". Atau gunakan metode terbuka dengan fungsi untuk menangani penutupan secara otomatis.
- Metode "@timed" sekarang juga mengembalikan perkiraan waktu kompilasi dan kompilasi ulang karena ketidakstabilan tipe.
- Metode "filter" sekarang dapat bekerja dengan NamedTuple.
- Metode Iterators.cycle(iter, n) dijalankan pada iterator "iter" sebanyak n kali.
- Metode zero(::AbstractArray) diterapkan secara rekursif, misalnya zero([[1,2],[3,4,5]]) menghasilkan [[0,0],[0,0,0]] alih-alih melemparkan kesalahan.
- Metode include_dependency(path; track_content=true) menyertakan dependensi berdasarkan nilai hash dari kode yang telah dikompilasi, bukan mtime.
- Perubahan perpustakaan dasar
- Metode write(::IO, ::AbstractArray) digunakan untuk memanggil metode "tulis" secara rekursif pada setiap elemen array, tetapi sekarang menulis representasi memori dari setiap nilai. Misalnya, memanggil write(io, 'a':'b') akan menulis 4 byte untuk setiap karakter, bukan representasi steno UTF-8 untuk masing-masing karakter. Format baru ini kompatibel dengan Array, sehingga memungkinkan untuk menggunakan metode "baca!". untuk membaca kembali nilainya.
- Tidak mungkin mendefinisikan metode "panjang" untuk iterator stateful dengan cara yang umum. Karena kemungkinan pengoperasian iterator Stateful yang salah, metode length(::Stateful) telah dihapus.
- String Bergaya
- Pustaka standar baru untuk penataan gaya string.
- Struktur Faces adalah wadah untuk informasi penataan gaya (warna, dekorator, dll.) dan juga menyediakan kerangka kerja untuk pendekatan yang nyaman, dapat diperluas (melalui addface!), dan dapat disesuaikan (menggunakan Faces.toml dan loadfaces khusus!) untuk menampilkan konten yang ditata .
- Makro @styled_str menyediakan cara mudah untuk membuat AnnotatedStrings dengan atribut gaya berbeda. Misalnya, StyledStrings.addface!(:orange => StyledStrings.Face(foreground = 0xFF7700)) diberi gaya"{orange:ini teks oranye}"
- libdl
- Tipe LazyLibrary baru diekspor dari perpustakaan Libdl untuk membuat rantai pemuatan lambat untuk perpustakaan yang secara asli digunakan dalam format JLL.
- Aljabar linier
- Metode cbrt(::AbstractMatrix{<:Real}) sekarang mengembalikan matriks real akar kuadrat untuk matriks real masukan.
- Metode penghitungan nilai eigen "eigvals/eigen(A, bundlekaufman(B)) dan eigvals/eigen(A, lu(B))" masing-masing menggunakan algoritma dekomposisi Bunchkaufman (LDL) dan LU dekomposisi B untuk menghitung nilai eigen umum secara efisien (eigen : dan vektor eigen) dari A dan B. Argumen kedua dari metode ini adalah hasil dari metode bundlekaufman atau lu.
- Metode khusus "eigvals/eigen(::Hermitian{<:Tridiagonal})", yang dirancang untuk matriks tridiagonal simetris dan menggunakan fasilitas LAPACK.
- Matriks terstruktur sekarang mempertahankan sumbu induknya (untuk Simetris/Hermitian/AbstrakTriangular/UpperHessenberg) atau sumbu diagonal utama (untuk matriks pita).
- Metode Bunchkaufman dan Bunchkaufman! sekarang ditentukan untuk AbstrakFloat, Rasional dan variasi kompleksnya. Metode bundlekaufman sekarang mendukung tipe Integer, mengonversinya secara internal menjadi Rasional{BigInt}. Menambahkan fungsi inersia, yang menghitung inersia faktor diagonal prosedur BunchKaufman untuk objek matriks simetris atau Hermitian nyata. Untuk matriks simetris kompleks, metode inersia hanya menghitung jumlah nilai eigen faktor diagonalnya.
- Paket yang mendefinisikan metode perkalian matriks mul! dengan tanda tangan mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) tidak akan lagi ambigu ketika berinteraksi dengan paket LinearAlgebra. Sebelumnya, perkalian menyebabkan ambiguitas antara matriks kustom jenis MyMatrix dan matriks terstruktur yang disediakan oleh paket LinearAlgebra, seperti AbstrakTriangular. Masalah serupa telah diperbaiki untuk operasi mul! dengan tipe matriks-vektor.
- Metode lu dan issuccess(::LU) sekarang mendukung argumen yang memungkinkan. Jika benar, maka faktorisasi yang valid dengan faktor U dengan rangking yang tidak mencukupi akan dianggap berhasil daripada menimbulkan kesalahan. Faktorisasi tersebut sekarang ditampilkan dengan mencetak faktor-faktor tersebut bersama dengan label "kekurangan peringkat" dan bukan dengan pesan "Faktorisasi Gagal".
- Acak
- Metode rand sekarang dapat diterapkan pada tipe yang dikirimkan dalam bentuk Tuple.
- Metode Rand sekarang berlaku untuk tipe yang diteruskan ke Pair.
- Angka negatif sekarang dapat digunakan untuk menginisialisasi generator angka acak RNG modul Random.
- Menginisialisasi generator angka acak sekarang dapat dilakukan dengan string seperti seed!(rng, "a random seed").
- REPL
- Menekan tombol Tab untuk menyelesaikan tooltip sekarang disorot dalam font yang ringan. Untuk menonaktifkan mode ini, gunakan Base.active_repl.options.hint_tab_completes = false secara interaktif atau dalam skrip startup.jl: if VERSION >= v»1.11.0-0″ atreplinit() do repl repl.options.hint_tab_completes = false end end
- Meta-M dengan prompt kosong sekarang mengalihkan modul konteks antara modul konteks non-utama sebelumnya dan modul konteks utama, membuatnya lebih mudah untuk beralih bolak-balik.
- Tanggal
- Fungsi penyesuaian yang tidak terdokumentasi tidak lagi diekspor, namun didokumentasikan.
- statistika
- Paket Statistik sekarang dapat diupgrade tanpa seluruh paket Julia.
- didistribusikan
- Metode pmap sekarang menggunakan CachingPool secara default.
- Metode yang tidak digunakan lagi dan dihapus
- Metode Base.map, Iterators.map, dan foreach dengan satu argumen tidak lagi didukung.
- Dependensi Eksternal
- Perpustakaan libuv telah diperbarui dari versi 1.44.2 ke 1.48.0.
- Metode tput tidak lagi digunakan untuk menguji kemampuan terminal. Ini telah digantikan oleh parser terminfo yang diterapkan sepenuhnya di Julia.
- Terminfo adalah defaultnya. Jika tidak ada di sistem, maka Julia dapat dikompilasi dengan opsi Makefile WITH_TERMINFO=0.
- Perbaikan Alat
- CI sekarang melakukan pemeriksaan tipe otomatis terbatas pada semua permintaan penggabungan.
Sumber: opennet.ru
