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;
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
Makro dbg!
mulai mendukung banyak argumen;
Beberapa metode menjadi konstan:
Beberapa API distabilkan, termasuk:
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 .