Rust 1.45 プログラミング言語のリリース

公開済み システム プログラミング言語のリリース 1.45 さび, Mozilla プロジェクトによって設立されました。 この言語はメモリの安全性に重点を置き、自動メモリ管理を提供し、ガベージ コレクタやガベージ コレクタを使用せずに高いタスクの並列処理を実現するツールを提供します。 ランタイム.

Rust の自動メモリ管理は、ポインタ操作時のエラーを排除し、解放後のメモリ領域へのアクセス、null ポインタの逆参照、バッファ オーバーランなど、低レベルのメモリ操作から生じる問題を防ぎます。 プロジェクトごとにライブラリを配布し、確実にアセンブリし、依存関係を管理するためのパッケージ マネージャーが開発されています。 貨物を使用すると、プログラムに必要なライブラリをワンクリックで取得できます。 リポジトリはライブラリをホストするためにサポートされています crates.io.

メイン イノベーション:

  • 長年の悩みを解消 不完全 整数と浮動小数点数の間で変換を実行する場合。 Rust コンパイラはバックエンドとして LLVM を使用するため、型変換操作は次のような LLVM 中間コード命令を通じて実行されました。 エフプトゥイこれには 300 つの重要な機能があります。それは、結果の値がターゲットの型に適合しない場合の未定義の動作です。 たとえば、f32 型の float 値 8 を整数型 uXNUMX に変換する場合、結果は予測不可能であり、システムによって異なる場合があります。 問題は、この機能が「安全でない」とマークされていないコードに現れることです。

    Rust 1.45 の時点では、型サイズのオーバーフローの動作は厳密に規制されており、「as」変換操作ではオーバーフローがチェックされ、変換される値がターゲット型の最大値または最小値 (上記の例では、 300 は 255 に変換されます)。 このようなチェックを無効にするために、追加の API 呼び出し「{f64, f32}::to_int_unchecked」が提供され、アンセーフ モードで動作します。

    fn キャスト(x: f32) -> u8 {
    u8としてのx
    }

    fn main() {
    let too_big = 300.0;
    let too_small = -100.0;
    nan = f32::NAN とします。

    x: f32 = 1.0 とします。
    let y: u8 = unsafe { x.to_int_unchecked() };

    println!("too_big_casted = {}", Cast(too_big)); // 出力255
    println!("too_small_casted = {}", Cast(too_small)); // 0を出力する
    println!("not_a_number_casted = {}", Cast(nan)); // 0を出力する
    }

  • 安定して使用してください 手続き型マクロ関数のような式、テンプレート、ステートメント。 以前は、このようなマクロはどこでも呼び出すことができず、コードの特定の部分でのみ呼び出すことができました (他のコードと絡み合わずに別個の呼び出しとして)。 関数と同様に、マクロを呼び出す方法を拡張することが、Web フレームワークを機能させるための要件の XNUMX つでした ロケット Rustの安定版リリースでは。 以前は、Rocket でハンドラーを定義する際にさらなる柔軟性を実現するには、「proc_macro_hygiene」と呼ばれる実験的な機能を有効にする必要がありましたが、これは Rust の安定版では利用できませんでした。 この機能は、言語の安定版リリースに組み込まれています。
  • 範囲値を反復するためにタイプ「char」の範囲を使用できるようになりました (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    for ch in 'a'..='z' {
    print!("{}", ch);
    }
    println!(); // 「abcdefghijklmnopqrstuvwxyz」を出力します

  • API の新しい部分は、安定化されたものを含む安定化カテゴリに移されました。
    Arc::as_ptr、
    BTreeMap::remove_entry、
    Rc::as_ptr、
    rc::Weak::as_ptr、
    rc::Weak::from_raw、
    rc::Weak::into_raw、
    str::strip_prefix、
    str::strip_suffix、
    sync::Weak::as_ptr、
    sync::Weak::from_raw、
    sync::Weak::into_raw、
    char::UNICODE_VERSION、
    スパン::resolved_at、
    スパン::located_at、
    スパン::混合サイト、
    unix::process::CommandExt::arg0。

  • Rustc コンパイラは、「target-feature」フラグ (「-C target-feature=+avx2,+fma」など) を使用してさまざまなターゲット プラットフォーム機能をオーバーライドするためのサポートを追加しました。 新しいフラグも追加されました。
    "force-unwind-tables" は、クラッシュ処理戦略に関係なく、アンワインド呼び出しテーブルを生成します。 「embed-bitcode」は、LLVM ビットコードが生成された rlib に含まれるかどうかを制御します。 ビルド時間とディスク容量の消費を最適化するために、Cargo では「embed-bitcode」フラグがデフォルトで有効になっています。

  • mipsel-sony-psp およびthumbv7a-uwp-windows-msvc プラットフォームには、第 XNUMX レベルのサポートが提供されています。 XNUMX 番目のレベルには基本的なサポートが含まれますが、自動テストや公式ビルドの公開は含まれません。

さらに、注目できるのは、 物語 最も単純なものの作成について アプリケーション Rust 言語では、システム ブートローダーの使用を開始し、オペレーティング システムの代わりに自己完結型ロードを実行できるようになります。
この記事は、低レベルのプログラミングや OS 開発で求められるテクニックのデモンストレーションに特化したシリーズの第 XNUMX 弾です。

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

コメントを追加します