Keluaran bahasa pengaturcaraan Rust 1.38

diterbitkan keluaran bahasa pengaturcaraan sistem Karat 1.38, diasaskan oleh projek Mozilla. Bahasa ini memfokuskan pada keselamatan memori, menyediakan pengurusan memori automatik dan menyediakan cara untuk mencapai keselarian tugas yang tinggi tanpa menggunakan pengumpul sampah atau masa jalan.

Pengurusan memori automatik Rust menyelamatkan pembangun daripada memanipulasi penunjuk dan melindungi daripada masalah yang timbul daripada manipulasi memori peringkat rendah, seperti mengakses kawasan memori selepas ia dibebaskan, membatalkan penunjuk nol, overrun penimbal, dsb. Untuk mengedarkan perpustakaan, memastikan pemasangan dan mengurus kebergantungan, projek membangunkan pengurus pakej Cargo, yang membolehkan anda mendapatkan perpustakaan yang anda perlukan untuk program dalam satu klik. Repositori disokong untuk mengehos perpustakaan crates.io.

Utama inovasi:

  • Menambahkan mod kompilasi saluran paip (berpipelin), di mana binaan pakej peti bergantung bermula sebaik sahaja metadata pergantungan tersedia, tanpa menunggu penyusunannya selesai. Semasa menyusun pakej, kebergantungan tidak perlu dipasang sepenuhnya, hanya mentakrifkan metadata, yang merangkumi senarai jenis, kebergantungan dan elemen yang dieksport. Metadata disediakan awal dalam proses penyusunan, jadi pakej terpaut kini boleh disusun lebih awal. Apabila membina pakej tunggal, mod yang dicadangkan tidak menjejaskan prestasi, tetapi jika binaan meliputi pakej dengan kebergantungan bercabang, masa binaan keseluruhan boleh dikurangkan sebanyak 10-20%;
  • Memastikan pengesanan penggunaan fungsi yang salah std::mem::uninitialized ΠΈ std::mem::sifar. Sebagai contoh, std::mem::uninitialized adalah mudah untuk mencipta tatasusunan dengan cepat, tetapi ia mengelirukan pengkompil kerana ia nampaknya dimulakan, tetapi pada hakikatnya nilai itu kekal tidak dimulakan. Fungsi mem::uninitialized telah ditandakan sebagai tidak digunakan dan disyorkan untuk menggunakan jenis perantaraan sebaliknya MaybeUnit. Bagi mem::zeroed, fungsi ini boleh menyebabkan masalah dengan jenis yang tidak boleh menerima nilai sifar.

    Untuk membantu mengenal pasti gelagat yang tidak ditentukan, keluaran baharu menambah semakan lint pada pengkompil yang mengesan beberapa masalah dengan mem::uninitialized atau mem::zeroed. Sebagai contoh, anda kini mendapat ralat apabila cuba menggunakan mem::uninitialized atau mem::zeroed dengan jenis &T dan Boxβ€ΉTβ€Ί, yang mewakili objek penunjuk yang tidak boleh menerima nilai nol;

  • Atribut "#[ditamatkan]" telah dikembangkan untuk membolehkan pakej peti ditandai sebagai usang dan dijadualkan untuk pemadaman pada masa hadapan. Mulai Rust 1.38, atribut ini juga boleh digunakan untuk makro;
  • Menambahkan keupayaan untuk menggunakan atribut "#[global_allocator]" dalam submodul;
  • Fungsi tambahan std::any::type_name, yang membolehkan anda mengetahui nama jenis, yang boleh berguna untuk tujuan penyahpepijatan. Sebagai contoh, semasa pelaksanaan program anda boleh mengetahui jenis fungsi yang dipanggil:

    fn gen_valueβ€ΉT: Lalai>() -β€Ί T {
    println!("Memulakan contoh {}", std::mana-mana::type_name::β€ΉTβ€Ί());
    Lalai:: lalai()
    }

    fn utama() {
    biarkan _: i32 = nilai_gen(); # "i32" akan dicetak
    biarkan _: String = nilai_gen(); # akan mencetak "alloc::string::String"
    }

  • Fungsi lanjutan perpustakaan standard:
    • slice::{concat, connect, join} kini boleh mengambil nilai &[T] sebagai tambahan kepada &T;
    • "*const T" dan "*mut T" kini melaksanakan penanda::Nyahsemat;
    • "Arcβ€Ή[T]β€Ί" dan "Rcβ€Ή[T]β€Ί" kini melaksanakan FromIteratorβ€ΉTβ€Ί;
    • iter::{StepBy, Peekable, Take} kini melaksanakan DoubleEndedIterator.
    • ascii::EscapeDefault melaksanakan Klon dan Paparan.
  • Bahagian baharu API telah dipindahkan ke kategori stabil, termasuk kaedah yang telah distabilkan
    • β€Ή*const Tβ€Ί::cast, β€Ή*mut Tβ€Ί::cast,
    • Tempoh::as_secs_f{32|64},
    • Tempoh::div_duration_f{32|64},
    • Tempoh::div_f{32|64},
    • Tempoh::from_secs_f{32|64},
    • Tempoh::mul_f{32|64},
    • operasi bahagi dengan baki
      div_euclid dan rem_euclid untuk semua primitif integer;

  • Menambah sokongan untuk menentukan pilihan "--features" beberapa kali untuk mendayakan ciri yang berbeza dalam pengurus pakej kargo;
  • Pengkompil menyediakan yang ketiga tahap sokongan untuk platform sasaran aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc-sasaran, armlinux7 -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl dan riscv32i-unknown-none-elf. Tahap ketiga melibatkan sokongan asas, tetapi tanpa ujian automatik dan penerbitan binaan rasmi.

Sumber: opennet.ru

Tambah komen