Bahasa pengaturcaraan Julia 1.9 tersedia

Keluaran bahasa pengaturcaraan Julia 1.9 telah diterbitkan, menggabungkan kualiti seperti prestasi tinggi, sokongan untuk menaip dinamik dan alatan terbina dalam untuk pengaturcaraan selari. Sintaks Julia hampir dengan MATLAB, meminjam beberapa elemen daripada Ruby dan Lisp. Kaedah manipulasi rentetan mengingatkan Perl. Kod projek diedarkan di bawah lesen MIT.

Ciri-ciri utama bahasa:

  • Prestasi tinggi: salah satu matlamat utama projek adalah untuk mencapai prestasi hampir dengan program C. Pengkompil Julia adalah berdasarkan kerja projek LLVM dan menjana kod mesin asli yang cekap untuk banyak platform sasaran;
  • Menyokong pelbagai paradigma pengaturcaraan, termasuk elemen pengaturcaraan berorientasikan objek dan berfungsi. Pustaka standard menyediakan, antara lain, fungsi untuk I/O tak segerak, kawalan proses, pengelogan, pemprofilan dan pengurusan pakej;
  • Penaipan dinamik: bahasa tidak memerlukan takrifan jenis yang jelas untuk pembolehubah, serupa dengan bahasa pengaturcaraan skrip. Mod interaktif disokong;
  • Keupayaan pilihan untuk menentukan jenis secara eksplisit;
  • Sintaks yang sesuai untuk pengkomputeran berangka, pengkomputeran saintifik, pembelajaran mesin dan visualisasi data. Sokongan untuk banyak jenis data berangka dan alatan untuk penyejajaran pengiraan.
  • Keupayaan untuk memanggil terus fungsi dari perpustakaan C tanpa lapisan tambahan.

