Rilis Rust 1.31 dan Rust 2018

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


Jika Anda memiliki versi Rust sebelumnya yang diinstal menggunakan rustup , maka untuk meningkatkan versi Rust ke versi 1.31.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.31.0 tersedia di GitHub.


Apa yang termasuk dalam versi stabil 1.31.0


Rust 1.31 bisa dibilang rilis paling signifikan sejak Rust 1.0! Iterasi pertama "Rust 2018" termasuk dalam rilis ini, tetapi ini bukan satu-satunya inovasi! Tinjauan perbaikan akan lama, jadi di sini adalah daftar isi:


  • Karat 2018
    • Masa hidup non-leksikal
    • Modul sistem berubah
  • Aturan tambahan untuk menampilkan masa hidup
  • const fn
  • Alat baru
  • Pemeriksaan kualitas kode instrumental
  • Dokumentasi
  • Kelompok Kerja Subjek
  • Situs web baru
  • Stabilisasi perpustakaan standar
  • Peningkatan Kargo
  • Rilis Pengembang

Karat 2018


Kami menulis tentang Rust 2018 untuk pertama kalinya di bulan Maret , dan kemudian di bulan Juli . Untuk detail mengapa Anda membutuhkan Rust 2018, lihat publikasi ini. Dalam ulasan ini, ada banyak hal yang perlu diceritakan kepada kami, jadi kami hanya akan fokus pada apa yang dimaksud dengan Rust 2018. Anda juga dapat membacanya di posting di Mozilla Hacks ( terjemahan ).


Singkatnya, Rust 2018 adalah kesempatan untuk mengintegrasikan semua pekerjaan yang telah kami lakukan selama tiga tahun terakhir ke dalam keseluruhan yang koheren. Rust 2018 lebih dari sekadar perbaikan bahasa. Selain mereka, itu termasuk:


  • Toolkit (dukungan dalam IDE, rustfmt , Clippy)
  • Dokumentasi
  • Kelompok kerja subjek
  • Situs web baru

Selanjutnya kita akan membicarakan semua ini secara lebih rinci dan tentang inovasi lainnya.


Mari buat proyek baru menggunakan Cargo:


 $ cargo new foo 

Inilah isi Cargo.toml :


 [package] name = "foo" version = "0.1.0" authors = ["Your Name <you@example.com>"] edition = "2018" [dependencies] 

Kunci baru telah ditambahkan ke bagian [package] : edition . Harap dicatat bahwa itu diinstal pada 2018 . Anda juga dapat menginstalnya di 2015 - nilai ini akan ditetapkan secara default jika kunci tidak ada.


Menggunakan Rust 2018 akan membuka kunci beberapa fitur baru yang tidak diizinkan di Rust 2015.


Penting untuk dicatat bahwa setiap paket bisa dalam mode 2015 atau 2018, dan mereka akan bekerja bersama. Proyek edisi 2018 Anda dapat menggunakan dependensi edisi 2015, dan proyek edisi 2015 dapat menggunakan dependensi edisi 2018. Ini memastikan integritas ekosistem dan bahwa semua fitur baru akan opsional, sambil mempertahankan kompatibilitas dengan kode yang ada. Selain itu, ketika Anda memutuskan untuk memasukkan kode Rust 2015 ke Rust 2018, perubahan dapat dilakukan secara otomatis melalui cargo fix .


Anda mungkin bertanya: bagaimana dengan fitur-fitur baru itu sendiri? Pertama, mereka juga ditambahkan di Rust 2015, jika mereka kompatibel dengan fitur-fitur edisi ini. Dengan demikian, sebagian besar bahasanya tetap sama di mana-mana. Anda dapat melihat manual editorial untuk mengetahui versi minimum rustc untuk setiap fitur baru dan persyaratan lainnya. Namun, ada beberapa inovasi besar yang perlu disebutkan secara terpisah: masa hidup non-leksikal dan beberapa perubahan dalam sistem modul.


Masa hidup non-leksikal


Jika Anda telah mengikuti Rust selama beberapa tahun terakhir, Anda terkadang menemukan istilah "NLL" atau "masa hidup non-leksikal". Ini adalah jargon, yang, secara sederhana, berarti: peminjam telah menjadi lebih pintar dan sekarang menerima beberapa kode yang benar, yang ditolak sebelumnya. Pertimbangkan sebuah contoh:


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

