Rilis Rust 1.36.0: Sifat masa depan, stabilisasi alokasi, dan MaybeUninit

Saya sajikan kepada Anda terjemahan publikasi pada versi baru dari bahasa pemrograman favorit semua orang.


Pendahuluan


Tim bahasa pemrograman Rust dengan bangga mengumumkan versi baru, 1.36.0. Rust adalah bahasa pemrograman yang memungkinkan setiap orang untuk mengembangkan perangkat lunak yang andal dan cepat.


Jika Anda menginstal versi Rust sebelumnya menggunakan rustup , mendapatkan versi saat ini tidak akan sulit:


 $ rustup update stable 

Jika Anda masih belum memiliki rustup , Anda bisa mendapatkannya dari halaman yang sesuai di situs web kami. Ulasan terperinci dari rilis ini tersedia di GitHub.


Apa yang termasuk dalam versi stabil?


Rilis ini telah membuat banyak perubahan, termasuk stabilisasi sifat Future telah lama ditunggu-tunggu, alokasi alloc , MaybeUninit<T> , NLL Rust 2015 , implementasi baru HashMap<K, V> dan dukungan untuk bendera --offline di Cargo.


Perubahan paling signifikan dijelaskan di bawah ini, namun Anda juga dapat melihat daftar detail inovasi untuk kesadaran tambahan.


Stabilisasi Masa Depan


Rust 1.36.0 menstabilkan Future telah lama ditunggu-tunggu!


Kami berharap bahwa inovasi ini akan memungkinkan peti, perpustakaan dan seluruh ekosistem populer untuk mempersiapkan .await async / .await , yang direncanakan akan distabilkan dalam waktu dekat.


Distribusikan stabilisasi rak


Sebelum versi 1.36.0, pustaka standar terdiri dari proc_macro std , core dan proc_macro . core memiliki fungsionalitas dasar (seperti Iterator dan Copy ) dan dapat digunakan di lingkungan dengan #![no_std] , karena tidak memaksakan persyaratan apa pun. Sementara itu, std peti menyediakan jenis-jenis seperti Box<T> , serta fungsionalitas sistem operasi (pengalokasi global).


Dimulai dengan Rust 1.36.0, komponen dari peti std , tergantung pada pengalokasi global, misalnya, Vec<T> , sekarang tersedia di alloc alokasi. std , sementara itu, mengekspor kembali komponen-komponen ini.


Sementara program #![no_std] menggunakan kotak alloc masih membutuhkan saluran nightly , #![no_std] c #![no_std] bisa menggunakan kotak alloc di Rust yang stabil.