Perubahan utama dalam Julia 1.9:

  • Ciri bahasa baharu
    • Benarkan tugasan dibuat dalam modul lain menggunakan "setproperty!(::Module, ::Symbol, x)".
    • Berbilang tugasan yang tidak berada di kedudukan akhir dibenarkan. Sebagai contoh, rentetan β€œa, b…, c = 1, 2, 3, 4” akan diproses sebagai β€œa = 1; b…, = 2, 3; c = 4". Ini dikendalikan melalui Base.split_rest.
    • Literal aksara tunggal kini menyokong sintaks yang sama seperti literal rentetan; mereka. Sintaks boleh mewakili urutan UTF-8 yang tidak sah, seperti yang dibenarkan oleh jenis Char.
    • Menambah sokongan untuk spesifikasi Unicode 15.
    • Gabungan bersarang tupel dan tupel aksara bernama kini boleh digunakan sebagai parameter jenis.
    • Fungsi terbina dalam baharu "getglobal(::Module, ::Symbol[, order])" dan "setglobal!(::Module, ::Symbol, x[, order])" untuk membaca dan menulis secara eksklusif kepada pembolehubah global. Kaedah getglobal kini harus diutamakan berbanding kaedah getfield untuk mengakses pembolehubah global.
  • Perubahan dalam bahasa
    • Makro "@invoke" yang diperkenalkan dalam versi 1.7 kini dieksport dan tersedia untuk digunakan. Selain itu, ia kini menggunakan kaedah "Core.Typeof(x)" dan bukannya "Sebarang" dalam kes di mana anotasi jenis ditinggalkan untuk hujah "x". Ini adalah perlu untuk memastikan jenis yang diluluskan sebagai hujah diproses dengan betul.
    • Mendayakan eksport fungsi "invokelatest" dan makro "@invokelatest", yang diperkenalkan dalam versi 1.7.
  • Penambahbaikan pengkompil/masa jalan
    • Mengurangkan masa kepada pelaksanaan pertama dengan ketara (TTFX - Masa untuk pelaksanaan pertama). Prapengumpulan pakej kini menyimpan kod asli dalam "pkgimage", bermakna kod yang dijana oleh proses prapenyusun semula tidak perlu dikompilasi semula selepas pakej dimuatkan. Penggunaan mod pkgimages boleh dilumpuhkan menggunakan pilihan "--pkgimages=no".
    • Isu kerumitan kuadratik yang diketahui bagi jenis inferens telah ditetapkan, dan inferens menggunakan kurang memori secara keseluruhan. Beberapa kes tepi dengan fungsi panjang yang dijana secara automatik (seperti ModelingToolkit.jl dengan persamaan pembezaan separa dan model sebab-akibat yang besar) menyusun dengan lebih pantas.
    • Panggilan dengan hujah tanpa jenis konkrit kini boleh dioptimumkan Pemisahan Kesatuan untuk suntikan atau resolusi statik, walaupun terdapat berbilang calon berlainan jenis untuk penghantaran. Ini boleh meningkatkan prestasi dalam situasi tertentu di mana jenis objek tidak diselesaikan secara statik sepenuhnya, dengan menyelesaikan tapak panggilan "@nospecialize-d" secara statik dan mengelakkan penyusunan semula.
    • Semua penggunaan makro @pure dalam modul Base telah digantikan dengan Base.@assume_effects.
    • Panggilan untuk memanggil(f, invokesig, args...) dengan jenis yang kurang spesifik daripada yang biasa digunakan untuk f(args...) tidak lagi menyebabkan pakej disusun semula.
  • Perubahan kepada Pilihan Baris Perintah
    • Pada Linux dan Windows, pilihan "--threads=auto" kini cuba menentukan bilangan pemproses yang tersedia berdasarkan pertalian CPU, topeng yang biasanya ditetapkan dalam persekitaran HPC dan awan.
    • Parameter "--math-mode=fast" dilumpuhkan, sebaliknya disyorkan untuk menggunakan makro "@fastmath", yang mempunyai semantik yang jelas.
    • Pilihan "--threads" kini dalam format "auto | N[,auto|M]", dengan M menunjukkan bilangan utas interaktif untuk dibuat (pada masa ini auto bermaksud 1).
    • Menambahkan pilihan "β€”heap-size-hint=" ", yang menetapkan ambang selepas pengumpulan sampah aktif bermula. Saiz boleh ditentukan dalam bait, kilobait (1000 KB), megabait (300 MB) atau gigabait (1,5 GB).
  • Perubahan dalam multithreading
    • "Threads.@spawn" kini mempunyai argumen pertama pilihan dengan nilai ":default" atau ":interactive". Tugas interaktif memerlukan kependaman respons yang rendah dan direka bentuk untuk pendek atau dilakukan dengan kerap. Tugasan interaktif akan dijalankan pada urutan interaktif jika ia dinyatakan semasa memulakan Julia.
    • Benang yang berjalan di luar masa jalan Julia (seperti dari C atau Java) kini boleh memanggil kod Julia menggunakan "jl_adopt_thread". Ini berlaku secara automatik apabila memasukkan kod Julia melalui "cfunction" atau titik masuk "@ccallable". Akibatnya, bilangan utas kini boleh berubah semasa pelaksanaan.
  • Fungsi perpustakaan baharu
    • Fungsi baharu "Iterators.flatmap".
    • Fungsi baharu "pkgversion(m::Module)" untuk mendapatkan versi pakej yang memuatkan modul tertentu, serupa dengan "pkgdir(m::Module)".
    • Fungsi baharu "stack(x)" yang menyamaratakan "reduce(hcat, x::Vector{<:Vector})" kepada mana-mana dimensi dan membenarkan mana-mana iterator iterator. Kaedah "tindanan(f, x)" menyamaratakan "mapreduce(f, hcat, x)" dan lebih cekap.
    • Makro baharu untuk menganalisis memori yang diperuntukkan "@allocations", serupa dengan "@allocated", kecuali ia mengembalikan bilangan peruntukan memori, bukannya jumlah saiz memori yang diperuntukkan.
  • Ciri perpustakaan baharu
    • "RoundFromZero" kini berfungsi untuk jenis selain daripada "BigFloat".
    • "Dict" kini boleh dikurangkan secara manual menggunakan "sizehint!"
    • "@time" kini secara berasingan menentukan peratusan masa yang dihabiskan untuk menyusun semula kaedah yang tidak sah.
  • Perubahan kepada perpustakaan standard
    • Memperbaiki isu konkurensi dalam kaedah lelaran untuk Dict dan objek terbitan lain seperti keys(::Dict), values(::Dict) dan Set. Kaedah lelaran ini kini boleh dipanggil pada Dict atau Set secara selari untuk bilangan utas yang tidak terhad, selagi tiada tindakan yang mengubah suai kamus atau set.
    • Menafikan fungsi predikat "!f" kini mengembalikan fungsi komposit "(!) ∘ f" dan bukannya fungsi tanpa nama.
    • Fungsi kepingan dimensi kini berfungsi merentas berbilang dimensi: "eachslice", "eachrow" dan "eachcol" mengembalikan objek "Slices" yang membolehkan penghantaran menyediakan kaedah yang lebih cekap.
    • Menambahkan makro "@kwdef" pada API awam.
    • Memperbaiki masalah dengan susunan operasi dalam "fld1".
    • Isih kini sentiasa stabil masa (QuickSort telah direka bentuk semula).
    • "Base.splat" kini dieksport. Nilai pulangan ialah jenis "Base.Splat" dan bukannya fungsi tanpa nama, membolehkan ia dikeluarkan dengan baik.
  • Pengurus Pakej
    • "Sambungan Pakej": Sokongan untuk memuatkan coretan kod daripada pakej lain yang dimuatkan dalam sesi Julia. Aplikasi ini serupa dengan pakej "Requires.jl", tetapi pra-penyusunan dan keserasian tetapan disokong.
  • Perpustakaan LinearAlgebra
    • Disebabkan risiko kekeliruan dengan pembahagian mengikut unsur, alih keluar kaedah "a/b" dan "b\a" dengan skalar "a" dan vektor "b", yang bersamaan dengan "a * pinv(b)".
    • Memanggil BLAS dan LAPACK kini menggunakan "libblastrampoline (LBT)". OpenBLAS disediakan secara lalai, tetapi membina imej sistem dengan perpustakaan BLAS/LAPACK lain tidak disokong. Sebaliknya, adalah disyorkan untuk menggunakan mekanisme LBT untuk menggantikan BLAS/LAPACK dengan satu lagi set perpustakaan sedia ada.
    • "lu" menyokong strategi putaran matriks baharu, "RowNonZero()", yang memilih elemen putaran bukan sifar pertama untuk digunakan dengan jenis aritmetik baharu dan untuk tujuan latihan.
    • "normalize(x, p=2)" kini menyokong mana-mana ruang vektor normal "x", termasuk skalar.
    • Bilangan lalai utas BLAS kini sama dengan bilangan utas CPU pada seni bina ARM dan separuh bilangan utas CPU pada seni bina lain.
  • Printf: Mesej ralat yang diolah semula untuk rentetan yang tidak diformatkan dengan betul untuk kebolehbacaan yang lebih baik.
  • Profil: Fungsi baharu "Profile.take_heap_snapshot(file)", yang menulis fail dalam format ".heapsnapshot" berasaskan JSON yang disokong dalam Chrome.
  • Rawak: randn dan randexp kini berfungsi untuk mana-mana jenis AbstractFloat yang mentakrifkan rand.
  • REPL
    • Menekan kombinasi kekunci "Alt-e" kini membuka input semasa dalam editor. Kandungan (jika diubah suai) akan dilaksanakan apabila anda keluar dari editor.
    • Konteks modul semasa yang aktif dalam REPL boleh ditukar (Utama secara lalai) menggunakan fungsi "REPL.activate(::Module)" atau dengan memasukkan modul dalam REPL dan menekan kombinasi kekunci "Alt-m".
    • Mod "gesaan bernombor", yang mencetak nombor untuk setiap input dan output dan menyimpan hasil markah dalam Keluar, boleh diaktifkan menggunakan "REPL.numbered_prompt!()".
    • Pelengkapan tab memaparkan hujah kata kunci yang tersedia.
  • SuiteSparse: Mengalihkan kod untuk penyelesai "SuiteSparse" ke "SparseArrays.jl". Penyelesai kini dieksport semula oleh "SuiteSparse.jl".
  • SparseArrays
    • Penyelesai "SuiteSparse" kini tersedia sebagai submodul "SparseArrays".
    • Mod perlindungan benang UMFPACK dan CHOLMOD telah dipertingkatkan dengan menghapuskan pembolehubah global dan menggunakan kunci. "ldiv!" berbilang benang Objek UMFPACK kini boleh dilaksanakan dengan selamat.
    • Fungsi percubaan "SparseArrays.allowscalar(::Bool)" membolehkan anda melumpuhkan atau mendayakan pengindeksan skalar tatasusunan jarang. Fungsi ini direka bentuk untuk mengesan pengindeksan skalar rawak bagi objek "SparseMatrixCSC", yang merupakan sumber biasa masalah prestasi.
  • Mod failsafe baharu untuk suite ujian yang menamatkan ujian dijalankan lebih awal sekiranya berlaku kegagalan atau ralat. Tetapkan sama ada melalui β€œ@testset kwarg failfast=true” atau β€œeksport JULIA_TEST_FAILFAST=true”. Ini kadangkala diperlukan dalam larian CI untuk menerima mesej ralat lebih awal.
  • Tarikh: Rentetan kosong tidak lagi dihuraikan secara salah sebagai nilai "DateTime", "Dates" atau "Times" dan sebaliknya membuang "ArgumentError" dalam pembina dan penghuraian, manakala "tryparse" tidak mengembalikan apa-apa.
  • Pakej Diedarkan
    • Konfigurasi pakej (projek aktif, "LOAD_PATH", "DEPOT_PATH") kini disebarkan apabila menambah proses pekerja tempatan (cth. menggunakan "addprocs(N::Int)" atau menggunakan bendera baris arahan "--procs=N").
    • "addprocs" untuk proses pekerja tempatan kini menerima hujah bernama "env" untuk menghantar pembolehubah persekitaran kepada proses pekerja.
  • Unicode: "graphemes(s, m:n)" mengembalikan subrentetan daripada grafem ke nth dalam "s".
  • Pakej DelimitedFiles telah dialih keluar daripada pustaka sistem dan kini diedarkan sebagai pakej berasingan yang mesti dipasang secara eksplisit untuk digunakan.
  • Kebergantungan luar
    • Di Linux, versi pustaka sistem libstdc++ dikesan secara automatik dan, jika ia lebih baharu, ia dimuatkan. Tingkah laku pemuatan terbina dalam libstdc++ lama, tanpa mengira versi sistem, boleh dipulihkan dengan menetapkan pembolehubah persekitaran "JULIA_PROBE_LIBSTDCXX=0".
    • Dialih keluar "RPATH" daripada binari julia, yang boleh memecahkan perpustakaan di Linux yang gagal mentakrifkan pembolehubah "RUNPATH".
    • Penambahbaikan alat: Output "MethodError" dan kaedah (contohnya daripada "methods(my_func)") kini diformat dan diwarnakan mengikut prinsip output kaedah dalam surih tindanan.

    Sumber: opennet.ru

Tambah komen