Karat yang digunakan untuk melempar kesalahan kompilasi:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | 6 | let z = &mut x; | ^ mutable borrow occurs here 7 | } | - immutable borrow ends here 

Ini karena bidang kehidupan tautan didefinisikan "secara leksikal"; yaitu, meminjam y dianggap aktif sampai y keluar dari ruang lingkup di akhir main , bahkan jika kita tidak pernah menggunakan y di dalam lingkup lagi. Semuanya baik-baik saja dengan kode di atas, tetapi penganalisis ketergantungan tidak dapat memahami ini.


Sekarang kode ini dikompilasi dengan baik.


Tetapi bagaimana jika kita menggunakan y ? Misalnya, seperti ini:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; println!("y: {}", y); } 

Rust dulu memberi Anda kesalahan ini:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | let z = &mut x; | ^ mutable borrow occurs here ... 8 | } | - immutable borrow ends here 

Di Rust 2018, pesan kesalahan ini membaik:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:13 | 4 | let y = &x; | -- immutable borrow occurs here 5 | let z = &mut x; | ^^^^^^ mutable borrow occurs here 6 | 7 | println!("y: {}", y); | - borrow later used here 

Alih-alih menunjukkan di mana Anda keluar dari ruang lingkup, itu menunjukkan di mana terjadi konflik pinjaman. Ini sangat menyederhanakan kesalahan debug seperti ini.


Di Rust 1.31, ini merupakan peningkatan khusus untuk Rust 2018. Kami berencana untuk menambahkannya ke Rust 2015 nanti.


Modul sistem berubah


Sistem modul bisa jadi sulit bagi orang yang mempelajari Rust untuk pertama kalinya. Tentu saja, selalu ada sesuatu yang membutuhkan waktu untuk dikuasai. Tetapi alasan utama mengapa modul sangat memalukan bagi banyak orang adalah bahwa meskipun aturan sederhana dan konsisten yang mendefinisikan sistem modul, konsekuensi dari penggunaannya mungkin tampak kontradiktif, misterius dan tidak wajar.


Oleh karena itu, edisi 2018 membuat beberapa perubahan pada cara jalur bekerja, menyederhanakan sistem modul dan membuatnya lebih dimengerti.


Berikut ini ringkasan singkatnya:


  • extern crate tidak lagi diperlukan hampir di tempat lain.
  • Anda dapat mengimpor makro menggunakan use , alih-alih menggunakan atribut #[macro_use] .
  • Jalur absolut dimulai dengan nama wadah, di mana kata kunci crate merujuk ke wadah saat ini.
  • foo.rs dan subdirektori foo/ dapat hidup berdampingan; mod.rs tidak lagi diperlukan saat menempatkan submodula dalam subdirektori.

Sepertinya seperangkat aturan yang sewenang-wenang, tetapi secara umum, model mental sekarang telah sangat disederhanakan.


Masih ada banyak detail, silakan lihat manual editorial untuk semua detailnya.


Aturan tambahan untuk menampilkan masa hidup


