Bahasa pemrograman Julia 1.9 tersedia

Rilis bahasa pemrograman Julia 1.9 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.9:

  • Fitur bahasa baru
    • Izinkan penugasan dibuat di modul lain menggunakan "setproperty!(::Module, ::Symbol, x)".
    • Tugas ganda yang tidak berada di posisi akhir diperbolehkan. Misalnya, string "a, b..., c = 1, 2, 3, 4" akan diproses sebagai "a = 1; b…, = 2, 3; c = 4". Ini ditangani melalui Base.split_rest.
    • Literal karakter tunggal sekarang mendukung sintaks yang sama dengan literal string; itu. sintaks dapat mewakili urutan UTF-8 yang tidak valid, seperti yang diizinkan oleh tipe Char.
    • Menambahkan dukungan untuk spesifikasi Unicode 15.
    • Kombinasi tupel bersarang dan tupel karakter bernama sekarang dapat digunakan sebagai parameter tipe.
    • Fungsi bawaan baru "getglobal(::Module, ::Symbol[, order])" dan "setglobal!(::Module, ::Symbol, x[, order])" untuk membaca dan menulis secara eksklusif ke variabel global. Metode getglobal sekarang lebih disukai daripada metode getfield untuk mengakses variabel global.
  • Perubahan bahasa
    • Makro "@invoke" yang diperkenalkan di versi 1.7 kini telah diekspor dan tersedia untuk digunakan. Juga, sekarang menggunakan metode "Core.Typeof(x)" daripada "Any" saat anotasi tipe dihilangkan untuk argumen "x". Ini diperlukan agar tipe yang diteruskan sebagai argumen diproses dengan benar.
    • Mengaktifkan ekspor fungsi "invokelatest" dan makro "@invokelatest" yang diperkenalkan di versi 1.7.
  • Kompiler/Peningkatan Waktu Proses
    • Secara signifikan mengurangi waktu eksekusi pertama (TTFX - Waktu eksekusi pertama). Prakompilasi paket sekarang menyimpan kode asli di "pkgimage", yang berarti kode yang dihasilkan selama prakompilasi tidak perlu dikompilasi ulang setelah paket dimuat. Penggunaan mode pkgimages dapat dinonaktifkan dengan opsi "--pkgimages=no".
    • Masalah kompleksitas kuadrat dari inferensi tipe yang diketahui telah diperbaiki, dan secara umum inferensi menggunakan lebih sedikit memori. Beberapa kasus tepi dengan fungsi panjang yang dihasilkan secara otomatis (seperti ModelingToolkit.jl dengan persamaan diferensial parsial dan model kausal besar) dikompilasi jauh lebih cepat.
    • Panggilan dengan argumen non-tipe-spesifik sekarang dapat menjadi Union-splitting yang dioptimalkan untuk resolusi injeksi atau statis, bahkan jika ada beberapa tipe kandidat pengiriman yang berbeda. Ini dapat meningkatkan kinerja dalam situasi tertentu di mana tipe objek tidak sepenuhnya diselesaikan secara statis, dengan menyelesaikan situs panggilan "@nospecialize-d" secara statis dan menghindari kompilasi ulang.
    • Semua penggunaan makro @pure di modul Base telah diganti dengan Base.@assume_effects.
    • Panggilan untuk memohon(f, invokesig, args...) dengan tipe yang kurang spesifik daripada yang biasanya digunakan untuk f(args...) tidak lagi menyebabkan paket dikompilasi ulang.
  • Perubahan parameter baris perintah
    • Di Linux dan Windows, opsi "--threads=auto" kini berupaya menentukan jumlah prosesor yang tersedia berdasarkan afinitas CPU, yang merupakan mask yang biasanya disetel di lingkungan HPC dan cloud.
    • Opsi "--math-mode=fast" telah dinonaktifkan, alih-alih disarankan untuk menggunakan makro "@fastmath", yang memiliki semantik yang terdefinisi dengan baik.
    • Parameter "--threads" sekarang memiliki format "auto | N[,auto|M]", di mana M menentukan jumlah utas interaktif yang akan dibuat (saat ini otomatis berarti 1).
    • Menambahkan opsi "--heap-size-hint= ”, yang menetapkan ambang batas setelah pengumpulan sampah aktif dimulai. Ukuran dapat ditentukan dalam byte, kilobyte (1000 KB), megabyte (300 MB), atau gigabyte (1,5 GB).
  • Perubahan Multithreading
    • "Threads.@spawn" sekarang memiliki argumen opsional pertama dengan nilai ":default" atau ":interactive". Tugas interaktif memerlukan latensi respons rendah dan dirancang agar singkat atau sering dilakukan. Tugas interaktif akan berjalan di thread interaktif jika ditentukan saat memulai Julia.
    • Utas diluncurkan di luar runtime Julia (misalnya, dari C atau Java) sekarang dapat memanggil kode Julia menggunakan "jl_adopt_thread". Ini terjadi secara otomatis saat Anda memasukkan kode Julia melalui titik masuk "cfunction" atau "@ccallable". Akibatnya, jumlah utas kini dapat berubah saat runtime.
  • Fungsi perpustakaan baru
    • Fungsi "Iterators.flatmap" baru.
    • Fungsi "pkgversion(m::Module)" baru untuk mendapatkan versi paket yang memuat modul tertentu, mirip dengan "pkgdir(m::Module)".
    • Fungsi "stack(x)" baru yang menggeneralisasikan "reduce(hcat, x::Vector{<:Vector})" ke dimensi apa pun dan mengizinkan iterator apa pun dari iterator. Metode "stack(f, x)" menggeneralisasikan "mapreduce(f, hcat, x)" dan lebih efisien.
    • Makro baru untuk mengurai memori yang dialokasikan "@allocations", mirip dengan "@allocated", kecuali mengembalikan jumlah alokasi memori, bukan ukuran total memori yang dialokasikan.
  • Fitur baru dari perpustakaan
    • "RoundFromZero" sekarang berfungsi untuk jenis selain "BigFloat".
    • "Dict" sekarang dapat diperkecil secara manual dengan "sizehint!".
    • "@time" sekarang secara terpisah menunjukkan persentase waktu yang dihabiskan untuk mengkompilasi ulang metode yang tidak valid.
  • Perubahan di perpustakaan standar
    • Memperbaiki masalah konkurensi dalam metode iterasi untuk Dict dan objek turunan lainnya seperti kunci(::Dict), nilai(::Dict) dan Set. Metode iterasi ini sekarang dapat dipanggil pada Dict atau Set secara paralel pada jumlah utas yang tidak terbatas, selama tidak ada tindakan yang mengubah kamus atau set.
    • Meniadakan fungsi predikat "!f" sekarang mengembalikan fungsi komposit "(!) ∘ f" alih-alih fungsi anonim.
    • Fungsi irisan dimensi sekarang bekerja di beberapa dimensi: "setiap irisan", "setiap baris", dan "setiap kolom" mengembalikan objek "Irisan" yang memungkinkan pengiriman untuk menyediakan metode yang lebih efisien.
    • Menambahkan makro "@kwdef" ke API publik.
    • Memperbaiki masalah dengan urutan operasi di "fld1".
    • Penyortiran sekarang selalu stabil waktu (QuickSort didesain ulang).
    • "Base.splat" sekarang diekspor. Nilai yang dikembalikan adalah tipe "Base.Splat" daripada fungsi anonim, yang memungkinkannya disimpulkan dengan baik.
  • Manajer Paket
    • "Ekstensi Paket": dukungan untuk memuat cuplikan kode dari paket lain yang dimuat dalam sesi Julia. Aplikasi ini mirip dengan paket "Requires.jl", tetapi kompatibilitas pra-kompilasi dan konfigurasi didukung.
  • Perpustakaan Aljabar Linear
    • Karena risiko kebingungan dengan pembagian elemen, metode "a / b" dan "b \ a" dengan skalar "a" dan vektor "b" telah dihapus, yang setara dengan "a * pinv(b)".
    • Panggilan BLAS dan LAPACK sekarang menggunakan "libblastrampoline (LBT)". OpenBLAS disediakan secara default, tetapi membangun citra sistem dengan pustaka BLAS/LAPACK lainnya tidak didukung. Sebagai gantinya, disarankan untuk menggunakan mekanisme LBT untuk mengganti BLAS/LAPACK dengan kumpulan pustaka lain yang tersedia.
    • "lu" mendukung strategi rotasi matriks "RowNonZero()" baru, yang memilih elemen rotasi bukan nol pertama untuk digunakan dengan jenis aritmatika baru dan untuk tujuan pendidikan.
    • "normalize(x, p=2)" sekarang mendukung semua ruang vektor "x" yang dinormalisasi, termasuk skalar.
    • Jumlah default utas BLAS sekarang sama dengan jumlah utas CPU pada arsitektur ARM dan setengah dari jumlah utas CPU pada arsitektur lain.
  • Printf: Pesan kesalahan yang dikerjakan ulang untuk string yang cacat agar lebih mudah dibaca.
  • Profil: Fungsi "Profile.take_heap_snapshot(file)" baru yang menangkap file dalam format ".heapsnapshot" berbasis JSON yang didukung oleh Chrome.
  • Acak: randn dan randexp sekarang berfungsi untuk semua tipe AbstractFloat yang mendefinisikan rand.
  • REPL
    • Menekan kombinasi tombol "Alt-e" sekarang membuka input saat ini di editor. Konten (jika diubah) akan dieksekusi saat editor keluar.
    • Konteks modul saat ini yang aktif di REPL dapat diubah (secara default adalah Main) menggunakan fungsi "REPL.activate(::Module)" atau dengan memasukkan modul di REPL dan menekan tombol "Alt-m" kombinasi.
    • Mode "nomor prompt", yang mencetak angka untuk setiap input dan output dan menyimpan hasil yang dievaluasi di Out, dapat diaktifkan dengan "REPL.numbered_prompt!()".
    • Penyelesaian tab menampilkan argumen kata kunci yang tersedia.
  • SuiteSparse: Memindahkan kode untuk pemecah "SuiteSparse" ke "SparseArrays.jl". Pemecah sekarang diekspor kembali oleh "SuiteSparse.jl".
  • ArraySparse
    • Pemecah SuiteSparse sekarang tersedia sebagai submodul dari SparseArrays.
    • Mode perlindungan aliran UMFPACK dan CHOLMOD telah ditingkatkan dengan menghilangkan variabel global dan menggunakan kunci. Multithread "ldiv!" Objek UMFPACK sekarang dapat dieksekusi dengan aman.
    • Fungsi eksperimental "SparseArrays.allowscalar(::Bool)" memungkinkan Anda untuk menonaktifkan atau mengaktifkan pengindeksan skalar dari array jarang. Fungsi ini dirancang untuk mendeteksi pengindeksan skalar acak dari objek "SparseMatrixCSC", yang merupakan sumber umum masalah kinerja.
  • Mode failover baru untuk rangkaian pengujian yang menghentikan uji coba lebih awal jika terjadi kegagalan atau kesalahan. Setel melalui "@testset kwarg failfast=true" atau "export JULIA_TEST_FAILFAST=true". Ini mungkin diperlukan dalam peluncuran CI untuk menerima pesan kesalahan awal.
  • Tanggal: String kosong tidak lagi diurai secara salah sebagai nilai "DateTime", "Dates" atau "Times" yang valid dan sebagai gantinya melemparkan kesalahan "ArgumentError" dalam konstruktor dan parsing, sementara "tryparse" tidak menghasilkan apa-apa.
  • Paket didistribusikan
    • Konfigurasi paket (proyek aktif, "LOAD_PATH", "DEPOT_PATH") sekarang disebarkan ketika proses pekerja lokal ditambahkan (misalnya dengan "addprocs(N::Int)" atau dengan tanda baris perintah "-procs=N").
    • "addprocs" untuk proses pekerja lokal sekarang menggunakan argumen bernama "env" untuk meneruskan variabel lingkungan ke proses pekerja.
  • Unicode: "graphemes(s, m:n)" mengembalikan substring dari mth ke nth grapheme di "s".
  • Paket DelimitedFiles telah dihapus dari pustaka sistem dan sekarang didistribusikan sebagai paket terpisah yang harus diinstal secara eksplisit agar dapat digunakan.
  • Dependensi Eksternal
    • Linux secara otomatis mendeteksi versi pustaka sistem libstdc++ dan memuatnya jika lebih baru. Perilaku lama memuat libstdc++ bawaan terlepas dari versi sistem dapat dipulihkan dengan menyetel variabel lingkungan "JULIA_PROBE_LIBSTDCXX=0".
    • Menghapus "RPTH" dari julia binary, yang dapat merusak pustaka di Linux yang gagal mendefinisikan variabel "RUNPATH".
    • Perbaikan Alat: Output dari "MethodError" dan metode (misalnya dari "methods(my_func)") sekarang ditata dan diwarnai agar sesuai dengan bagaimana metode dihasilkan dalam pelacakan tumpukan.

    Sumber: opennet.ru

Tambah komentar