Rilis Rust 1.38.0: kompilasi pipelined, # [usang] untuk makro dan std :: any :: type_name

Tim pengembangan Rust dengan bangga mengumumkan rilis versi baru, 1.38.0. Rust adalah bahasa pemrograman yang memungkinkan semua orang membuat perangkat lunak yang andal dan efisien.


Jika Anda menginstal versi Rust sebelumnya menggunakan Rustup, maka untuk meningkatkan ke versi 1.38.0 Anda hanya perlu menjalankan perintah berikut:


rustup update stable 

Jika Anda belum menginstal rustup, Anda dapat menginstalnya dari halaman yang sesuai di situs web kami.


Apa yang termasuk dalam versi stabil?


Sorotan dari rilis ini adalah kompilasi pipelined.


Kompilasi pipa


Kompilator tidak perlu dependensi yang dirakit sepenuhnya untuk membangun paket, tetapi hanya "metadata" mereka (daftar jenis, dependensi, ekspor, dll.) Yang dihasilkan pada tahap awal kompilasi. Dimulai dengan Rust 1.38.0, Cargo akan segera mulai membangun paket tergantung begitu metadata mereka tersedia.


Waktu pembuatan satu paket tidak berkurang, tetapi pengujian kami menunjukkan bahwa kecepatan kompilasi meningkat 10% -20% dalam kasus build optimal (di mana beberapa dependensi sudah dikompilasi). Untuk paket lain, peningkatan kecepatan kompilasi yang kuat tidak terjadi. Waktu yang dibutuhkan untuk membangun paket tergantung pada komputer, sehingga kinerjanya dapat bervariasi. Kompilasi pipa diaktifkan secara otomatis dari versi 1.38.0.


Memeriksa beberapa penyalahgunaan mem::{uninitialized, zeroed}


Seperti yang diumumkan sebelumnya , std::mem::uninitialized tidak direkomendasikan. Sebaliknya, MaybeUninit<T> harus digunakan.


Fungsi mem::uninitialized belum ditinggalkan, tetapi ini akan dilakukan dalam rilis mendatang. Tetapi meskipun demikian, mulai dari 1.38.0, rustc memeriksa kelas sempit inisialisasi yang salah menggunakan mem::uninitialized atau mem::zeroed .


Untuk beberapa jenis, seperti &T dan Box<T> , nilai nol dianggap sebagai perilaku tidak terdefinisi, karena mereka adalah objek seperti pointer yang tidak boleh null . Ini akan menjadi kesalahan untuk menggunakan mem::uninitialized atau mem::zeroed untuk menginisialisasi jenis ini, jadi kompiler akan mencoba memperingatkan Anda jika ada fungsi-fungsi ini digunakan untuk menginisialisasi objek di atas, dan tidak masalah apakah mereka diinisialisasi secara langsung atau sebagai bidang struktur besar. Pemeriksaan ini bersifat rekursif, jadi kode berikut ini berisi peringatan:


 struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() }; 

Pembaca yang penuh perhatian mungkin memperhatikan bahwa perpustakaan standar berisi lebih banyak tipe yang tidak boleh diisi dengan nol, terutama NonNull<T> dan NonZero<T> . Sejauh ini, inisialisasi struktur ini dengan mem::uninitialized atau mem::zeroed belum diverifikasi.


Pemeriksaan ini tidak mencakup semua kasus penggunaan mem::uninitialized atau mem::zeroed , tetapi memungkinkan Anda mendeteksi kode yang salah dijamin yang harus beralih ke MaybeUninit .


#[deprecated] untuk makro


Atribut #[deprecated] , pertama kali diperkenalkan di Rust 1.9.0, memungkinkan pembuat paket untuk memberi tahu pengguna tentang fungsionalitas yang sudah usang yang mereka berencana untuk hapus dalam rilis mendatang. Karat 1.38.0 memungkinkan Anda untuk menerapkan atribut ini ke makro.


std::any::type_name


Representasi string dari tipe yang digunakan mungkin diperlukan saat men-debug kode. Misalnya, di dalam tubuh fungsi generik, Anda mungkin ingin mencetak jenis argumen yang diteruskan. Sekarang ini std::any::type_name dengan std::any::type_name :


 fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); } 

Hasil:


 Initializing an instance of i32 Initializing an instance of alloc::string::String 

Seperti semua fungsi pustaka standar, hanya ditujukan untuk debugging, fungsi ini tidak menjamin konten dan format string yang tepat. Nilai kembali adalah deskripsi terbaik dari tipe; beberapa tipe dapat direpresentasikan dengan type_name sama, tetapi bisa berubah di versi kompiler yang akan datang.


Perubahan ke Perpustakaan Standar



Selain itu, beberapa fungsi telah distabilkan:



Perubahan lainnya


Sintaks , manajer paket kargo, dan penganalisa Clippy juga telah mengalami beberapa perubahan.


Anggota 1.38.0


Banyak orang datang bersama untuk membuat Rust 1.38.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 .


Artikel ini diterjemahkan bersama oleh andreevlex , nlinker , funkill , dan Gymmasssorla .

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


All Articles