From f9c453c6a370754e444921271223bb210efd5011 Mon Sep 17 00:00:00 2001 From: funkill Date: Thu, 2 May 2024 13:36:20 +0000 Subject: [PATCH 1/7] Translate 2024-05-02-Rust-1.78.0.md via GitLocalize --- ru/announcements/2024-05-02-Rust-1.78.0.md | 149 +++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 ru/announcements/2024-05-02-Rust-1.78.0.md diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md new file mode 100644 index 0000000..5f53640 --- /dev/null +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -0,0 +1,149 @@ +--- +layout: post +title: Announcing Rust 1.78.0 +author: The Rust Release Team +release: 'true' +--- + +Команда Rust рада сообщить о новой версии языка — 1.78.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение. + +Если у вас есть предыдущая версия Rust, установленная через `rustup`, то для обновления до версии 1.78.0 вам достаточно выполнить команду: + +```console +$ rustup update stable +``` + +Если у вас ещё не установлен `rustup`, вы можете установить его с [соответствующей страницы](https://www.rust-lang.org/install.html) нашего веб-сайта, а также посмотреть [подробные примечания к выпуску](https://doc.rust-lang.org/nightly/releases.html#version-1780-2024-05-02) на GitHub. + +Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (`rustup default beta`) или nightly (`rustup default nightly`). Пожалуйста, [сообщайте](https://github.com/rust-lang/rust/issues/new/choose) обо всех встреченных вами ошибках. + +## Что стабилизировано в 1.78.0 + +### Diagnostic attributes + +Rust now supports a `#[diagnostic]` attribute namespace to influence compiler error messages. These are treated as hints which the compiler is not *required* to use, and it is also not an error to provide a diagnostic that the compiler doesn't recognize. This flexibility allows source code to provide diagnostics even when they're not supported by all compilers, whether those are different versions or entirely different implementations. + +With this namespace comes the first supported attribute, `#[diagnostic::on_unimplemented]`, which can be placed on a trait to customize the message when that trait is required but hasn't been implemented on a type. Consider the example given in the [stabilization pull request](https://github.com/rust-lang/rust/pull/119888/): + +```rust +#[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 {} + +fn use_my_trait(_: impl ImportantTrait) {} + +fn main() { + use_my_trait(String::new()); +} +``` + +Previously, the compiler would give a builtin error like this: + +``` +error[E0277]: the trait bound `String: ImportantTrait` is not satisfied + --> src/main.rs:12:18 + | +12 | use_my_trait(String::new()); + | ------------ ^^^^^^^^^^^^^ the trait `ImportantTrait` is not implemented for `String` + | | + | required by a bound introduced by this call + | +``` + +With `#[diagnostic::on_unimplemented]`, its custom message fills the primary error line, and its custom label is placed on the source output. The original label is still written as help output, and any custom notes are written as well. (These exact details are subject to change.) + +``` +error[E0277]: My Message for `ImportantTrait` 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` is not implemented for `String` + = note: Note 1 + = note: Note 2 +``` + +For trait authors, this kind of diagnostic is more useful if you can provide a better hint than just talking about the missing implementation itself. For example, this is an abridged sample from the standard library: + +```rust +#[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 {} +``` + +For more information, see the reference section on [the `diagnostic` tool attribute namespace](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). + +### Проверка предусловий `unsafe` + +The Rust standard library has a number of assertions for the preconditions of `unsafe` functions, but historically they have only been enabled in `#[cfg(debug_assertions)]` builds of the standard library to avoid affecting release performance. However, since the standard library is usually compiled and distributed in release mode, most Rust developers weren't ever executing these checks at all. + +Теперь выполнение условий для этих проверок откладывается до генерации кода, поэтому они будут проверяться в зависимости от собственных настроек пользователя для отладочных проверок, включенных по умолчанию в отладочных и тестовых сборках. Это изменение помогает пользователям отслеживать неопределённое поведение в своём коде, хотя информация о том, сколько всего проверяется, как правило, не является стабильной. + +Например [`slice::from_raw_parts`](https://doc.rust-lang.org/std/slice/fn.from_raw_parts.html) требует выровненный ненулевой указатель. Следующее использование намеренно смещенного указателя приводит к неопределенному поведению, и хотя это может не иметь очевидных последствий, debug-проверка теперь может перехватить его: + +```rust +fn main() { + let slice: &[u8] = &[1, 2, 3, 4, 5]; + let ptr = slice.as_ptr(); + + // Создание отступа от `ptr` что всегда будет единственным отличием от корректного смещения `u16` + let i = usize::from(ptr as usize & 1 == 0); + + let slice16: &[u16] = unsafe { std::slice::from_raw_parts(ptr.add(i).cast::(), 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. +``` + +### Deterministic realignment + +The standard library has a few functions that change the alignment of pointers and slices, but they previously had caveats that made them difficult to rely on in practice, if you followed their documentation precisely. Those caveats primarily existed as a hedge against `const` evaluation, but they're only stable for non-`const` use anyway. They are now promised to have consistent runtime behavior according to their actual inputs. + +- [`pointer::align_offset`](https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset) computes the offset needed to change a pointer to the given alignment. It returns `usize::MAX` if that is not possible, but it was previously permitted to *always* return `usize::MAX`, and now that behavior is removed. + +- [`slice::align_to`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to) and [`slice::align_to_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut) both transmute slices to an aligned middle slice and the remaining unaligned head and tail slices. These methods now promise to return the largest possible middle part, rather than allowing the implementation to return something less optimal like returning everything as the head slice. + +### Стабилизированные API + +- [`impl Read for &Stdin`](https://doc.rust-lang.org/stable/std/io/struct.Stdin.html#impl-Read-for-%26Stdin) +- [В зависимости от реализации разрешены не `'static` времена жизни для некоторых `std::error::Error`](https://github.com/rust-lang/rust/pull/113833/) +- [`impl` имплементирует `?Sized`](https://github.com/rust-lang/rust/pull/114655/) +- [`impl From for io::Error`](https://doc.rust-lang.org/stable/std/io/struct.Error.html#impl-From%3CTryReserveError%3E-for-Error) + +Следующие API теперь можно использовать в контексте const: + +- [`Barrier::new()`](https://doc.rust-lang.org/stable/std/sync/struct.Barrier.html#method.new) + +### Замечания о совместимости + +- Как [ранее анонсировалось](https://blog.rust-lang.org/2024/02/26/Windows-7.html), в 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 has upgraded its bundled LLVM to version 18, completing the announced [`u128`/`i128` ABI change](https://blog.rust-lang.org/2024/03/30/i128-layout-update.html) for x86-32 and x86-64 targets. Distributors that use their own LLVM older than 18 may still face the calling convention bugs mentioned in that post. + +### Прочие изменения + +Проверьте всё, что изменилось в [Rust](https://github.com/rust-lang/rust/releases/tag/1.78.0), [Cargo](https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-178-2024-05-02) и [Clippy](https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-178). + +## Кто работал над 1.78.0 + +Многие люди собрались вместе, чтобы создать Rust 1.78.0. Без вас мы бы не справились. [Спасибо!](https://thanks.rust-lang.org/rust/1.78.0/) From bd4e1c81f496d96977e39ec2f3a2566dba4b877c Mon Sep 17 00:00:00 2001 From: Yuriy Larin Date: Thu, 2 May 2024 13:36:21 +0000 Subject: [PATCH 2/7] Translate 2024-05-02-Rust-1.78.0.md via GitLocalize --- ru/announcements/2024-05-02-Rust-1.78.0.md | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md index 5f53640..8851f16 100644 --- a/ru/announcements/2024-05-02-Rust-1.78.0.md +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -1,6 +1,6 @@ --- layout: post -title: Announcing Rust 1.78.0 +title: Анонс Rust 1.78.0 author: The Rust Release Team release: 'true' --- @@ -19,11 +19,11 @@ $ rustup update stable ## Что стабилизировано в 1.78.0 -### Diagnostic attributes +### Диагностические атрибуты -Rust now supports a `#[diagnostic]` attribute namespace to influence compiler error messages. These are treated as hints which the compiler is not *required* to use, and it is also not an error to provide a diagnostic that the compiler doesn't recognize. This flexibility allows source code to provide diagnostics even when they're not supported by all compilers, whether those are different versions or entirely different implementations. +Теперь Rust поддерживает пространство имен атрибута `#[diagnostic]`, чтобы повлиять на сообщения ошибок компилятора. Они рассматриваются как подсказки, которые компилятору не *требуется* использовать, и это также не является ошибкой предоставление диагностики, которую компилятор не распознает Эта гибкость позволяет исходному коду предоставлять диагностику, даже если они не поддерживаются всеми компиляторами, будь то разные версии или совершенно разные реализации. -With this namespace comes the first supported attribute, `#[diagnostic::on_unimplemented]`, which can be placed on a trait to customize the message when that trait is required but hasn't been implemented on a type. Consider the example given in the [stabilization pull request](https://github.com/rust-lang/rust/pull/119888/): +В этом пространстве имен появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]` , который можно поместить на типаж для настройки сообщения, когда этот типаж требуется, но он не реализован у типа. Рассмотрим пример, приведенный в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/) : ```rust #[diagnostic::on_unimplemented( @@ -41,7 +41,7 @@ fn main() { } ``` -Previously, the compiler would give a builtin error like this: +Ранее, компилятор выдал бы такую ​​встроенную ошибку: ``` error[E0277]: the trait bound `String: ImportantTrait` is not satisfied @@ -54,7 +54,7 @@ error[E0277]: the trait bound `String: ImportantTrait` is not satisfied | ``` -With `#[diagnostic::on_unimplemented]`, its custom message fills the primary error line, and its custom label is placed on the source output. The original label is still written as help output, and any custom notes are written as well. (These exact details are subject to change.) +С помощью `#[diagnostic::on_unimplemented]` его пользовательское сообщение заполняет основную строку ошибки, а пользовательская метка помещается в исходный вывод. Исходная метка по-прежнему записывается как справочная информация, а также записываются все пользовательские примечания. (Эти данные могут быть изменены.) ``` error[E0277]: My Message for `ImportantTrait` is not implemented for `String` @@ -70,7 +70,7 @@ error[E0277]: My Message for `ImportantTrait` is not implemented for `Strin = note: Note 2 ``` -For trait authors, this kind of diagnostic is more useful if you can provide a better hint than just talking about the missing implementation itself. For example, this is an abridged sample from the standard library: +Для авторов типажей такой вид диагностики более полезен, потому что можно дать более подробную подсказку, чем просто писать об отсутствующей реализации. Например, это сокращенный образец из стандартной библиотеки: ```rust #[diagnostic::on_unimplemented( @@ -80,11 +80,11 @@ For trait authors, this kind of diagnostic is more useful if you can provide a b pub trait Sized {} ``` -For more information, see the reference section on [the `diagnostic` tool attribute namespace](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). +Дополнительные сведения смотрите в справочном разделе [инструмент `diagnostic` пространства имен атрибутов](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). ### Проверка предусловий `unsafe` -The Rust standard library has a number of assertions for the preconditions of `unsafe` functions, but historically they have only been enabled in `#[cfg(debug_assertions)]` builds of the standard library to avoid affecting release performance. However, since the standard library is usually compiled and distributed in release mode, most Rust developers weren't ever executing these checks at all. +Стандартная библиотека Rust содержит ряд утверждений для предварительных условий `unsafe` функций, но исторически они были включены только в сборках стандартной библиотеки при помощи `#[cfg(debug_assertions)]`, чтобы избежать влияния на производительность release сборки. Однако, поскольку стандартная библиотека обычно компилируется и распространяется с release профилем, большинство разработчиков Rust вообще никогда не выполняют эти проверки. Теперь выполнение условий для этих проверок откладывается до генерации кода, поэтому они будут проверяться в зависимости от собственных настроек пользователя для отладочных проверок, включенных по умолчанию в отладочных и тестовых сборках. Это изменение помогает пользователям отслеживать неопределённое поведение в своём коде, хотя информация о том, сколько всего проверяется, как правило, не является стабильной. @@ -110,13 +110,13 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread caused non-unwinding panic. aborting. ``` -### Deterministic realignment +### Детерминированное повторное выравнивание -The standard library has a few functions that change the alignment of pointers and slices, but they previously had caveats that made them difficult to rely on in practice, if you followed their documentation precisely. Those caveats primarily existed as a hedge against `const` evaluation, but they're only stable for non-`const` use anyway. They are now promised to have consistent runtime behavior according to their actual inputs. +В стандартной библиотеке есть несколько функций, которые изменяют выравнивание указателей и срезов, но раньше у них были оговорки, из-за которых на них было трудно полагаться на практике, если вы точно следовали их документации. Эти предостережения в первую очередь существовали как страховка от вычисления `const`, но в любом случае они стабильны только для использования без `const`. Теперь обещано, что они будут иметь согласованное поведение во время выполнения в соответствии с фактическими входными данными -- [`pointer::align_offset`](https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset) computes the offset needed to change a pointer to the given alignment. It returns `usize::MAX` if that is not possible, but it was previously permitted to *always* return `usize::MAX`, and now that behavior is removed. +- [`pointer::align_offset`](https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset) вычисляет смещение, необходимое для изменения указателя на заданное выравнивание. Он возвращает `usize::MAX` если это невозможно, хотя раньше было разрешено *всегда* возвращать `usize::MAX`, то теперь это поведение удалено. -- [`slice::align_to`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to) and [`slice::align_to_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut) both transmute slices to an aligned middle slice and the remaining unaligned head and tail slices. These methods now promise to return the largest possible middle part, rather than allowing the implementation to return something less optimal like returning everything as the head slice. +- Функции [`slice::align_to`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to) и [`slice::align_to_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut) преобразуют срезы в выровненный срез средней части данных и невыровненные головной и хвостовой. Эти методы теперь обещают возвращать максимально возможную среднюю часть, вместо того, чтобы позволять реализации возвращать что-то менее оптимальное, например возвращать все в виде головного среза. ### Стабилизированные API @@ -138,7 +138,7 @@ The standard library has a few functions that change the alignment of pointers a - `i686-pc-windows-gnu` - `x86_64-pc-windows-gnullvm` - `i686-pc-windows-gnullvm` -- Rust 1.78 has upgraded its bundled LLVM to version 18, completing the announced [`u128`/`i128` ABI change](https://blog.rust-lang.org/2024/03/30/i128-layout-update.html) for x86-32 and x86-64 targets. Distributors that use their own LLVM older than 18 may still face the calling convention bugs mentioned in that post. +- В Rust 1.78 обновлён встроенный LLVM до версии 18
has upgraded its bundled LLVM to version 18, завершено изменение ABI для [`u128`/`i128`](https://blog.rust-lang.org/2024/03/30/i128-layout-update.html) для x86-32 и x86-64 платформ. Дистрибьюторы, которые используют свою собственную LLVM старше 18 лет, все еще могут сталкиваться с ошибками в соглашении о вызовах, упомянутыми в этом посте. ### Прочие изменения From f579b1f559fb05110b24e5000955bfe6625814d8 Mon Sep 17 00:00:00 2001 From: TelegaOvoshey Date: Fri, 3 May 2024 19:08:34 +0400 Subject: [PATCH 3/7] Update 2024-05-02-Rust-1.78.0.md Proofreading --- ru/announcements/2024-05-02-Rust-1.78.0.md | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md index 8851f16..74da299 100644 --- a/ru/announcements/2024-05-02-Rust-1.78.0.md +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -21,9 +21,9 @@ $ rustup update stable ### Диагностические атрибуты -Теперь Rust поддерживает пространство имен атрибута `#[diagnostic]`, чтобы повлиять на сообщения ошибок компилятора. Они рассматриваются как подсказки, которые компилятору не *требуется* использовать, и это также не является ошибкой предоставление диагностики, которую компилятор не распознает Эта гибкость позволяет исходному коду предоставлять диагностику, даже если они не поддерживаются всеми компиляторами, будь то разные версии или совершенно разные реализации. +Теперь Rust поддерживает пространство имён атрибута `#[diagnostic]`, что позволяет влиять на сообщения ошибок компилятора. Теперь они рассматриваются как подсказки, которые компилятору *не требуется* использовать, а также больше не является ошибкой предоставление диагностики, которую компилятор не распознаёт. Такая гибкость позволяет исходному коду предоставлять диагностику, даже если она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации языка. -В этом пространстве имен появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]` , который можно поместить на типаж для настройки сообщения, когда этот типаж требуется, но он не реализован у типа. Рассмотрим пример, приведенный в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/) : +В этом пространстве имён появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]`, который можно поместить на типаж для настройки сообщения, в котором этот типаж требуется, но не реализован у типа. Рассмотрим пример, приведённый в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/): ```rust #[diagnostic::on_unimplemented( @@ -41,7 +41,7 @@ fn main() { } ``` -Ранее, компилятор выдал бы такую ​​встроенную ошибку: +Ранее компилятор выдал бы такую ​​встроенную ошибку: ``` error[E0277]: the trait bound `String: ImportantTrait` is not satisfied @@ -54,7 +54,7 @@ error[E0277]: the trait bound `String: ImportantTrait` is not satisfied | ``` -С помощью `#[diagnostic::on_unimplemented]` его пользовательское сообщение заполняет основную строку ошибки, а пользовательская метка помещается в исходный вывод. Исходная метка по-прежнему записывается как справочная информация, а также записываются все пользовательские примечания. (Эти данные могут быть изменены.) +Теперь с помощью `#[diagnostic::on_unimplemented]` пользовательское сообщение заполняет основную строку ошибки, а пользовательская метка помещается в исходный вывод. Исходная метка по-прежнему записывается как справочная информация, а также записываются все пользовательские примечания (эти данные могут быть изменены). ``` error[E0277]: My Message for `ImportantTrait` is not implemented for `String` @@ -70,7 +70,7 @@ error[E0277]: My Message for `ImportantTrait` is not implemented for `Strin = note: Note 2 ``` -Для авторов типажей такой вид диагностики более полезен, потому что можно дать более подробную подсказку, чем просто писать об отсутствующей реализации. Например, это сокращенный образец из стандартной библиотеки: +Для авторов типажей такой вид диагностики более полезен, потому что с его помощью можно дать более подробную подсказку, чем просто писать об отсутствующей реализации. В качестве примера ниже показан сокращённый образец из стандартной библиотеки: ```rust #[diagnostic::on_unimplemented( @@ -80,15 +80,15 @@ error[E0277]: My Message for `ImportantTrait` is not implemented for `Strin pub trait Sized {} ``` -Дополнительные сведения смотрите в справочном разделе [инструмент `diagnostic` пространства имен атрибутов](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). +Дополнительные сведения смотрите в справочном разделе [инструмент `diagnostic` пространства имён атрибутов](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). ### Проверка предусловий `unsafe` Стандартная библиотека Rust содержит ряд утверждений для предварительных условий `unsafe` функций, но исторически они были включены только в сборках стандартной библиотеки при помощи `#[cfg(debug_assertions)]`, чтобы избежать влияния на производительность release сборки. Однако, поскольку стандартная библиотека обычно компилируется и распространяется с release профилем, большинство разработчиков Rust вообще никогда не выполняют эти проверки. -Теперь выполнение условий для этих проверок откладывается до генерации кода, поэтому они будут проверяться в зависимости от собственных настроек пользователя для отладочных проверок, включенных по умолчанию в отладочных и тестовых сборках. Это изменение помогает пользователям отслеживать неопределённое поведение в своём коде, хотя информация о том, сколько всего проверяется, как правило, не является стабильной. +Теперь выполнение условий для этих проверок откладывается до генерации кода, поэтому они будут проверяться в зависимости от собственных настроек пользователя для отладочных проверок, включённых по умолчанию в отладочных и тестовых сборках. Это изменение помогает пользователям отслеживать неопределённое поведение в своём коде, хотя информация о том, сколько всего проверяется, как правило, не является стабильной. -Например [`slice::from_raw_parts`](https://doc.rust-lang.org/std/slice/fn.from_raw_parts.html) требует выровненный ненулевой указатель. Следующее использование намеренно смещенного указателя приводит к неопределенному поведению, и хотя это может не иметь очевидных последствий, debug-проверка теперь может перехватить его: +Например, [`slice::from_raw_parts`](https://doc.rust-lang.org/std/slice/fn.from_raw_parts.html) требует выровненный ненулевой указатель. Следующее использование намеренно смещённого указателя приводит к неопределённому поведению и, хотя это может не иметь очевидных последствий, debug-проверка теперь может перехватить его: ```rust fn main() { @@ -112,16 +112,16 @@ thread caused non-unwinding panic. aborting. ### Детерминированное повторное выравнивание -В стандартной библиотеке есть несколько функций, которые изменяют выравнивание указателей и срезов, но раньше у них были оговорки, из-за которых на них было трудно полагаться на практике, если вы точно следовали их документации. Эти предостережения в первую очередь существовали как страховка от вычисления `const`, но в любом случае они стабильны только для использования без `const`. Теперь обещано, что они будут иметь согласованное поведение во время выполнения в соответствии с фактическими входными данными +В стандартной библиотеке есть несколько функций, которые изменяют выравнивание указателей и срезов. Раньше в их использовании было несколько оговорок, из-за которых на практике полагаться на них было трудно, особенно если вы точно следовали документации. Эти предостережения в первую очередь существовали как страховка от вычисления `const`, но в любом случае они были стабильны только для использования вне `const`. Теперь обещано, что они будут иметь согласованное поведение во время выполнения в соответствии с фактическими входными данными -- [`pointer::align_offset`](https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset) вычисляет смещение, необходимое для изменения указателя на заданное выравнивание. Он возвращает `usize::MAX` если это невозможно, хотя раньше было разрешено *всегда* возвращать `usize::MAX`, то теперь это поведение удалено. +- [`pointer::align_offset`](https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset) вычисляет смещение, необходимое для изменения указателя на заданное выравнивание. Эта функция возвращает `usize::MAX`, если смещение невозможно, хотя раньше ей было разрешено *всегда* возвращать `usize::MAX`. Теперь такое поведение удалено. -- Функции [`slice::align_to`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to) и [`slice::align_to_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut) преобразуют срезы в выровненный срез средней части данных и невыровненные головной и хвостовой. Эти методы теперь обещают возвращать максимально возможную среднюю часть, вместо того, чтобы позволять реализации возвращать что-то менее оптимальное, например возвращать все в виде головного среза. +- Функции [`slice::align_to`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to) и [`slice::align_to_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut) преобразуют срезы в выровненный срез средней части данных и невыровненные головной и хвостовой. Теперь они обещают возвращать максимально возможную среднюю часть — вместо того, чтобы позволять реализации возвращать что-то менее оптимальное. Например, возвращать всё в виде головного среза. ### Стабилизированные API - [`impl Read for &Stdin`](https://doc.rust-lang.org/stable/std/io/struct.Stdin.html#impl-Read-for-%26Stdin) -- [В зависимости от реализации разрешены не `'static` времена жизни для некоторых `std::error::Error`](https://github.com/rust-lang/rust/pull/113833/) +- [В зависимости от реализации разрешены не-`'static` времена жизни для некоторых `std::error::Error`](https://github.com/rust-lang/rust/pull/113833/) - [`impl` имплементирует `?Sized`](https://github.com/rust-lang/rust/pull/114655/) - [`impl From for io::Error`](https://doc.rust-lang.org/stable/std/io/struct.Error.html#impl-From%3CTryReserveError%3E-for-Error) @@ -138,7 +138,7 @@ thread caused non-unwinding panic. aborting. - `i686-pc-windows-gnu` - `x86_64-pc-windows-gnullvm` - `i686-pc-windows-gnullvm` -- В Rust 1.78 обновлён встроенный LLVM до версии 18
has upgraded its bundled LLVM to version 18, завершено изменение ABI для [`u128`/`i128`](https://blog.rust-lang.org/2024/03/30/i128-layout-update.html) для x86-32 и x86-64 платформ. Дистрибьюторы, которые используют свою собственную LLVM старше 18 лет, все еще могут сталкиваться с ошибками в соглашении о вызовах, упомянутыми в этом посте. +- В Rust 1.78 обновлён встроенный LLVM до версии 18, завершено изменение ABI для [`u128`/`i128`](https://blog.rust-lang.org/2024/03/30/i128-layout-update.html) для x86-32 и x86-64 платформ. Дистрибьюторы, которые используют свою собственную LLVM старше 18 лет, всё ещё могут сталкиваться с ошибками в соглашении о вызовах, упомянутыми в этом посте. ### Прочие изменения From 7aed0054100fb07007e5abc9faa8a79b9cbbbab3 Mon Sep 17 00:00:00 2001 From: Istratov Dmitrii Date: Fri, 3 May 2024 18:14:19 +0000 Subject: [PATCH 4/7] Update ru/announcements/2024-05-02-Rust-1.78.0.md --- ru/announcements/2024-05-02-Rust-1.78.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md index 74da299..6dc059d 100644 --- a/ru/announcements/2024-05-02-Rust-1.78.0.md +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -21,7 +21,7 @@ $ rustup update stable ### Диагностические атрибуты -Теперь Rust поддерживает пространство имён атрибута `#[diagnostic]`, что позволяет влиять на сообщения ошибок компилятора. Теперь они рассматриваются как подсказки, которые компилятору *не требуется* использовать, а также больше не является ошибкой предоставление диагностики, которую компилятор не распознаёт. Такая гибкость позволяет исходному коду предоставлять диагностику, даже если она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации языка. +Теперь Rust поддерживает пространство имён атрибутов `#[diagnostic]`, что позволяет влиять на сообщения ошибок компилятора. Теперь они рассматриваются как подсказки, которые компилятору *не должен* использовать. Также это не ошибка, предоставляющая диагностику, которую компилятор не распознаёт. Такая гибкость позволяет исходному коду предоставлять диагностику, даже если она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации компилятора. В этом пространстве имён появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]`, который можно поместить на типаж для настройки сообщения, в котором этот типаж требуется, но не реализован у типа. Рассмотрим пример, приведённый в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/): From 4098a4ef96a68beddb58a14907d26169860996eb Mon Sep 17 00:00:00 2001 From: Istratov Dmitrii Date: Fri, 3 May 2024 18:14:25 +0000 Subject: [PATCH 5/7] Update ru/announcements/2024-05-02-Rust-1.78.0.md --- ru/announcements/2024-05-02-Rust-1.78.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md index 6dc059d..1d3043d 100644 --- a/ru/announcements/2024-05-02-Rust-1.78.0.md +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -23,7 +23,7 @@ $ rustup update stable Теперь Rust поддерживает пространство имён атрибутов `#[diagnostic]`, что позволяет влиять на сообщения ошибок компилятора. Теперь они рассматриваются как подсказки, которые компилятору *не должен* использовать. Также это не ошибка, предоставляющая диагностику, которую компилятор не распознаёт. Такая гибкость позволяет исходному коду предоставлять диагностику, даже если она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации компилятора. -В этом пространстве имён появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]`, который можно поместить на типаж для настройки сообщения, в котором этот типаж требуется, но не реализован у типа. Рассмотрим пример, приведённый в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/): +В этом пространстве имён появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]`, который можно применить к трейту для настройки сообщения, которое отобразится, когда этот трейт требуется, но не реализован у типа. Рассмотрим пример, приведённый в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/): ```rust #[diagnostic::on_unimplemented( From 78d87a6ac1f8acad26f4c072e5d47000b8825515 Mon Sep 17 00:00:00 2001 From: Istratov Dmitrii Date: Fri, 3 May 2024 18:14:32 +0000 Subject: [PATCH 6/7] Update ru/announcements/2024-05-02-Rust-1.78.0.md --- ru/announcements/2024-05-02-Rust-1.78.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md index 1d3043d..a17d66e 100644 --- a/ru/announcements/2024-05-02-Rust-1.78.0.md +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -80,7 +80,7 @@ error[E0277]: My Message for `ImportantTrait` is not implemented for `Strin pub trait Sized {} ``` -Дополнительные сведения смотрите в справочном разделе [инструмент `diagnostic` пространства имён атрибутов](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). +Дополнительные сведения смотрите в справочном разделе [о пространстве имён атрибута `diagnostic`](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-diagnostic-tool-attribute-namespace). ### Проверка предусловий `unsafe` From 16f6e7c7389458cb4db9759b5fc0c2e2bde6092c Mon Sep 17 00:00:00 2001 From: Istratov Dmitrii Date: Fri, 3 May 2024 18:15:27 +0000 Subject: [PATCH 7/7] Update ru/announcements/2024-05-02-Rust-1.78.0.md --- ru/announcements/2024-05-02-Rust-1.78.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru/announcements/2024-05-02-Rust-1.78.0.md b/ru/announcements/2024-05-02-Rust-1.78.0.md index a17d66e..d7fd199 100644 --- a/ru/announcements/2024-05-02-Rust-1.78.0.md +++ b/ru/announcements/2024-05-02-Rust-1.78.0.md @@ -21,7 +21,7 @@ $ rustup update stable ### Диагностические атрибуты -Теперь Rust поддерживает пространство имён атрибутов `#[diagnostic]`, что позволяет влиять на сообщения ошибок компилятора. Теперь они рассматриваются как подсказки, которые компилятору *не должен* использовать. Также это не ошибка, предоставляющая диагностику, которую компилятор не распознаёт. Такая гибкость позволяет исходному коду предоставлять диагностику, даже если она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации компилятора. +Теперь Rust поддерживает пространство имён атрибутов `#[diagnostic]`, что позволяет влиять на сообщения об ошибоках компилятора. Теперь они рассматриваются как подсказки, которые компилятору *не должен* использовать. Также это не ошибка, предоставляющая диагностику, которую компилятор не распознаёт. Такая гибкость позволяет исходному коду предоставлять диагностику, даже если она не поддерживается всеми компиляторами, будь то разные версии или совершенно разные реализации компилятора. В этом пространстве имён появляется первый поддерживаемый атрибут `#[diagnostic::on_unimplemented]`, который можно применить к трейту для настройки сообщения, которое отобразится, когда этот трейт требуется, но не реализован у типа. Рассмотрим пример, приведённый в [запросе на стабилизацию](https://github.com/rust-lang/rust/pull/119888/):