Rilis bahasa pemrograman tujuan umum Rust 1.82, yang didirikan oleh proyek Mozilla, tetapi sekarang dikembangkan di bawah naungan organisasi nirlaba independen Rust Foundation, telah diterbitkan. Bahasa berfokus pada keamanan memori dan menyediakan sarana untuk mencapai paralelisme pekerjaan yang tinggi sambil menghindari penggunaan pengumpul sampah dan runtime (runtime dikurangi menjadi inisialisasi dasar dan pemeliharaan perpustakaan standar).
Metode penanganan memori Rust menyelamatkan pengembang dari kesalahan saat memanipulasi pointer dan melindungi dari masalah yang muncul karena penanganan memori tingkat rendah, seperti mengakses area memori setelah dibebaskan, dereferencing null pointer, buffer overruns, dll. Untuk mendistribusikan pustaka, menyediakan build, dan mengelola dependensi, proyek mengembangkan manajer paket Cargo. Repositori crates.io didukung untuk hosting perpustakaan.
Keamanan memori disediakan di Rust pada waktu kompilasi melalui pemeriksaan referensi, melacak kepemilikan objek, melacak masa pakai objek (cakupan), dan menilai kebenaran akses memori selama eksekusi kode. Rust juga memberikan perlindungan terhadap integer overflow, membutuhkan inisialisasi wajib dari nilai variabel sebelum digunakan, menangani kesalahan dengan lebih baik di perpustakaan standar, menerapkan konsep referensi dan variabel yang tidak dapat diubah secara default, menawarkan pengetikan statis yang kuat untuk meminimalkan kesalahan logis.
Inovasi utama:
- Perintah “info” telah ditambahkan ke manajer paket kargo untuk menampilkan informasi tentang suatu paket di repositori.
- Menambahkan dukungan untuk sintaks "use<..>" di "impl Trait", yang menentukan informasi tentang tipe tersembunyi. Misalnya, "impl Trait + use<'x, T>" menetapkan bahwa hanya parameter "x" dan "T" yang boleh digunakan dalam tipe tersembunyi.
- Sintaks terpisah untuk membuat pointer mentah telah diusulkan, menggantikan makro yang digunakan sebelumnya: makro “addr_of!(expr)” telah digantikan oleh operator “&raw const expr”, dan makro “addr_of_mut!(expr)” telah diganti oleh operator "&raw mut" expr". struct Dikemas { not_aligned_field: i32, } fn main() { biarkan p = Dikemas { not_aligned_field: 1_82 }; // Cara lama untuk membuat pointer mentah let ptr = std::ptr::addr_of!(p.not_aligned_field); // Cara baru untuk membuat pointer mentah let ptr = &raw const p.not_aligned_field; biarkan val = tidak aman { ptr.read_unaligned() }; }
- Dimungkinkan untuk mendefinisikan fungsi dan konstanta aman dengan masa pakai 'statis' di dalam blok eksternal dengan atribut "tidak aman" (sebelumnya, semua elemen dalam "eksternal tidak aman" hanya dapat memiliki atribut "tidak aman"): unsafe extern { pub safe TAU statis : f64; brankas pub fn sqrt(x: f64) -> f64; pub tidak aman fn strlen(p: *const u8) -> gunakan; }
- Atribut no_mangle, link_section, dan nama_ekspor, yang dapat menyebabkan perilaku tidak terdefinisi, kini dianggap tidak aman dan memerlukan tanda "tidak aman" yang eksplisit, misalnya: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Pencocokan pola memungkinkan tipe kosong dilewati, seperti "enum Void {}" atau struktur dengan bidang kosong yang terlihat. gunakan std::convert::Infallible; pub fn unwrap_without_panic (x: Hasil ) -> T { misalkan Ok(x) = x; // "Err" dapat dilewati x }
- Tipe bilangan floating point (f32 dan f64) memiliki perilaku standar saat memproses nilai NaN non-numerik (0.0/0.0), dan juga mengizinkan penggunaan operasi floating point di const fn.
- Sisipan perakitan menyediakan kemampuan untuk menggunakan operan dengan atribut "const" untuk langsung menggunakan nilai numerik integer tanpa terlebih dahulu menyimpannya dalam register. const MSG: &str = "Halo, dunia!\n"; tidak aman { core::arch::asm!( “mov rdx, {LEN} // instruksi 'mov rdx, 14′” akan dihasilkan, LEN = const MSG.len(), … ); }
- Mengatasi ekspresi dengan atribut "statis" diperbolehkan dalam konteks aman tanpa mendefinisikan blok yang tidak aman (operator "&raw mut" dan "&raw const" tidak memengaruhi nilai operan dan hanya membuat penunjuk ke sana): static mut STATIC_MUT: Tipe = Tipe::baru( ); eksternal "C" { static EXTERN_STATIC: Ketik; } fn main() { biarkan static_mut_ptr = &raw mut STATIC_MUT; biarkan extern_static_ptr = &raw const EXTERN_STATIC; }
- Bagian baru dari API telah dipindahkan ke kategori stabil, termasuk metode dan penerapan sifat yang telah distabilkan:
- std::thread::Builder::spawn_tidak dicentang
- std::str::CharIndices::offset
- std::pilihan::Pilihan::is_none_or
- [T]::diurutkan
- [T]::is_sorted_by
- [T]::is_sorted_by_key
- Iterator::is_sorted
- Iterator::is_sorted_by
- Iterator::is_sorted_by_key
- std::masa depan::Siap::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator untuk Pengambilan
Sumber: opennet.ru
