Rust 1.78 обновил свой встроенный LLVM до версии 18, завершив объявленное изменение ABI для u128/i128 для целевых платформ x86-32 и x86-64. Дистрибьюторы, использующие собственную версию LLVM старше 18, могут по-прежнему сталкиваться с ошибками соглашения о вызовах, упомянутыми в том посте.Rust 1.78 обновил свой встроенный LLVM до версии 18, завершив объявленное изменение ABI для u128/i128 для целевых платформ x86-32 и x86-64. Дистрибьюторы, использующие собственную версию LLVM старше 18, могут по-прежнему сталкиваться с ошибками соглашения о вызовах, упомянутыми в том посте.

Rust 1.78.0: Что в нём нового?

2025/12/08 02:45
5м. чтение
Для обратной связи или замечаний по поводу данного контента, свяжитесь с нами по адресу crypto.news@mexc.com

Команда Rust рада объявить о выходе новой версии Rust 1.78.0. Rust — это язык программирования, позволяющий каждому создавать надежное и эффективное программное обеспечение.

\ Если у вас уже установлена предыдущая версия Rust через rustup, вы можете получить 1.78.0 с помощью:

$ rustup update stable

\ Если у вас его еще нет, вы можете получить rustup на соответствующей странице нашего веб-сайта и ознакомиться с подробными примечаниями к выпуску 1.78.0.

\ Если вы хотите помочь нам с тестированием будущих релизов, вы можете обновиться локально для использования бета-канала (rustup default beta) или ночного канала (rustup default nightly). Пожалуйста, сообщайте о любых обнаруженных ошибках!

Что нового в стабильной версии 1.78.0

Диагностические атрибуты

Rust теперь поддерживает пространство имен атрибутов #[diagnostic] для влияния на сообщения об ошибках компилятора. Они рассматриваются как подсказки, которые компилятор не обязан использовать, и также не является ошибкой предоставление диагностики, которую компилятор не распознает. Эта гибкость позволяет исходному коду предоставлять диагностику даже когда она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации.

\ С этим пространством имен появляется первый поддерживаемый атрибут, #[diagnostic::on_unimplemented], который можно разместить на трейте для настройки сообщения, когда этот трейт требуется, но не реализован для типа. Рассмотрим пример, приведенный в запросе на стабилизацию:

#[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); }

\ Ранее компилятор выдавал встроенную ошибку вроде этой:

error[E0277]: the trait bound `String: ImportantTrait<i32>` is not satisfied --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ the trait `ImportantTrait<i32>` is not implemented for `String` | | | required by a bound introduced by this call |

\ С #[diagnostic::on_unimplemented] его пользовательское сообщение заполняет основную строку ошибки, а пользовательская метка размещается в выводе исходного кода. Исходная метка по-прежнему записывается как вывод справки, а также записываются любые пользовательские примечания. (Эти точные детали могут измениться.)

