Rust 1.78はバンドルされたLLVMをバージョン18にアップグレードし、x86-32およびx86-64ターゲット向けに発表されたu128/i128 ABI変更を完了しました。バージョン18より古い独自のLLVMを使用している配布者は、その投稿で言及されている呼び出し規約のバグにまだ直面する可能性があります。Rust 1.78はバンドルされたLLVMをバージョン18にアップグレードし、x86-32およびx86-64ターゲット向けに発表されたu128/i128 ABI変更を完了しました。バージョン18より古い独自のLLVMを使用している配布者は、その投稿で言及されている呼び出し規約のバグにまだ直面する可能性があります。

Rust 1.78.0: 新機能の紹介

2025/12/08 02:45
12 分で読めます
本コンテンツに関するご意見・ご感想は、crypto.news@mexc.comまでご連絡ください。

Rustチームは、Rustの新バージョン1.78.0を発表できることを嬉しく思います。Rustは、誰もが信頼性の高い効率的なソフトウェアを構築できるようにするプログラミング言語です。

\ `rustup`を通じてRustの以前のバージョンをインストールしている場合は、次のコマンドで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`はアラインメントされた非nullポインタを必要とします。以下の意図的にアラインメントされていないポインタの使用は未定義動作であり、運が悪ければ過去に「動作」しているように見えたかもしれませんが、デバッグアサーションが現在それを捕捉できます:

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`
  • いくつかの`std::error::Error`関連の実装に対して非`'static`ライフタイムを受け入れる
  • `impl<Fd: AsFd>`の実装が`?Sized`を取るようにする
  • `impl From<TryReserveError> for io::Error`

\ これらのAPIは現在、const contextsで安定しています:

  • `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にアップグレードし、x86-32およびx86-64ターゲット向けに発表された`u128`/`i128` ABI変更を完了しました。LLVM 18より古い独自のLLVMを使用するディストリビューターは、その投稿で言及されている呼び出し規約のバグにまだ直面する可能性があります。

その他の変更

Rust、Cargo、およびClippyで変更されたすべてをチェックしてください。

1.78.0への貢献者

多くの人々がRust 1.78.0を作成するために集まりました。皆さんなしではできませんでした。ありがとうございます!


Rustリリースチーム

\ こちらでも公開されています

\ 写真:Ubaid E. Alyafizi(Unsplash)

市場の機会
ChangeX ロゴ
ChangeX価格(CHANGE)
$0.00142061
$0.00142061$0.00142061
-0.05%
USD
ChangeX (CHANGE) ライブ価格チャート
免責事項:このサイトに転載されている記事は、公開プラットフォームから引用されており、情報提供のみを目的としています。MEXCの見解を必ずしも反映するものではありません。すべての権利は原著者に帰属します。コンテンツが第三者の権利を侵害していると思われる場合は、削除を依頼するために crypto.news@mexc.com までご連絡ください。MEXCは、コンテンツの正確性、完全性、適時性について一切保証せず、提供された情報に基づいて行われたいかなる行動についても責任を負いません。本コンテンツは、財務、法律、その他の専門的なアドバイスを構成するものではなく、MEXCによる推奨または支持と見なされるべきではありません。

USD1ジェネシス:手数料0 + 12%のAPR

USD1ジェネシス:手数料0 + 12%のAPRUSD1ジェネシス:手数料0 + 12%のAPR

新規ユーザー限定:最大600%のAPRでステーキング。期間限定!