Rilis Rust 1.37.0: Optimalisasi Terpandu Profil, konstanta tanpa nama dan vendor kargo

Kami sajikan kepada Anda terjemahan publikasi pada versi baru bahasa pemrograman Rust tercinta.


Pendahuluan


Tim pengembangan Rust dengan bangga mengumumkan rilis versi baru, 1.37.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.37.0 Anda hanya perlu menjalankan perintah berikut:


$ rustup update stable 

Jika Anda belum menginstal rustup , Anda dapat menginstalnya dari halaman terkait situs web kami, serta melihat catatan rilis terperinci di GitHub.


Apa yang termasuk dalam versi stabil?


Inovasi besar dalam Rust 1.37.0 mencakup tautan ke opsi enum melalui alias tipe, cargo vendor , konstanta tanpa nama, pengoptimalan berpemandu profil, kunci yang default-run untuk proyek-proyek Kargo dan #[repr(align(N))] untuk enumerasi. Lihat catatan rilis terperinci untuk informasi lebih lanjut.


Tautan ke opsi enum melalui alias ketik


Dimulai dengan Rust 1.37.0, referensi opsi enum dimungkinkan melalui tipe alias:


 type ByteOption = Option<u8>; fn increment_or_zero(x: ByteOption) -> u8 { match x { ByteOption::Some(y) => y + 1, ByteOption::None => 0, } } 

Di blok impl Self bertindak sebagai alias tipe, oleh karena itu di Rust 1.37.0 menjadi mungkin untuk merujuk ke opsi enumerasi menggunakan sintaks Self::Variant :


 impl Coin { fn value_in_cents(&self) -> u8 { match self { Self::Penny => 1, Self::Nickel => 5, Self::Dime => 10, Self::Quarter => 25, } } } 

Lebih khusus lagi, sekarang Rust memungkinkan Anda untuk merujuk ke opsi enumerasi melalui "resolusi tipe-relatif" , <MyType<..>>::Variant . Deskripsi yang lebih terperinci tersedia dalam laporan stabilisasi .


Dukungan Kargo Asli untuk Ketergantungan Vendor


Setelah beberapa tahun berdiri sebagai paket terpisah , tim cargo vendor sekarang terintegrasi ke dalam Cargo. Perintah ini mengekstrak semua dependensi proyek Anda ke direktori vendor/ dan menunjukkan fragmen konfigurasi yang diperlukan untuk menggunakan kode vendor selama perakitan.


cargo vendor sudah digunakan dalam proyek nyata: compiler rustc menggunakannya untuk mengirim semua dependensinya untuk melepaskan tarball, dan proyek dengan repositori mono menggunakannya untuk memperbaiki kode dependensi dalam kontrol versi.


Menggunakan konstanta yang tidak disebutkan namanya dalam makro


Sekarang Anda dapat membuat (unnamed) (const ) tanpa nama dengan mengganti pengenalnya dengan garis bawah ( _ ). Misalnya, dalam kompiler rustc kami menemukan kode ini:


 ///   ,    ///  ,   -  . #[macro_export] macro_rules! static_assert_size { ($ty:ty, $size:expr) => { const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()]; // ^    . } } static_assert_size!(Option<Box<String>>, 8); // 1. static_assert_size!(usize, 8); // 2. 

Perhatikan static_assert_size!(..) kedua static_assert_size!(..) : berkat penggunaan konstanta yang tidak disebutkan namanya, menjadi mungkin untuk mencegah konflik nama saat mendeklarasikan elemen baru. Sebelumnya Anda harus menulis static_assert_size!(MY_DUMMY_IDENTIFIER, usize, 8); . Dengan diperkenalkannya konstanta yang tidak disebutkan namanya, menjadi lebih mudah untuk membuat makro deklaratif dan prosedural yang ergonomis dan dapat digunakan kembali untuk keperluan analisis statis.


Pengoptimalan berpandu profil


