Rust 1.53 dikeluarkan. Google akan membiayai penambahan sokongan Rust pada kernel Linux

Pengeluaran bahasa pengaturcaraan sistem Rust 1.53, 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:

  • Untuk tatasusunan, sifat IntoIterator telah dilaksanakan, yang membolehkan anda mengatur lelaran elemen tatasusunan mengikut nilai: untuk i dalam [1, 2, 3] { .. }

    Ia juga mungkin untuk menghantar tatasusunan kepada kaedah yang menerima iterator, contohnya: let set = BTreeSet::from_iter([1, 2, 3]); untuk (a, b) dalam some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Sebelum ini, IntoIterator hanya dilaksanakan untuk rujukan tatasusunan, i.e. untuk mengulangi nilai yang memerlukan penggunaan rujukan (β€œ&[1, 2, 3]”) atau β€œ[1, 2, 3].iter()”. Pelaksanaan IntoIterator untuk tatasusunan telah dihalang oleh isu keserasian yang disebabkan oleh penukaran pengkompil terdahulu daripada array.into_iter() kepada (&array).into_iter(). Masalah ini telah diselesaikan dengan penyelesaian - pengkompil akan terus menukar array.into_iter() kepada (&array).into_iter() seolah-olah tiada pelaksanaan sifat IntoIterator, tetapi hanya apabila memanggil kaedah menggunakan ".into_iter(). )" sintaks dan tanpa menyentuh panggilan dalam bentuk "dalam [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Adalah mungkin untuk menentukan ungkapan "|" (logik ATAU operasi) dalam mana-mana bahagian templat, sebagai contoh, bukannya β€œSesetengah(1) | Some(2)" kini anda boleh menulis "Some(1 | 2)": keputusan perlawanan { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
  • Penggunaan aksara bukan ASCII dalam pengecam dibenarkan, termasuk mana-mana aksara kebangsaan yang ditakrifkan dalam spesifikasi Unicode UAX 31, tetapi tidak termasuk aksara emoji. Jika anda menggunakan aksara yang berbeza tetapi serupa, pengkompil akan mengeluarkan amaran. const BLΓ…HAJ: &str = "🦈"; struct δΊΊ { 名字: Rentetan, } biarkan Ξ± = 1; letsos = 2; amaran: pasangan pengecam dianggap boleh keliru antara 's' dan 's'
  • Bahagian baharu API telah dipindahkan ke kategori stabil, termasuk yang berikut distabilkan:
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BtreeSet::kekalkan
    • BtreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Tempoh::ZERO
    • Tempoh::MAX
    • Tempoh::is_zero
    • Tempoh::saturating_add
    • Tempoh::saturating_sub
    • Tempoh::menepu_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator untuk tatasusunan
    • {integer}::BITS
    • io::Ralat::Tidak disokong
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Pilihan::masukkan
    • Pesanan::is_eq
    • Pesanan::is_ne
    • Pesanan::is_lt
    • Pesanan::is_gt
    • Pesanan::is_le
    • Pesanan::is_ge
    • OsStr::make_ascii_huruf kecil
    • OsStr::make_ascii_huruf besar
    • OsStr::to_ascii_huruf kecil
    • OsStr::to_ascii_huruf besar
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> untuk slice::IterMut
    • impl SliceIndex untuk (Bound , Terikat )
    • Vec:: extend_from_within
  • Tahap ketiga sokongan untuk platform wasm64-unknown-unknown telah dilaksanakan. Tahap ketiga melibatkan sokongan asas, tetapi tanpa ujian automatik, menerbitkan binaan rasmi atau menyemak sama ada kod itu boleh dibina.
  • Pengurus pakej Kargo telah dialihkan untuk menggunakan nama "utama" untuk cawangan utama repositori Git (HEAD) secara lalai. Ketergantungan yang dihoskan dalam repositori yang menggunakan nama utama dan bukannya induk tidak lagi memerlukan cawangan = "utama" untuk dikonfigurasikan.
  • Dalam pengkompil, keperluan untuk versi minimum LLVM dinaikkan kepada LLVM 10.

Di samping itu, kita boleh perhatikan peruntukan pembiayaan untuk pembangunan penyepaduan ke dalam kernel alat Linux untuk membangunkan komponen dalam bahasa Rust. Kerja-kerja itu akan dijalankan dalam rangka projek Prossimo di bawah naungan organisasi ISRG (Kumpulan Penyelidikan Keselamatan Internet), yang merupakan pengasas projek Let's Encrypt dan mempromosikan HTTPS dan pembangunan teknologi untuk meningkatkan keselamatan Internet. Dana itu akan disediakan oleh Google, yang akan membayar kerja Miguel Ojeda, pengarang projek Rust-for-Linux. Sebelum ini, ISRG dan Google telah pun membiayai penciptaan bahagian belakang HTTP alternatif untuk utiliti curl dan pembangunan modul TLS baharu untuk pelayan http Apache.

Menurut Microsoft dan Google, kira-kira 70% daripada kelemahan disebabkan oleh pengendalian memori yang tidak selamat. Adalah dijangka bahawa menggunakan bahasa Rust untuk membangunkan komponen kernel seperti pemacu peranti akan mengurangkan risiko kelemahan yang disebabkan oleh pengendalian memori yang tidak selamat dan menghapuskan ralat seperti mengakses kawasan memori selepas ia dibebaskan dan melampaui batas penimbal.

Keselamatan memori disediakan dalam Rust pada masa penyusunan melalui semakan rujukan, menjejaki pemilikan objek dan jangka hayat objek (skop), serta melalui penilaian ketepatan akses memori semasa pelaksanaan kod. Rust juga menyediakan perlindungan terhadap limpahan integer, memerlukan permulaan mandatori nilai pembolehubah sebelum digunakan, mengendalikan ralat dengan lebih baik dalam perpustakaan standard, menggunakan konsep rujukan tidak berubah dan pembolehubah secara lalai, menawarkan penaipan statik yang kuat untuk meminimumkan ralat logik.

Sumber: opennet.ru

Tambah komen