Mari kita bicara tentang peningkatan yang tersedia di kedua edisi: kami telah menambahkan beberapa aturan inferensi tambahan untuk blok impl dan definisi fungsi. Kode seperti ini:


 impl<'a> Reader for BufReader<'a> { //   } 

sekarang dapat ditulis seperti ini:


 impl Reader for BufReader<'_> { //   } 

Seumur hidup '_ masih menunjukkan bahwa BufReader menganggapnya sebagai parameter, tetapi kita tidak perlu lagi memberinya nama.


Masa hidup masih perlu didefinisikan dalam struktur. Namun, kita tidak perlu lagi menulis kode boilerplate seperti sebelumnya:


 // Rust 2015 struct Ref<'a, T: 'a> { field: &'a T } // Rust 2018 struct Ref<'a, T> { field: &'a T } 

Ketergantungan : 'a akan menjadi keluaran. Anda masih dapat menentukannya secara eksplisit jika Anda mau. Kami sedang mempertimbangkan peluang lain untuk penarikan di tempat-tempat seperti itu untuk masa depan, tetapi sejauh ini kami tidak memiliki rencana yang konkret.


const fn


Rust memiliki beberapa cara untuk mendeklarasikan suatu fungsi: fn untuk fungsi biasa, unsafe fn untuk fungsi tidak aman, dan extern fn untuk fungsi eksternal. Rilis ini menambahkan cara baru untuk mendeklarasikan suatu fungsi: const fn . Digunakan seperti ini:


 const fn foo(x: i32) -> i32 { x + 1 } 

Fungsi konstan dapat disebut sebagai fungsi normal, tetapi selain itu dapat digunakan dalam konteks konstan apa pun. Namun, itu akan dieksekusi pada waktu kompilasi, dan tidak selama eksekusi program. Sebagai contoh:


 const SIX: i32 = foo(5); 

Fungsi foo akan dieksekusi pada waktu kompilasi dan SIX akan diatur ke 6 .


Fungsi konstan tidak dapat melakukan segala sesuatu yang fungsi normal dapat lakukan: mereka harus memiliki hasil deterministik. Ini penting untuk alasan keandalan. Dalam bentuk saat ini, fungsi konstan dapat melakukan subset operasi minimal. Berikut ini beberapa contoh yang dapat Anda lakukan di dalamnya:


  • Gunakan operasi bilangan aritmatika dan perbandingan
  • Gunakan operasi logis apa pun kecuali && dan ||
  • Desain susunan, struktur, enumerasi, dan tupel
  • Sebut fungsi konstan lainnya
  • Akses menurut indeks dalam array dan irisan
  • Mengakses bidang struktur dan tupel
  • Gunakan konstanta (tetapi bukan nilai statis, dan bahkan bukan referensi untuknya)
  • Gunakan tautan & dan *
  • Melemparkan tipe kecuali melemparkan pointer mentah ke nilai integer

Kami akan memperluas kapabilitas fungsi konstan, tetapi set di atas sudah cukup untuk menggunakan const fn dalam praktiknya.


Lihat manual untuk detailnya.


Alat baru


Edisi 2018 menandai awal dari tingkat kematangan baru untuk ekosistem alat Rust. Cargo, Rustdoc, dan Rustup telah menjadi alat utama sejak versi 1.0; Dengan edisi 2018, generasi baru alat akan datang yang kini dapat digunakan semua orang: Clippy, Rustfmt, dan dukungan IDE.


Alat analisa kode statis yang clippy sekarang tersedia di Rust yang stabil. Anda dapat menginstalnya melalui rustup component add clippy dan jalankan dengan cargo clippy . Clippy sekarang telah menerima versi 1.0 dan memiliki jaminan stabilitas yang sama untuk pemeriksaan statis seperti rustc. Pemeriksaan baru dapat ditambahkan, atau fungsionalitas yang lama dapat diperluas, tetapi yang lama tidak dapat dihapus (hanya dapat ditandai sebagai usang). Ini berarti bahwa kode yang mengkompilasi dengan clippy akan terus mengkompilasi dengan clippy (dengan asumsi tidak ada pemeriksaan yang diatur untuk menghasilkan
kesalahan melalui deny ), tetapi dapat menghasilkan peringatan baru.


Rustfmt adalah alat untuk memformat kode di Rust. Pemformatan kode otomatis akan menghemat waktu Anda, selain itu, akan membawa kode Anda lebih dekat ke gaya Karat resmi . Anda dapat menginstalnya melalui rustup component add rustfmt dan menggunakan perintah cargo fmt .


Rilis saat ini termasuk Rustfmt 1.0. Mulai sekarang, kami menjamin kompatibilitas ke belakang untuk Rustfmt: jika Anda memformat kode Anda hari ini, maka pemformatan tidak akan berubah di masa mendatang (hanya untuk pengaturan default). Kompatibilitas mundur berarti sekarang praktis menjalankan Rustfmt pada CI Anda (gunakan cargo fmt --check ). Coba ini bersama dengan "memformat saat menyimpan" di editor, dan alur kerja Anda akan mengalami revolusi.


Dukungan IDE adalah salah satu fitur yang paling banyak diminta untuk Rust. Sekarang ada beberapa solusi berkualitas tinggi:



Dukungan kerja di IDE belum selesai. Secara khusus, penyelesaian kode dalam editor berbasis RLS tidak secara normal. Namun, jika Anda terutama menginginkan dukungan untuk jenis, dokumentasi, dan "transisi ke definisi", maka Anda akan puas.


Pemeriksaan kualitas kode instrumental (tool lints)


Di Rust 1.30, kami menstabilkan "atribut instrumental" seperti #[rustfmt::skip] . Di Rust 1.31, kami menstabilkan sesuatu seperti ini: "tool lints" seperti #[allow(clippy::bool_comparison)] . Ini memungkinkan Anda menentukan ruang nama untuk pemeriksaan agar memperjelas alat apa yang mereka gunakan.


Jika sebelumnya Anda pernah menggunakan cek Clippy, Anda dapat bermigrasi sebagai berikut:


 //  #![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))] //  #![allow(clippy::bool_comparison)] 

Anda tidak lagi membutuhkan cfg_attr ! Sekarang Anda juga akan menerima peringatan yang akan membantu Anda beralih menggunakan gaya baru.


Dokumentasi


Ada beberapa perbaikan pada Rustdoc tahun ini, dan buku yang sepenuhnya ditulis ulang, The Rust Programming Language, dirilis. Anda dapat membeli salinan kertas dari No Starch Press !


Itu sebelumnya disebut "edisi kedua" buku, tetapi karena itu menjadi edisi cetak pertama, ini menyebabkan kebingungan. Bagaimanapun, edisi cetak direncanakan akan diperbarui secara berkala. Pada akhirnya, setelah banyak diskusi dengan No Starch, diputuskan untuk memperbarui buku di situs web dengan setiap rilis, dan No Starch akan secara berkala mengambil perubahan dan mencetaknya. Buku ini laris manis dan menghasilkan uang untuk Black Girls Code .


Anda dapat menemukan versi buku yang baru di sini .


Kelompok Kerja Subjek


Tahun ini kami mengumumkan pembentukan empat kelompok kerja:


  • Layanan jaringan
  • Aplikasi baris perintah
  • Perakitan web
  • Perangkat tertanam

Kelompok-kelompok itu bekerja sangat keras untuk membuat Rust lebih baik di setiap bidang ini. Berikut ini beberapa pencapaiannya:


  • Layanan jaringan mendesain ulang antarmuka untuk Futures, dan sebagai tambahan menunggu. Perbaikan ini belum dirilis, tetapi kami sudah dekat dengan itu!
  • Tim CLI bekerja pada perpustakaan dan dokumentasi untuk membuat aplikasi baris perintah lebih baik.
  • WebAssembly telah merilis banyak alat kelas dunia untuk menggunakan Rust dengan wasm.
  • Untuk perangkat tertanam, dimungkinkan untuk mengembangkan ARM pada Rust yang stabil!

Anda dapat mempelajari lebih lanjut tentang semua ini di situs baru kami!


Situs web baru


Minggu lalu kami mengumumkan versi baru situs web kami. Sekarang telah menjadi versi resmi rust-lang.org!


Untuk membuatnya butuh satu tahun kerja banyak orang. Meskipun masih banyak yang harus dilakukan sebelum selesai, kami bangga dengan pekerjaan yang dilakukan.


Stabilisasi perpustakaan standar


Implementasi From Baru telah ditambahkan:


  • u8 sekarang mengimplementasikan From<NonZeroU8> , serupa untuk jenis numerik lainnya dan yang setara dengan NonZero mereka
  • Option<&T> mengimplementasikan From<&Option<T>> , mirip dengan &mut

Fungsi-fungsi berikut juga telah distabilkan:



Lihat catatan rilis untuk lebih jelasnya.


Peningkatan Kargo


Cargo sekarang akan memuat paket secara paralel menggunakan HTTP / 2.


Selain itu, karena extern crate sekarang opsional, itu akan membuat frustasi untuk menulis extern crate foo as bar; untuk mengubah nama ketergantungan. Karenanya, Anda dapat melakukannya di Cargo.toml dengan cara ini:


 [dependencies] baz = { version = "0.1", package = "foo" } 

atau, yang setara:


 [dependencies.baz] version = "0.1" package = "foo" 

Paket foo sekarang tersedia sebagai baz untuk digunakan dalam kode Anda.


Lihat catatan rilis untuk lebih jelasnya.


Pengembang 1.31.0


Biasanya, di akhir ulasan, kami berterima kasih kepada orang - orang yang berkontribusi pada rilis . Tetapi kali ini, tidak seperti masa lalu, daftar ini tidak sepenuhnya mencakup semua orang yang membantu, dan semua jumlah pekerjaan yang telah dilakukan. Setiap rilis reguler adalah hasil dari enam minggu kerja, tetapi rilis ini adalah puncak dari tiga tahun upaya yang tercermin dalam berbagai repositori yang dibuat oleh sejumlah besar orang. Kami senang bekerja sama dengan Anda semua, dan kami menantikan perkembangan berkelanjutan Rust selama tiga tahun ke depan.


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

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


All Articles