Rilis bahasa pemrograman Rust 1.59 dengan dukungan untuk sisipan perakitan

Rilis bahasa pemrograman tujuan umum Rust 1.59, 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:

  • Dimungkinkan untuk menggunakan sisipan bahasa rakitan, yang dibutuhkan dalam aplikasi yang memerlukan kontrol eksekusi pada tingkat rendah atau dapat menggunakan instruksi mesin khusus. Sisipan perakitan ditambahkan menggunakan makro "asm!" dan "global_asm!" menggunakan sintaks pemformatan string untuk memberi nama register mirip dengan yang digunakan untuk substitusi string di Rust. Kompiler mendukung instruksi perakitan untuk arsitektur x86, x86-64, ARM, AArch64 dan RISC-V. Contoh penyisipan: gunakan std::arch::asm; // Kalikan x dengan 6 menggunakan shift dan tambahkan let mut x: u64 = 4; tidak aman { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "tambahkan {x}, {tmp}", x = inout(reg ) x, tmp = keluar(reg) _, ); } tegas_eq!(x, 4 * 6);
  • Menambahkan dukungan untuk penugasan yang dirusak (paralel), di mana beberapa sifat, bagian, atau struktur ditentukan di sisi kiri ekspresi. Contoh: misalkan (a, b, c, d, e); (a,b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktur { e, .. } = Struktur { e: 5, f: 3 }; menegaskan_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Kemampuan untuk menentukan nilai default untuk const generik telah disediakan: struct ArrayStorage { arr: [T; N], } impl Penyimpanan Array { fn baru(a: T, b: T) -> Penyimpanan Array { Penyimpanan Array { arr: [a, b], } } }
  • Manajer paket Cargo memberikan peringatan tentang penggunaan struktur yang tidak valid dalam dependensi yang diproses karena kesalahan dalam kompiler (misalnya, karena kesalahan, bidang struktur yang dikemas diizinkan untuk dipinjam di blok aman). Konstruksi seperti itu tidak lagi didukung di versi Rust yang akan datang.
  • Cargo dan rustic memiliki kemampuan bawaan untuk menghasilkan file yang dapat dieksekusi tanpa data debugging (strip = "debuginfo") dan simbol (strip = "symbols"), tanpa perlu memanggil utilitas terpisah. Pengaturan pembersihan diterapkan melalui parameter β€œstrip” di Cargo.toml: [profile.release] strip = β€œdebuginfo”, β€œsymbols”
  • Kompilasi tambahan dinonaktifkan secara default. Alasannya dikatakan sebagai solusi sementara untuk bug di kompiler yang menyebabkan crash dan kesalahan deserialisasi. Perbaikan bug telah disiapkan dan akan disertakan pada rilis berikutnya. Untuk mengembalikan kompilasi tambahan, Anda dapat menggunakan variabel lingkungan RUSTC_FORCE_INCREMENTAL=1.
  • Bagian baru dari API telah dipindahkan ke kategori stabil, termasuk metode dan penerapan sifat yang telah distabilkan:
    • std::thread::available_parallelism
    • Hasil::disalin
    • Hasil :: kloning
    • lengkungan::asm!
    • lengkungan::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • CobaDari untuk u8
    • char::TryFromCharError (Klon, Debug, Tampilan, PartialEq, Salin, Persamaan, Kesalahan)
    • iter::zip
    • BukanZeroU8::is_power_of_two
    • BukanZeroU16::is_power_of_two
    • BukanZeroU32::is_power_of_two
    • BukanZeroU64::is_power_of_two
    • BukanZeroU128::is_power_of_two
    • DoubleEndedIterator untuk struktur ToLowercase
    • DoubleEndedIterator untuk struktur ToUppercase
    • CobaDari<&mut [T]> untuk [T; N]
    • UnwindSafe untuk struktur Sekali
    • RefUnwindSafe untuk Sekali
    • fungsi dukungan armv8 neon yang dibangun ke dalam kompiler untuk aarch64
  • Atribut β€œconst”, yang menentukan kemungkinan menggunakannya dalam konteks apa pun alih-alih konstanta, digunakan dalam fungsi:
    • mem::MungkinUninit::as_ptr
    • mem::MungkinUninit::assume_init
    • mem::MungkinUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_tidak dicentang

Sumber: opennet.ru

Tambah komentar