Pengeluaran bahasa pengaturcaraan sistem Rust 1.51, yang diasaskan oleh projek Mozilla, tetapi kini dibangunkan di bawah naungan organisasi bukan untung bebas Rust Foundation, telah diterbitkan. Bahasa ini menumpukan pada keselamatan ingatan, menyediakan pengurusan memori automatik dan menyediakan cara untuk mencapai keselarian tugas yang tinggi tanpa menggunakan pengumpul sampah atau masa jalan (masa jalan dikurangkan kepada permulaan asas dan penyelenggaraan perpustakaan standard).
Pengurusan memori automatik Rust menyelamatkan pembangun daripada ralat semasa memanipulasi penunjuk dan melindungi daripada masalah yang timbul akibat manipulasi memori peringkat rendah, seperti mengakses kawasan memori selepas ia dibebaskan, membatalkan penunjuk nol, menimpa lebihan, dsb. Untuk mengedarkan perpustakaan, menyediakan binaan dan mengurus kebergantungan, projek membangunkan pengurus pakej Kargo. Repositori crates.io disokong untuk mengehos perpustakaan.
Inovasi utama:
- Kefungsian yang dikaitkan dengan penggunaan const generik telah ditetapkan sebagai produk berdaya maju minimum (MVP), memberikan lampu hijau untuk penggunaan meluas. Const generik membenarkan generalisasi jenis untuk nilai malar, iaitu, penggunaan hujah generik terhad kepada julat nilai malar dan bukannya jenis atau jangka hayat. Keupayaan ini membolehkan penggunaan jenis berparameter integer dan pengabstrakan apabila mencipta ciri untuk tatasusunan sebarang saiz, tanpa perlu mencipta jenis berasingan untuk setiap julat nilai yang sah untuk memastikan julat yang sah tidak melebihi.
Bermula dengan keluaran semasa, tatasusunan jenis "[T; N]" (jenis T dan saiz N) kini mempunyai keupayaan untuk mengabstrak jenis dan saiz, menggunakan nilai mana-mana jenis integer, boolean atau aksara (jenis struct dan enum belum disokong). Const generik memudahkan pembangunan perpustakaan dengan ketara; sebagai contoh, untuk menggunakan tatasusunan yang tidak terikat pada jenis dan saiz tertentu, anda boleh menentukan: struct Array { // ^^^^^^^^^^^^^^^^^^^^ takrif senarai generik malar: [T; PANJANG] // ^^^^^^ penggunaannya }
Apabila sebenarnya digunakan dengan definisi ini, "Array " pengkompil akan menjana versi monomorfik Array: struct Array { senarai: [u8; 32] }
- API std::array::IntoIter, berdasarkan generik malar, telah distabilkan. Dengan itu, anda boleh mencipta iterator mengikut nilai untuk mana-mana tatasusunan: fn main() { let array = [1, 2, 3, 4, 5]; // Sebelum ini, untuk mengulang nilai, anda perlu memanggil kaedah .iter() untuk item dalam array.iter().copied() { println!(«{}», item); } // Sekarang anda boleh menentukan item dalam std::array::IntoIter::new(array) { println!(«{}», item); } }
- Pengurus pakej kargo kini menyokong medan penyelesai baharu dalam Cargo.toml, yang boleh digunakan untuk mendayakan versi kedua penyelesai ciri. Penyelesai baharu ini mengelakkan penggabungan ciri pergantungan yang disenaraikan dalam bahagian "[ciri]" apabila berbuat demikian adalah tidak sesuai, seperti apabila menyertakan pergantungan yang memerlukan ciri standard dalam skrip binaan dan makro, tetapi menggunakan ciri bukan standard dalam boleh laku akhir.
Sebelum ini, keupayaan pakej yang disebut beberapa kali dalam graf pergantungan telah digabungkan. Sebagai contoh, jika projek termasuk foo kebergantungan yang menentukan keupayaan A dan B, dan pakej ini digunakan dalam bar dan baz pakej lain, dan bar bergantung pada foo dengan keupayaan A, dan baz bergantung pada foo dengan keupayaan B, maka kargo akan menggabungkan keupayaan ini dan menyusun foo dengan keupayaan A dan B didayakan. Kaedah ini boleh menyebabkan keupayaan yang didayakan oleh kebergantungan tidak serasi dengan sistem sasaran yang mana binaan terakhir dilakukan. Sebagai contoh, apabila versi foo dengan "#![no_std]" diperlukan untuk digunakan dalam binaan boleh laku dengan "#![no_std]", dan foo dengan "std" diperlukan untuk digunakan semasa binaan dalam build.rs. Dengan menentukan resolver="2" dalam Cargo.toml, pengurus pakej kini akan cuba mengendalikan konflik ini dengan betul, memisahkan kebergantungan pembangun, hos dan sasaran.
- Cargo melaksanakan pilihan split-debuginfo, yang dinyatakan dalam bahagian "[profile]", dan bendera "-Csplit-debuginfo=unpacked" yang sepadan dalam rustc, menawarkan pelaksanaan kaedah baharu untuk menyimpan maklumat debug, yang menghapuskan keperluan untuk memanggil utiliti dsymutil dan mempercepatkan proses binaan dengan ketara dengan maklumat debug dalam macOS.
- "ptr::addr_of!" dan "ptr::addr_of_mut!" makro telah distabilkan, membolehkan penciptaan penunjuk mentah ke medan tidak sejajar. gunakan std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let packed = Packed { f1: 1, f2: 2 }; // &packed.f2 akan mencipta penunjuk tidak sejajar, yang membawa kepada tingkah laku tidak ditentukan biarkan raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
- Sekumpulan API baharu telah dialihkan ke kategori stabil, termasuk kaedah berikut:
- Arc::decrement_strong_count
- Arc::increment_strong_count
- Sekali::call_once_force
- Boleh dilihat::next_if_eq
- Peekable::next_if
- Cari:: kedudukan_stream
- array::IntoIter
- panik::panic_any
- ptr::addr_of!
- ptr::addr_of_mut!
- slice::fill_with
- slice::split_inclusive_mut
- slice::split_inclusive
- slice::strip_prefix
- slice::strip_suffix
- str::split_inclusive
- sync::OnceState
- tugas::Bangun
- Sokongan Tahap 3 telah dilaksanakan untuk platform i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 dan aarch64_be-unknown-linux-gnu_ilp32. Tahap 3 menyediakan sokongan asas, tetapi tanpa ujian automatik, binaan rasmi atau pengesahan binaan.
Sumber: opennet.ru