Kami juga mencatat bahwa semua program "reguler" (tanpa #![no_std] ) dalam dependensinya dapat berisi pustaka yang dijelaskan di atas dengan #![no_std] . Kami berharap ini akan membantu mengembangkan ekosistem yang kompatibel dengan #![no_std] .


Jika Anda adalah pengembang perpustakaan yang membutuhkan alokasi primitif untuk berfungsi, kami sarankan menandai perpustakaan Anda sebagai kompatibel dengan #![no_std] menggunakan sintaks berikut di awal file lib.rs :


 #![no_std] extern crate alloc; use alloc::vec::Vec; 

MungkinUninit tempat mem :: tidak diinisialisasi


Dalam rilis Rust sebelumnya, fungsi mem::uninitialized memungkinkan Anda untuk membatalkan pemeriksaan inisialisasi karena mengira Anda SUDAH diinisialisasi untuk mengetik T tanpa melakukan apa pun. Salah satu kegunaan fungsi ini adalah alokasi array "malas".


Namun, mem::uninitalized adalah operasi yang terlalu berbahaya yang tidak dapat digunakan dengan benar dengan kompiler Rust, dengan asumsi bahwa semua nilai diinisialisasi dengan benar.


Misalnya, memanggil mem::uninitialized::<bool>() akan segera menyebabkan perilaku yang tidak terdefinisi , karena dari sudut pandang Rust, bit yang tidak diinisialisasi adalah nol ( false ) atau unity ( true ), dan hanya dua pola di atas yang cocok untuk tipe bool .


Untuk mengatasi situasi ini, tipe MaybeUninit<T> distabilkan di Rust 1.36.0. Kompiler Rust tidak lagi berasumsi MaybeUninit<T> adalah tipe T diinisialisasi Dengan cara ini, Anda dapat melakukan inisialisasi bertahap lebih aman dan akhirnya menggunakan .assume_init() ketika Anda yakin maybe_t: MaybeUninit<T> berisi tipe inisialisasi T


Karena MaybeUninit<T> adalah alternatif yang lebih aman dimulai dengan Rust 1.38, fungsi mem::uninitialized akan ditandai usang.


Untuk mempelajari lebih lanjut tentang memori tidak diinisialisasi, mem::uninitialized dan MaybeUninit<T> , baca artikel oleh Alexis Bessessner . Pustaka standar juga berisi dokumentasi yang memadai tentang MaybeUninit<T> .


NLL untuk Rust 2015


Dalam pengumuman Rust 1.31.0, kami memberi tahu Anda tentang NLL (garis waktu kehidupan non-leksikal), sebuah inovasi dalam bahasa yang membuat pengontrol tautan (peminjam cek) lebih pintar dan ramah. Misalnya, sekarang Anda dapat menulis seperti ini:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; //     1.31.0 } 

Pada 1.31.0, NLL distabilkan hanya untuk Rust 2018, dan diasumsikan bahwa kami akan mentransfernya ke Rust 2015 di masa depan. Ini dilakukan di Rust 1.36.0, NLL menjadi tersedia untuk Rust 2015.


Dengan NLL yang didukung di kedua versi, kami mendekati penghapusan pengontrol tautan lama. Namun, pengontrol tautan lama, sayangnya, menerima kode yang salah , yang seharusnya TIDAK diterima.


Dan, sebagai hasilnya, NLL sekarang pada tahap "migrasi", di mana kami akan mengeluarkan peringatan alih-alih kesalahan jika pengontrol tautan NLL tidak menyetujui kode yang akan menyetujui pengontrol tautan berbasis AST lama. Kami menyarankan Anda untuk melihat daftar peti umum yang terpengaruh .


Untuk mempelajari lebih lanjut tentang NLL, MIR, cara memperbaiki masalah integritas terkait, dan apa yang dapat dilakukan dengan peringatan penyusun yang muncul, baca artikel Felix Klok .


Implementasi HashMap Baru


Di Rust 1.36.0, implementasi HashMap<K, V> sebelumnya digantikan oleh hashbrown hashbrown berdasarkan desain SwissTable . Antarmuka tetap sama, tetapi implementasi saat ini rata-rata lebih cepat dan mengkonsumsi lebih sedikit memori. Namun, perhatikan bahwa implementasi standar masih menggunakan algoritma SipHash 1-3 .


- Dukungan offline di Cargo


Selama sebagian besar pembuatan, Cargo tidak menggunakan jaringan Anda. Namun, di beberapa titik, misalnya, ketika ketergantungan baru ditambahkan, Cargo akan tetap mencoba mengakses jaringan. Terkadang perilaku ini tidak dapat diterima (dalam sistem yang terisolasi atau di dalam pesawat terbang).


Rust 1.36.0 telah menstabilkan flag --offline . Bendera ini mengesampingkan algoritma resolusi ketergantungan, alih-alih menggunakan dependensi cache lokal.


Jika peti yang diminta tidak tersedia tanpa jaringan yang telah diputus, maka Cargo akan keluar dengan kesalahan. Untuk mengisi lebih dulu cache lokal sebelum meninggalkan jaringan, gunakan perintah cargo fetch , yang memuat semua dependensi yang diperlukan untuk proyek tertentu.


Untuk mempelajari lebih lanjut tentang - --offline dan cargo fetch , baca artikel Nick Cameron . Perubahan lain pada Cargo dijelaskan secara rinci di sini .


Perubahan perpustakaan



Perubahan lainnya


Deskripsi perubahan terperinci dalam versi 1.36.0 tersedia untuk Rust , perpustakaan standar , Cargo , dan Clippy .


Anggota 1.36.0


Banyak orang datang bersama untuk membuat Rust 1.36.0. Kami tidak bisa melakukan ini tanpa kalian semua, terima kasih !


Dari penerjemah


Dengan pertanyaan tentang bahasa Rust, mereka akan dapat membantu Anda dalam obrolan Telegram berbahasa Rusia atau dalam obrolan serupa untuk pendatang baru .


Source: https://habr.com/ru/post/id458848/


All Articles