アセンブリ挿入をサポートする Rust 1.59 プログラミング言語のリリース

Mozilla プロジェクトによって設立され、現在は独立した非営利団体 Rust Foundation の後援の下で開発されている汎用プログラミング言語 Rust 1.59 のリリースが公開されました。 この言語はメモリの安全性に焦点を当てており、ガベージ コレクターとランタイムの使用を回避しながら、高いジョブ並列処理を実現する手段を提供します (ランタイムは、標準ライブラリの基本的な初期化とメンテナンスに短縮されます)。

Rust のメモリ処理メソッドは、開発者をポインタ操作時のエラーから守り、解放後のメモリ領域へのアクセス、null ポインタの逆参照、バッファ オーバーランなど、低レベルのメモリ処理によって発生する問題から保護します。 ライブラリを配布し、ビルドを提供し、依存関係を管理するために、プロジェクトは Cargo パッケージ マネージャーを開発します。 crates.io リポジトリは、ライブラリのホストとしてサポートされています。

Rustでは、参照チェック、オブジェクトの所有権の追跡、オブジェクトの有効期間(スコープ)の追跡、コード実行中のメモリアクセスの正確性の評価を通じて、コンパイル時にメモリの安全性が提供されます。 Rust は整数オーバーフローに対する保護も提供し、使用前に変数値の初期化を必須にし、標準ライブラリでエラーをより適切に処理し、デフォルトで不変参照と変数の概念を適用し、論理エラーを最小限に抑えるための強力な静的型付けを提供します。

主な革新:

  • アセンブリ言語の挿入を使用することができます。これは、低レベルで実行を制御する必要があるアプリケーションや特殊な機械語命令を使用できるアプリケーションで需要があります。 アセンブリインサートはマクロ「asm!」を使用して追加されます。 そして「global_asm!」 Rustの文字列置換に使用されるものと同様の、レジスタに名前を付けるための文字列フォーマット構文を使用します。 コンパイラは、x86、x86-64、ARM、AArch64、および RISC-V アーキテクチャのアセンブリ命令をサポートします。 挿入例: std::arch::asm を使用します。 // シフトと加算を使用して x を 6 で乗算します let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); Assert_eq!(x, 4 * 6);
  • 複数の特性、スライス、または構造が式の左側で指定される、非構造化 (並列) 代入のサポートが追加されました。 例: let (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; 構造体 { e, .. } = 構造体 { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • const ジェネリックスのデフォルト値を指定する機能が提供されています: struct ArrayStorage { arr: [T; N], } impl アレイストレージ{ fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Cargo パッケージ マネージャーは、コンパイラーのエラーにより処理される依存関係での無効な構造の使用に関する警告を提供します (たとえば、エラーにより、パックされた構造のフィールドが安全なブロックで借用されることが許可されました)。 このような構造は、Rust の将来のバージョンではサポートされなくなります。
  • Cargo と Rustc には、別のユーティリティを呼び出すことなく、デバッグ データ (strip = "debuginfo") とシンボル (strip = "symbols") を取り除いた実行可能ファイルを生成する機能が組み込まれています。 クリーニング設定は、Cargo.toml の「strip」パラメータを通じて実装されます: [profile.release]strip = “debuginfo”, “symbols”
  • インクリメンタルコンパイルはデフォルトでは無効になっています。 その理由は、クラッシュや逆シリアル化エラーを引き起こすコンパイラのバグに対する一時的な回避策であると言われています。 バグ修正はすでに準備されており、次のリリースに含まれる予定です。 インクリメンタル コンパイルを返すには、環境変数 RUSTC_FORCE_INCREMENTAL=1 を使用できます。
  • API の新しい部分は、安定化された特性のメソッドと実装を含め、安定化のカテゴリに移動されました。
    • std::thread::available_Parallelism
    • 結果::コピーされました
    • 結果::クローンが作成されました
    • アーチ::アスム!
    • アーチ::グローバル_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_ continue
    • u8 の TryFrom
    • char::TryFromCharError (クローン、デバッグ、表示、PartialEq、コピー、Eq、エラー)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • ToLowercase 構造体の DoubleEndedIterator
    • ToUppercase 構造体の DoubleEndedIterator
    • TryFrom<&mut [T]> の [T; N]
    • Once 構造の UnwindSafe
    • 一度だけRefUnwindSafe
    • aarch8 のコンパイラに組み込まれた armv64 neon サポート関数
  • 「const」属性は、定数の代わりに任意のコンテキストで使用できるかどうかを決定し、関数で使用されます。
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

出所: オープンネット.ru

コメントを追加します