Profile-Guided Optimization (PGO) sekarang tersedia di rustc compiler, yang dapat diaktifkan melalui flag -C profile-generate dan -C profile-use compiler -C profile-use .


Profile-Guided Optimization adalah teknik optimisasi perangkat lunak kompiler yang menganalisis uji coba alih-alih kode sumber. Ia bekerja dengan menyusun program untuk optimasi dalam dua tahap:


  1. Pertama, program dibuat menggunakan alat yang dibangun ke dalam kompiler. Ini dilakukan dengan melewati flag rustc -C profile-generate . Kemudian program alat harus dijalankan pada sampel data dan selanjutnya akan menulis profil data ke file.
  2. Program kemudian rustc lagi , kali ini meneruskan data profil yang dikumpulkan kembali ke rustc menggunakan flag -C profile-use menggunakan -C profile-use . Majelis ini akan menggunakan data yang dikumpulkan untuk memungkinkan kompiler membuat keputusan yang lebih baik tentang penempatan kode, penyematan, dan optimisasi lainnya.

Untuk informasi lebih lanjut tentang Optimalisasi yang Dipandu Profil, lihat bab terkait dalam buku penyusun rustc .


Memilih file yang dapat dieksekusi dalam proyek Cargo


cargo run adalah alat yang sangat mudah untuk menguji aplikasi konsol dengan cepat. Ketika beberapa file yang dapat dieksekusi hadir dalam satu paket, Anda harus secara eksplisit mendeklarasikan nama file yang dapat dieksekusi yang ingin Anda jalankan menggunakan flag --bin . Hal ini membuat cargo run tidak ergonomis seperti yang kita inginkan, terutama ketika executable tertentu lebih sering dipanggil daripada yang lain.


Rust 1.37.0 menyelesaikan masalah ini dengan menambahkan kunci default-run baru ke Cargo.toml (bagian [package] ). Jadi, jika flag --bin tidak --bin , Cargo akan meluncurkan file biner yang dinyatakan dalam konfigurasi.


#[repr(align(N))] untuk enumerasi


Dimulai dengan Rust 1.37.0, atribut #[repr(align(N))] dapat digunakan untuk menentukan perataan enumerasi dalam memori (sebelumnya atribut ini hanya diperbolehkan untuk struktur ( struct ) dan serikat pekerja ( union )). Misalnya, enumerasi Align16 akan, seperti yang diharapkan, memiliki perataan 16 byte, sedangkan perataan alami tanpa #[repr(align(16))] akan menjadi 4 :


 #[repr(align(16))] enum Align16 { Foo { foo: u32 }, Bar { bar: u32 }, } 

Semantik menggunakan #[repr(align(N)) untuk enumerasi sama dengan mendefinisikan pembungkus untuk struktur AlignN<T> dengan penyelarasan ini, dan kemudian menggunakan AlignN<MyEnum> :


 #[repr(align(N))] struct AlignN<T>(T); 

Perubahan ke Perpustakaan Standar


Karat 1.37.0 menstabilkan komponen pustaka standar berikut:



Perubahan lainnya


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


Anggota 1.37.0


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


Sponsor Infrastruktur Karat Baru


Kami ingin mengucapkan terima kasih kepada dua sponsor infrastruktur Rust baru yang menyediakan sumber daya yang diperlukan untuk membangun Rust 1.37.0: Amazon Web Services (AWS) dan Microsoft Azure:


  • AWS menyediakan hosting untuk artefak rilis (kompiler, perpustakaan, alat, dan kode sumber), memberikan akses ke artefak ini kepada pengguna melalui CloudFront, mencegah regresi EC2 dari Crater, dan mengelola infrastruktur lain yang terkait dengan Karat yang diinangi di AWS.
  • Untuk pengujian yang sangat menuntut repositori rust-lang / rust, Microsoft Azure menyediakan pembangun.

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 , ozkriff , funkill , dan Gymmasssorla .

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


All Articles