Rilis Bahasa Pemrograman Rust 1.45

diterbitkan rilis 1.45 dari bahasa pemrograman sistem Karat, didirikan oleh proyek Mozilla. Bahasa ini berfokus pada keamanan memori, menyediakan manajemen memori otomatis, dan menyediakan alat untuk mencapai paralelisme tugas yang tinggi tanpa menggunakan pengumpul sampah dan runtime.

Manajemen memori otomatis Rust menghilangkan kesalahan saat memanipulasi pointer dan melindungi terhadap masalah yang timbul dari manipulasi memori tingkat rendah, seperti mengakses wilayah memori setelah dibebaskan, dereferensi pointer nol, buffer overruns, dll. Manajer paket sedang dikembangkan untuk mendistribusikan perpustakaan, memastikan perakitan dan mengelola ketergantungan oleh proyek. Muatan, memungkinkan Anda mendapatkan perpustakaan yang diperlukan untuk program dalam satu klik. Repositori didukung untuk menghosting perpustakaan peti.io.

Utama inovasi:

  • Dieliminasi yang sudah lama ada cacat saat melakukan konversi antara bilangan bulat dan angka floating point. Karena kompiler Rust menggunakan LLVM sebagai backend, operasi konversi tipe dilakukan melalui instruksi kode perantara LLVM seperti fptoui, yang memiliki satu fitur penting - perilaku tidak terdefinisi jika nilai yang dihasilkan tidak sesuai dengan tipe target. Misalnya, saat mengonversi nilai float 300 dengan tipe f32 ke tipe integer u8, hasilnya tidak dapat diprediksi dan dapat bervariasi pada sistem yang berbeda. Masalahnya adalah fitur ini muncul pada kode yang tidak ditandai sebagai β€œtidak aman”.

    Pada Rust 1.45, perilaku overflow ukuran tipe diatur secara ketat, dan operasi konversi "sebagai" memeriksa overflow dan memaksa nilai dikonversi ke nilai maksimum atau minimum dari tipe target (untuk contoh di atas, nilai dari 300 akan dikonversi menjadi 255). Untuk menonaktifkan pemeriksaan tersebut, panggilan API tambahan β€œ{f64, f32}::to_int_unchecked” disediakan, beroperasi dalam mode tidak aman.

    fn pemeran(x: f32) -> u8 {
    x sebagai u8
    }

    fn utama() {
    biarkan terlalu_besar = 300.0;
    biarkan terlalu_kecil = -100.0;
    misalkan nan = f32::NAN;

    misalkan x: f32 = 1.0;
    misalkan y: u8 = tidak aman { x.to_int_unchecked() };

    println!("terlalu_besar_dilemparkan = {}", dilemparkan(terlalu_besar)); // keluaran 255
    println!("too_small_casted = {}", cast(terlalu_kecil)); // keluaran 0
    println!("not_a_number_casted = {}", cast(nan)); // keluaran 0
    }

  • Gunakan stabil makro proseduralekspresi, templat, dan pernyataan seperti fungsi. Sebelumnya, makro seperti itu tidak dapat dipanggil di mana pun, tetapi hanya di bagian kode tertentu (sebagai panggilan terpisah, tidak terkait dengan kode lain). Memperluas cara pemanggilan makro, mirip dengan fungsi, adalah salah satu persyaratan agar kerangka web berfungsi Roket dalam rilis stabil Rust. Sebelumnya, untuk mencapai fleksibilitas tambahan dalam menentukan penangan di Rocket, diperlukan pengaktifan fitur eksperimental yang disebut β€œproc_macro_hygiene”, yang tidak tersedia di versi stabil Rust. Fungsionalitas ini sekarang dibangun dalam rilis bahasa yang stabil.
  • Diizinkan menggunakan rentang dengan tipe "char" untuk mengulangi nilai rentang (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    untuk ch di 'a'..='z' {
    cetak!("{}", ch);
    }
    println!(); // Akan mencetak "abcdefghijklmnopqrstuvwxyz"

  • Sebagian API baru telah dipindahkan ke kategori stabil, termasuk stabil
    Busur::as_ptr,
    BTreeMap::remove_entry,
    RC::as_ptr,
    rc::Lemah::as_ptr,
    rc::Lemah::dari_mentah,
    rc::Lemah::into_raw,
    str::strip_awalan,
    str::strip_suffix,
    sinkronisasi::Lemah::as_ptr,
    sinkronisasi::Lemah::dari_raw,
    sinkronisasi::Lemah::into_raw,
    karakter::UNICODE_VERSION,
    Rentang::resolved_at,
    Rentang::terletak_di,
    Rentang::situs_campuran,
    unix::proses::CommandExt::arg0.

  • Kompiler Rustc telah menambahkan dukungan untuk mengganti berbagai fitur platform target menggunakan tanda "fitur target", misalnya, "-C target-feature=+avx2,+fma". Bendera baru juga telah ditambahkan:
    "force-unwind-tables" untuk menghasilkan tabel panggilan unwind, terlepas dari strategi penanganan kerusakan; "embed-bitcode" untuk mengontrol apakah bitcode LLVM disertakan dalam rlib yang dihasilkan. Tanda "embed-bitcode" diaktifkan secara default di Cargo untuk mengoptimalkan waktu pembuatan dan konsumsi ruang disk.

  • Dukungan tingkat ketiga telah disediakan untuk platform mipsel-sony-psp dan thumbv7a-uwp-windows-msvc. Tingkat ketiga melibatkan dukungan dasar, tetapi tanpa pengujian otomatis dan publikasi versi resmi.

Selain itu, dapat diperhatikan ceritanya tentang membuat yang paling sederhana aplikasi dalam bahasa Rust, mulai menggunakan bootloader sistem dan siap untuk memuat mandiri alih-alih sistem operasi.
Artikel ini adalah yang pertama dari seri yang didedikasikan untuk mendemonstrasikan teknik yang dibutuhkan dalam pemrograman tingkat rendah dan pengembangan OS.

Sumber: opennet.ru

Tambah komentar