error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` --> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ------------ ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2

\ Для авторов трейтов такая диагностика более полезна, если вы можете предоставить лучшую подсказку, чем просто говорить о самой отсутствующей реализации. Например, вот сокращенный пример из стандартной библиотеки:

#[diagnostic::on_unimplemented( message = "the size for values of type `{Self}` cannot be known at compilation time", label = "doesn't have a size known at compile-time" )] pub trait Sized {}

\ Для получения дополнительной информации см. раздел справки о пространстве имен атрибутов инструмента diagnostic.

Проверка предусловий unsafe

Стандартная библиотека Rust имеет ряд проверок для предусловий функций unsafe, но исторически они были включены только в сборках стандартной библиотеки #[cfg(debug_assertions)], чтобы не влиять на производительность релизов. Однако, поскольку стандартная библиотека обычно компилируется и распространяется в режиме релиза, большинство разработчиков Rust вообще никогда не выполняли эти проверки.

\ Теперь условие для этих проверок откладывается до генерации кода, поэтому они будут проверяться в зависимости от собственных настроек пользователя для отладочных утверждений — включены по умолчанию в отладочных сборках и тестах. Это изменение помогает пользователям обнаруживать неопределенное поведение в своем коде, хотя детали того, сколько проверяется, обычно не стабильны.

\ Например, slice::from_raw_parts требует выровненного ненулевого указателя. Следующее использование намеренно невыровненного указателя имеет неопределенное поведение, и хотя если вам не повезло, это могло казаться "работающим" в прошлом, отладочное утверждение теперь может его поймать:

fn main() { let slice: &[u8] = &[1, 2, 3, 4, 5]; let ptr = slice.as_ptr(); // Create an offset from `ptr` that will always be one off from `u16`'s correct alignment let i = usize::from(ptr as usize & 1 == 0); let slice16: &[u16] = unsafe { std::slice::from_raw_parts(ptr.add(i).cast::<u16>(), 2) }; dbg!(slice16); } thread 'main' panicked at library/core/src/panicking.rs:220:5: unsafe precondition(s) violated: slice::from_raw_parts requires the pointer to be aligned and non-null, and the total size of the slice not to exceed `isize::MAX` note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread caused non-unwinding panic. aborting.

Детерминированное перевыравнивание

Стандартная библиотека имеет несколько функций, которые изменяют выравнивание указателей и срезов, но ранее у них были оговорки, которые затрудняли их использование на практике, если вы точно следовали их документации. Эти оговорки существовали в основном как защита от const вычислений, но они в любом случае стабильны только для не-const использования. Теперь обещается, что они будут иметь согласованное поведение во время выполнения в соответствии с их фактическими входными данными.

  • pointer::align_offset вычисляет смещение, необходимое для изменения указателя до заданного выравнивания. Он возвращает usize::MAX, если это невозможно, но ранее ему разрешалось всегда возвращать usize::MAX, и теперь это поведение удалено.
  • slice::align_to и slice::align_to_mut оба преобразуют срезы в выровненный средний срез и оставшиеся невыровненные начальный и конечный срезы. Эти методы теперь обещают возвращать наибольшую возможную среднюю часть, а не позволять реализации возвращать что-то менее оптимальное, например, возвращать все как начальный срез.

Стабилизированные API

  • impl Read for &Stdin
  • Принятие времени жизни не 'static для нескольких реализаций, связанных с std::error::Error
  • Сделать impl<Fd: AsFd> impl принимающим ?Sized
  • impl From<TryReserveError> for io::Error

\ Эти API теперь стабильны в контекстах const:

  • Barrier::new()

Примечания по совместимости

  • Как было объявлено ранее, Rust 1.78 повысил минимальные требования до Windows 10 для следующих целей:
  • x86_64-pc-windows-msvc
  • i686-pc-windows-msvc
  • x86_64-pc-windows-gnu
  • i686-pc-windows-gnu
  • x86_64-pc-windows-gnullvm
  • i686-pc-windows-gnullvm
  • Rust 1.78 обновил свой встроенный LLVM до версии 18, завершив объявленное изменение ABI u128/i128 для целей x86-32 и x86-64. Дистрибьюторы, использующие свой собственный LLVM старше 18, могут по-прежнему сталкиваться с ошибками соглашения о вызовах, упомянутыми в этом посте.

Другие изменения

Ознакомьтесь со всеми изменениями в Rust, Cargo и Clippy.

Участники 1.78.0

Многие люди объединились для создания Rust 1.78.0. Мы не смогли бы сделать это без всех вас. Спасибо!


Команда релиза Rust

\ Также опубликовано здесь

\ Фото Ubaid E. Alyafizi на Unsplash

Возможности рынка
Логотип ChangeX
ChangeX Курс (CHANGE)
$0.0014226
$0.0014226$0.0014226
-1.55%
USD
График цены ChangeX (CHANGE) в реальном времени
Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу crypto.news@mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.

Вам также может быть интересно

Аналитик утверждает, что план BlackRock для XRP может выйти за рамки ETF. Вот почему

Аналитик утверждает, что план BlackRock для XRP может выйти за рамки ETF. Вот почему

Криптовалютная индустрия вступила в новую фазу, в которой институциональные стратегии все больше выходят за рамки простого владения цифровыми активами. В то время как биржи
Поделиться
Timestabloid2026/03/07 21:05
ETF на биткоин потеряли $348,8 млн в пятницу, завершив неделю с чистым притоком $568,4 млн

ETF на биткоин потеряли $348,8 млн в пятницу, завершив неделю с чистым притоком $568,4 млн

Ключевые данные: Американские спотовые биржевые фонды (ETF) на Bitcoin зафиксировали чистый отток средств в размере $348,83 млн в пятницу. Отток в четверг составил $227,83 млн. Несмотря на
Поделиться
Themarketperiodical2026/03/07 21:37
Нам не подошла ни одна среда для MARL в непрерывном пространстве — поэтому мы сделали CAMAR

Нам не подошла ни одна среда для MARL в непрерывном пространстве — поэтому мы сделали CAMAR

Представьте задачу: есть куча роботов, и им всем надо куда‑то добраться, не столкнувшись с собратьями, а мы должны придумать для этого алгоритм. Это, если упрощ
Поделиться
ProBlockChain2026/03/07 17:16