Rust 1.32 Rilis

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


Jika Anda memiliki versi Rust yang diinstal sebelumnya menggunakan rustup , maka untuk meningkatkan versi Rust ke versi 1.32.0 Anda hanya perlu melakukan:


 $ rustup update stable 

Jika Anda belum menginstal rustup , Anda dapat menginstalnya dari halaman yang sesuai di situs web kami. Catatan rilis terperinci untuk Rust 1.32.0 tersedia di GitHub.


Catatan rustup : beberapa rilis baru telah rustup ! Untuk memperbarui rustup sendiri, lakukan rustup self update .

Apa yang termasuk dalam versi stabil 1.32.0


Rust 1.32.0 memperoleh beberapa peningkatan yang meningkatkan kualitas hidup, mengubah pengalokasi memori default, dan menjadikan lebih banyak fungsi konstan. Baca tentang perubahan ini di bawah atau lihat lebih banyak di catatan rilis .


Dbg makro


Mari kita mulai dengan peningkatan yang meningkatkan kehidupan. Apakah Anda menggunakan print debugging? Jika demikian, dan Anda ingin mencetak beberapa nilai saat mengerjakan kode, Anda terpaksa melakukan ini:


 let x = 5; println!("{:?}", x); //    println!("{:#?}", x); 

Ini bukan hambatan terbesar memperlambat pengembangan, tetapi terlalu banyak upaya untuk hanya men-debug output dari nilai x . Selain itu, konteks tidak diperhitungkan di sini. Jika Anda memiliki beberapa println! seperti itu println! Jadi, menjadi sulit untuk menentukan apa yang dimaksud oleh keluaran, sampai Anda sendiri menambahkan informasi konteks untuk setiap panggilan, yang bahkan membutuhkan lebih banyak pekerjaan.


Untuk tujuan ini, di Rust 1.32.0 kami menambahkan dbg makro baru! :


 fn main() { let x = 5; dbg!(x); } 

Setelah memulai program ini, Anda akan melihat:


 [src/main.rs:4] x = 5 

Bersama dengan nama variabel dan nilainya, nama file dan nomor baris tempat panggilan dbg! dibuat akan ditampilkan dbg! .


Selain itu, println! mencetak ke output standar, jadi lebih baik menggunakan eprintln! untuk mencetak ke aliran kesalahan standar. Makro dbg! output ke stderr , dan memang demikian.


Ini bekerja bahkan dalam kasus-kasus sulit. Pertimbangkan contoh implementasi faktorial:


 fn factorial(n: u32) -> u32 { if n <= 1 { n } else { n * factorial(n - 1) } } 

Untuk men-debug-nya, kita bisa menggunakan eprintln! :


 fn factorial(n: u32) -> u32 { eprintln!("n: {}", n); if n <= 1 { eprintln!("n <= 1"); n } else { let n = n * factorial(n - 1); eprintln!("n: {}", n); n } } 

Kami ingin menghasilkan n pada setiap iterasi dan melihat konteks masing-masing cabang. Untuk factorial(4) akan ditampilkan:


 n: 4 n: 3 n: 2 n: 1 n <= 1 n: 2 n: 6 n: 24 

Ini dapat diterima, tetapi tidak terlalu baik. Mungkin kita dapat bekerja untuk meningkatkan keluaran informasi konteks untuk membuat kesimpulan lebih jelas. Namun, alih-alih men-debug kode kami, kami akan meningkatkan kode debug.


Pertimbangkan contoh yang sama menggunakan dbg! :


 fn factorial(n: u32) -> u32 { if dbg!(n <= 1) { dbg!(1) } else { dbg!(n * factorial(n - 1)) } } 

