Keluaran bahasa pengaturcaraan Rust 1.34

Bahasa pengaturcaraan sistem Rust 1.34, yang dibangunkan oleh projek Mozilla, telah dikeluarkan. 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 membebaskan pembangun daripada manipulasi penunjuk dan melindungi daripada masalah yang timbul daripada manipulasi memori peringkat rendah, seperti capaian memori selepas bebas, penolakan penunjuk nol, overrun penimbal, dan seumpamanya. Untuk mengedarkan perpustakaan, memastikan pemasangan dan mengurus kebergantungan, projek sedang membangunkan pengurus pakej Kargo, yang membolehkan anda mendapatkan perpustakaan yang diperlukan untuk program dalam satu klik. Repositori crates.io disokong untuk mengehos perpustakaan.

Inovasi utama:

  • Alat tambahan pada pengurus pakej Kargo untuk bekerja dengan pendaftaran pakej alternatif yang boleh wujud bersama dengan pendaftaran awam crates.io. Sebagai contoh, pembangun aplikasi persendirian kini boleh menggunakan pendaftaran peribadi mereka sendiri yang boleh digunakan apabila menyenaraikan kebergantungan dalam Cargo.toml dan menggunakan model versi seperti crates.io untuk produk mereka, serta merujuk kedua-dua crates.io dan crates.io dalam kebergantungan. ke registri anda sendiri.

    Untuk menambah pendaftaran luaran pada ~/.cargo/config
    pilihan baharu "pendaftaran saya" disediakan dalam bahagian "[pendaftaran]", dan pilihan "petak lain" telah ditambahkan untuk menyebut pendaftaran luar dalam tanggungan dalam Cargo.toml dalam bahagian "[pergantungan]". Untuk menyambung ke pendaftaran tambahan, hanya letakkan token pengesahan dalam fail ~/.cargo/credentials dan jalankan arahan
    "log masuk kargo --registry=my-registry", dan untuk menerbitkan pakej -
    "cargo publish --registry=my-registry";

  • Menambah sokongan penuh untuk menggunakan pengendali β€œ?”. dalam doctests, yang membolehkan anda menggunakan kod contoh daripada dokumentasi sebagai ujian. Pengendali sebelum ini
    "?" boleh digunakan untuk mengendalikan ralat semasa pelaksanaan ujian hanya jika terdapat fungsi "fn main()" atau dalam fungsi "#[test]";

  • Dalam atribut tersuai yang ditakrifkan menggunakan makro prosedur, adalah mungkin untuk menggunakan set token arbitrari (β€œ#[attr($tokens)]”, β€œ#[attr[$tokens]] dan #[attr{$tokens}]”) . Sebelum ini, elemen hanya boleh ditentukan dalam bentuk pokok/rekursif menggunakan literal rentetan, contohnya "#[foo(bar, baz(quux, foo = "bar"))]", tetapi kini boleh menggunakan penghitungan (' #[range(0. .10)]') dan binaan seperti β€œ#[bound(T: MyTrait)]”;
  • Ciri TryFrom dan TryInto telah distabilkan, membenarkan penukaran jenis dengan pengendalian ralat. Contohnya, kaedah seperti from_be_bytes dengan jenis integer menggunakan tatasusunan sebagai input, tetapi data selalunya datang dalam jenis Slice dan menukar antara tatasusunan dan kepingan adalah bermasalah untuk dilakukan secara manual. Dengan bantuan ciri baharu, operasi yang ditentukan boleh dilakukan dengan cepat melalui panggilan ke .try_into(), sebagai contoh, β€œlet num = u32::from_be_bytes(slice.try_into()?)”. Untuk penukaran yang sentiasa berjaya (contohnya, daripada jenis u8 hingga u32), jenis ralat Infallible telah ditambahkan untuk membenarkan penggunaan telus
    TryFrom untuk semua pelaksanaan "Daripada" sedia ada;

  • Menamatkan fungsi CommandExt::before_exec, yang membenarkan pelaksanaan pengendali sebelum pelaksanaan yang telah dilaksanakan dalam konteks proses anak yang dicabang selepas panggilan fork(). Di bawah keadaan sedemikian, beberapa sumber proses induk, seperti deskriptor fail dan kawasan memori yang dipetakan, boleh diduplikasi, yang boleh membawa kepada tingkah laku yang tidak ditentukan dan pengendalian perpustakaan yang salah.
    Daripada before_exec, adalah disyorkan untuk menggunakan fungsi tidak selamat CommandExt::pre_exec.

  • Jenis integer atom yang ditandatangani dan tidak ditandatangani distabilkan dalam julat saiz dari 8 hingga 64 bit (contohnya, AtomicU8), serta jenis bertanda BukanZeroI[8|16|32|54|128].
  • Bahagian baharu API telah dialihkan ke kategori stabil, termasuk kaedah Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[tambah |sub] dan SystemTime distabilkan ::checked_[add|sub]. Fungsi iter::from_fn dan iter::successors telah distabilkan;
  • Untuk semua jenis integer, kaedah checked_pow, saturating_pow, wrapping_pow dan overflowing_pow dilaksanakan;
  • Menambah keupayaan untuk mendayakan pengoptimuman pada peringkat pemautan dengan menentukan pilihan binaan "-C linker-plugin-lto" (rustc menyusun kod Rust ke dalam kod bit LLVM, yang membolehkan pengoptimuman LTO digunakan).

Sumber: opennet.ru

Tambah komen