Випуск мови програмування Rust 1.73

Опубліковано реліз мови програмування загального призначення Rust 1.73, заснованого проектом Mozilla, але нині розвивається під заступництвом незалежної некомерційної організації Rust Foundation. Мова сфокусована на безпечній роботі з пам'яттю та надає засоби для досягнення високого паралелізму виконання завдань, при цьому обходячись без використання збирача сміття та runtime (runtime зводиться до базової ініціалізації та супроводу стандартної бібліотеки).

Методи роботи з пам'яттю в Rust позбавляють розробника помилок при маніпулюванні покажчиками і захищають від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера і т.п. Для поширення бібліотек, забезпечення збирання та управління залежностями проектом розвивається пакетний менеджер Cargo. Для розміщення бібліотеки підтримується репозиторій crates.io.

Безпечна робота з пам'яттю забезпечується в Rust під час компіляції через перевірку посилань, відстеження володіння об'єктами, облік часу життя об'єктів (області видимості) та оцінку коректності доступу до пам'яті під час виконання коду. Rust також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

Основні нововведення:

  • Перероблено оформлення повідомлень, що видаються за замовчуванням обробником аварійного завершення програми (panic). Текст, вказаний у макросі panic! тепер показується в окремому рядку без обрамлення лапками, що спрощує читання повідомлення і усуває плутанину за наявності вкладених лапок або поділу на кілька рядків. fn main() { let file = "ferris.txt"; panic! ("oh no! {file:?} not found!"); } Було thread 'main' panicked at 'oh no! "ferris.txt" not found!', src/main.rs:3:5 Стало thread 'main' panicked at src/main.rs:3:5: oh no! "ferris.txt" not found!

    Також перероблено висновок повідомлень, що показуються при спрацьовуванні макросів assert_eq і assert_ne. fn main() { assert_eq!("🦀", "🐟", "ferris is not a fish"); } Було thread 'main' panicked at 'assertion failed: `(left == right)` left: `»🦀»`, right: `»🐟»`: ferris is not a fish', src/main.rs:2 :5 Стало thread 'main' panicked at src/main.rs:2:5: assertion `left == right` failed: ferris is not a fish left: "🦀" right: "🐟"

  • Відповідно до RFC 3184 додано можливість прямої маніпуляції локальними для потоку (thread_local) ключами сховища LocalKey > та LocalKey > через використання методів get(), set(), take() і replace(), замість використання замикання «with(|inner| …)», що дозволяє не виконувати додатковий код ініціалізації для значень за умовчанням, вказаних для нових потоків при допомоги макросу "thread_local!". thread_local! { static THINGS: Cell > = Cell::new(Vec::new()); } fn f() { // було THINGS.with(|i| i.set(vec![32, 1, 2]))); // стало THINGS.set (vec! [3, 1, 2]); // … // було let v = THINGS.with(|i|i.take()); // стало let v: Vec = THINGS.take(); }
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • Unsigned {integer}::div_ceil
    • Unsigned {integer}::next_multiple_of
    • Unsigned {integer}::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • LocalKey:: >::get
    • LocalKey:: >::set
    • LocalKey:: >::take
    • LocalKey:: >::replace
    • LocalKey:: >::with_borrow
    • LocalKey:: >::with_borrow_mut
    • LocalKey:: >::set
    • LocalKey:: >::take
    • LocalKey:: >::replace
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функціях:
    • rc::Weak::new
    • sync::Weak::new
    • NonNull::as_ref
  • У компіляторі забезпечено запис інформації про версію до секції «.comment» за аналогією з GCC і Clang.
  • Реалізовано третій рівень підтримки для платформ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl та x86_64-unkn. Третій рівень передбачає базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.
  • Реалізовано другий рівень підтримки цільової платформи wasm32-wasi-preview1-threads. Другий рівень підтримки передбачає гарантію складання.

Джерело: opennet.ru

Додати коментар або відгук