Kami hanya membungkus makro dengan masing-masing ekspresi yang ingin kami hasilkan. Sebagai hasilnya, kita mendapatkan:


 [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = true [src/main.rs:4] 1 = 1 [src/main.rs:5] n * factorial(n - 1) = 2 [src/main.rs:5] n * factorial(n - 1) = 6 [src/main.rs:5] n * factorial(n - 1) = 24 [src/main.rs:11] factorial(4) = 24 

Karena makro adalah dbg! mengembalikan nilai debug itu sendiri, tidak seperti eprintln! , yang mengembalikan () , maka kita tidak perlu membuat perubahan apa pun pada struktur kode kita. Selain itu, kami mendapatkan kesimpulan yang jauh lebih bermanfaat.


Kami memperhatikan makro sekecil itu, karena kami berharap ini akan menyederhanakan proses debug Anda. Tentu saja, kami juga terus berupaya mendukung gdb and Co.


jemalloc dihapus secara jemalloc


Sekali waktu, Rust memiliki runtime besar yang mirip dengan Erlang. Baginya, jemalloc dipilih daripada pengalokasi sistem, karena sering lebih produktif. Lambat laun, kami semakin banyak menghilangkan runtime dan pada akhirnya, hampir semuanya telah dihapus, tetapi jemalloc tetap ada. Kami tidak memiliki cara untuk memilih pengalokasi khusus, dan oleh karena itu kami tidak dapat menghapus jemalloc sepenuhnya, sehingga tidak membahayakan mereka yang membutuhkannya.


Selain itu, pernyataan bahwa jemalloc selalu menjadi jemalloc default terutama terkait dengan dunia UNIX, karena itu secara default hanya pada beberapa platform. Secara khusus, tujuan MSVC pada Windows telah lama menggunakan pengalokasi sistem.


Akhirnya, walaupun jemalloc biasanya memiliki kinerja yang baik, ini tidak selalu terjadi. Selain itu, ia menambahkan sekitar 300 kilobyte untuk setiap executable. Kami juga telah mengumpulkan banyak masalah lain dengan jemalloc. Secara umum, aneh bahwa bahasa sistem tidak menggunakan pengalokasi sistem secara default.


Untuk alasan ini, segera setelah Rust 1.28 menyediakan cara untuk memilih pengalokasi global , kami mulai berencana untuk beralih ke pengalokasi sistem default dan menyediakan jemalloc sebagai perpustakaan eksternal. Di Rust 1.32, kami akhirnya menyelesaikan pekerjaan ini, dan sekarang secara default program Anda akan menggunakan pengalokasi sistem.


Jika Anda ingin terus menggunakan jemalloc, gunakan perpustakaan jemallocator . Untuk melakukan ini, tentukan dalam Cargo.toml :


 jemallocator = "0.1.8" 

Dan di file root proyek Anda:


 #[global_allocator] static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; 

Itu saja! Jika Anda tidak memerlukan jemalloc, Anda tidak lagi dipaksa untuk menggunakannya, tetapi jika Anda membutuhkannya, maka masalahnya diselesaikan dengan beberapa baris kode.


Perbaikan sistem modul akhir


Dalam dua rilis terakhir, kami berbicara tentang beberapa peningkatan pada sistem modul. Dalam 1.32.0 dan edisi 2018, kami menambahkan perubahan terbaru. Ini disebut "jalur seragam" dan memungkinkan Anda untuk bekerja dengan jalur impor dengan cara yang sama dengan jalur lainnya, yang sebelumnya bekerja secara salah. Sebagai contoh:


 enum Color { Red, Green, Blue } use Color::*; 

Kode ini belum dikompilasi sebelumnya , karena jalur yang use seharusnya dimulai dengan super , self atau crate . Sekarang, berkat kompiler yang mendukung jalur yang konsisten, kode ini akan bekerja dan melakukan apa yang Anda harapkan: mengimpor varian enumerasi Color ditentukan di atas.


Perubahan ini melengkapi revisi kami terhadap sistem modul. Kami harap Anda menikmati menggunakan sistem yang disederhanakan!


Peningkatan Makro


Rust 1.32.0 telah merilis beberapa peningkatan makro. Pertama, specifier fragmen literal baru ditambahkan:


 macro_rules! m { ($lt:literal) => {}; } fn main() { m!("some string literal"); } 

Fragmen literal dipetakan ke literal jenis apa pun: string, numerik, dan karakter.


Dalam macro_rules 2018 macro_rules dapatkah Anda menggunakan macro_rules juga ? :


 macro_rules! bar { ($(a)?) => {} } 

Fragmen dengan ? nol atau satu kejadian akan dicocokkan, sama seperti sebuah fragmen dengan * sudah cocok dengan kejadian "nol atau lebih", dan dengan + - satu kejadian atau lebih.


Stabilisasi perpustakaan standar


Makro dbg! , yang sudah kami jelaskan di atas, telah menjadi tambahan penting untuk perpustakaan standar. Selain itu, 19 fungsi dibuat konstan dan semua tipe primitif numerik menerima fungsi konversi ke array byte dan sebaliknya dengan urutan byte yang ditentukan. Ada enam fungsi dengan nama to_<endian>_bytes dan from_<endian>_bytes , di mana <endian> adalah:


  • orde baru (asli endianness)
  • le - order dari junior ke senior (little endian)
  • be - order dari yang tertua ke yang termuda (big endian)

Lihat catatan rilis untuk lebih jelasnya.


Peningkatan Kargo


Cargo menerima alias kargo c untuk perintah pemeriksaan kargo , dan sekarang memungkinkan nama pengguna untuk digunakan dalam URL repositori .


Lihat catatan rilis untuk lebih jelasnya.


Pengembang 1.32.0


Banyak orang bersama-sama menciptakan Rust 1.32.0. Kami tidak dapat menyelesaikan pekerjaan tanpa Anda masing-masing. Terima kasih


Dari seorang penerjemah: Saya mengucapkan terima kasih khusus kepada anggota komunitas Rustycrate dan secara pribadi @dashadee dan ozkriff atas bantuan mereka dengan terjemahan dan proofreading.

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


All Articles