Keluaran bahasa pengaturcaraan Rust 1.40

diterbitkan keluaran bahasa pengaturcaraan sistem Karat 1.40, diasaskan oleh projek Mozilla. Bahasa ini memberi tumpuan kepada keselamatan ingatan, menyediakan pengurusan memori automatik dan menyediakan alatan untuk mencapai keselarian tugas yang tinggi tanpa menggunakan pengumpul sampah dan runtime.

Pengurusan memori automatik Rust menyelamatkan pembangun daripada memanipulasi penunjuk dan melindungi daripada masalah yang timbul daripada manipulasi memori peringkat rendah, seperti mengakses kawasan memori selepas ia dibebaskan, membatalkan penunjuk nol, overrun penimbal, dsb. Untuk mengedarkan perpustakaan, memastikan pemasangan dan mengurus kebergantungan, projek membangunkan pengurus pakej Cargo, yang membolehkan anda mendapatkan perpustakaan yang anda perlukan untuk program dalam satu klik. Repositori disokong untuk mengehos perpustakaan crates.io.

Utama inovasi:

  • Menambah keupayaan untuk menandakan struktur (struktur) dan penghitungan (enum dengan blok Varian) menggunakan atribut "#[non_exhaustive]", yang membolehkan pada masa hadapan, tambah medan dan pilihan baharu pada struktur dan penghitungan yang diisytiharkan. Sebagai contoh, pembangun modul yang mempunyai struktur dengan medan yang diisytiharkan secara terbuka boleh menggunakan "#[non_exhaustive]" untuk menandakan struktur yang mungkin mempunyai medan baharu ditambahkan pada masa hadapan. Sehingga kini, dalam situasi ini, pembangun terpaksa memilih antara mengisytiharkan medan secara peribadi dan mengikat kepada senarai medan yang tidak boleh diubah. Atribut baharu mengalih keluar had ini dan membolehkan anda menambah medan baharu pada masa hadapan tanpa risiko memecahkan kod luaran yang disusun sebelum ini. Dalam pakej peti, apabila memadankan pilihan dalam bahagian "padanan", takrifan eksplisit topeng "_ => {...}" diperlukan, meliputi kemungkinan medan masa hadapan, jika tidak, ralat akan dipaparkan semasa menambah medan baharu.
  • Ditambah keupayaan untuk memanggil mac makro prosedur!() dalam konteks jenis. Sebagai contoh, anda kini boleh menulis β€œtype Foo = expand_to_type!(bar);” jika β€œexpand_to_type” ialah makro prosedur.
  • Dalam blok "luar { ... }". tambah keupayaan untuk menggunakan makro prosedur dan atribut, termasuk makro "bang!()", contohnya:

    makro_peraturan! make_item { ($name:ident) => { fn $name(); } }

    luaran {
    make_item!(alfa);
    make_item!(beta);
    }

    luaran "C" {
    #[makro_identiti_saya] fn foo();
    }

  • Dalam makro dilaksanakan keupayaan untuk menjana elemen "peraturan_makro!". Menjana "peraturan_makro!" mungkin dalam makro seperti fungsi (β€œmac!()”) dan dalam makro dalam bentuk atribut (β€œ#[mac]”).
  • Dalam elemen pemetaan $m:meta tambah sokongan untuk nilai penghitungan token sembarangan (β€œ[TOKEN_STREAM]”, β€œ{TOKEN_STREAM}” dan β€œ(TOKEN_STREAM)”), contohnya:

    makro_peraturan! accept_meta { ($m:meta) => {} }
    accept_meta!( my::path );
    accept_meta!( my::path = "lit" );
    accept_meta!( my::path ( abc ) );
    accept_meta!( my::path [ abc ] );
    accept_meta!( my::path { abc } );

  • Dalam mod Rust 2015, output ralat didayakan untuk masalah yang dikenal pasti semasa menyemak peminjaman pembolehubah (pemeriksa pinjaman) menggunakan teknik NLL (Non-Lexical Lifetimes). Sebelum ini, amaran telah digantikan dengan ralat semasa berjalan dalam mod Rust 2018.
    Selepas perubahan itu dilanjutkan kepada mod Rust 2015, pembangun akhirnya dapat melakukannya menyingkirkan daripada pemeriksa pinjaman lama.

    Mari kita ingat bahawa sistem pengesahan berdasarkan mekanisme baharu untuk mengambil kira jangka hayat pembolehubah yang dipinjam membolehkan untuk mengenal pasti beberapa masalah yang tidak disedari oleh kod pengesahan lama. Memandangkan output ralat untuk semakan sedemikian boleh menjejaskan keserasian dengan kod yang berfungsi sebelum ini, amaran pada mulanya dikeluarkan dan bukannya ralat.

  • Atribut "const", yang menentukan kemungkinan menggunakannya dalam sebarang konteks dan bukannya pemalar, digunakan untuk fungsi is_power_of_two (untuk integer tidak bertanda).
  • Bahagian baharu API telah dialihkan ke kategori stabil, termasuk todo!() makro dan slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value, kaedah telah distabilkan.
    Pilihan::as_deref, Pilihan::as_deref_mut, Pilihan::ratakan, UdpSocket::peer_addr, {f32,f64}::to_be_bait, {f32,f64}::to_le_bait,{f32,f64}::to_ne_bait, {f32,f64}::to_ne_bait f32}::dari_be_bait, {f64,f32}::dari_le_bait dan {f64,fXNUMX}::daripada_ne_bait.

  • Dalam kargo pengurus pakej
    dilaksanakan caching amaran pengkompil pada cakera. Menambahkan pilihan "metadata kargo" pada arahan "metadata kargo".--penapis-platform" untuk menunjukkan hanya pakej yang terikat pada platform sasaran yang ditentukan dalam lajur resolusi pergantungan. Menambahkan pilihan konfigurasi versi http.ssl untuk menentukan versi TLS yang sah.
    Menambah keupayaan untuk menerbitkan bahagian "kebergantungan dev" tanpa menyatakan kunci "versi".

  • Pengkompil rustc menyediakan sokongan tahap ketiga untuk platform sasaran thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 dan mips64el-unknown-linux-muslabi64. Tahap ketiga melibatkan sokongan asas, tetapi tanpa ujian automatik dan penerbitan binaan rasmi.

Sumber: opennet.ru

Tambah komen