Rust 1.9の新しいバージョンをご紹介します。 Rustは、メモリ、速度、およびコードの並列実行による安全な作業を目的としたシステムプログラミング言語です。
いつものように、公式Webサイトの対応するページからRust 1.9をインストールできます。また、GitHubでこのバージョンの変更点の詳細なリストを確認できます。 このリリースには、約1,400のパッチが含まれています。
安定版1.9に含まれるもの
ガイド付きスタックの巻き戻し
Rust 1.9の最大の変更点は、 std::panic
モジュールの安定化です。このモジュールは、パニックによってトリガーされたスタックの巻き戻しプロセスを停止するメソッドを提供します。
use std::panic; let result = panic::catch_unwind(|| { println!("!"); }); assert!(result.is_ok()); let result = panic::catch_unwind(|| { panic!(" !"); }); assert!(result.is_err());
このインターフェイスはRFC 1236で定義されました 。
一般に、Rustは2種類のエラー状況を区別します。
- 予想される問題 、たとえば、ファイルが見つかりませんでした。
- 予期しない問題 、たとえば、境界外の配列へのアクセス。
予想される問題は通常、プログラムが制御できない状況が原因で発生します。 信頼できるコードは、その環境で発生するトラブルに備えて準備する必要があります。 Rustでは、期待される問題はResult
型を使用して処理されます。これにより、関数は問題に関する情報を呼び出し元に返すことができ、呼び出し元は既にエラーを処理できます。 これは、エラーを処理する非常に正確な方法です。
予期しない問題はバグです。それらは契約違反またはアサーションが原因で発生します。 それらの発生は予想外であるため、このようなエラーを正確に処理する意味はほとんどありません。 代わりに、Rustは「フェイルファースト」アプローチを使用します。このようなエラーは、デフォルトで、エラーが発生したスレッドスタックの巻き戻しを開始するパニックを引き起こします。 この場合、デストラクタのみが実行され、他のコードは実行されません。 他のスレッドは引き続き実行されますが、パニックストリームとデータを交換しようとするとパニックになります(チャネルまたは共有メモリを介して)。 したがって、パニックはある種の「分離境界」まで実行を中断します。 境界線の反対側のコードは引き続き動作し、パニックからプログラムを復元する場合は、「失礼」な方法で実行できます。 たとえば、サーバーは、スレッドの1つでアサートが失敗したために必ずしもクラッシュするわけではありません。
新しいcatch_unwind
インターフェイスは、ストリーム内に追加の分離境界を導入する方法を提供します 。 これが役立つ場合の例がいくつかあります。
最初のケースは、潜在的にあいまいな動作でした。 実際には、別の言語に巻き戻すと、しばしばセグメンテーション違反が発生します。 パニックをキャッチできるように、C APIとしてのRustコードのエクスポートを簡素化します。Cへの移行の境界でパニックをキャッチし、リターンコードに変換できるようになりました。
2番目のケースは、スレッドプールライブラリによるものです。 プール内のスレッドがパニックになった場合、通常、スレッド自体を強制終了する必要はありません。 代わりに、パニックをキャッチして、プールのクライアントに報告する必要があります。 catch_unwind
インターフェースにはresume_unwind
関数resume_unwind
、これを使用して、所属するプールのクライアント側でパニックプロセスを再起動できます。
どちらの場合も、フロー内に追加の分離境界を導入し、パニックを別のタイプのエラーに変換します。
最後の注意点: catch_unwind
なくcatch_panic
理由 別のパニック戦略を追加する作業が進行中です :プロセス全体を中止(中止)します。 この場合、共通のフックが実行されます。 一部のアプリケーションでは、これがプログラミングエラーを処理する最も賢明な方法であり、スタックの巻き戻しを防止することでパフォーマンスが向上し、コードサイズが小さくなります。
非推奨の警告
ライブラリ作成者は、新しい属性#[deprecated]
使用できます。 この属性を使用すると、古いインターフェイスをマークでき、ライブラリユーザーはそれを使用するときに警告を受け取ります。 この場合、新しい推奨交換インターフェースを指定できます。 廃止されたインターフェースに関する警告は、標準ライブラリで長い間使用されてきましたが、 RFC 1270のおかげで、Rustエコシステム全体で使用できるようになりました。
新しいコンパイルプラットフォーム
現在、いくつかの新しいプラットフォーム用にコンパイルされた標準ライブラリが公開されています。
mips-unknown-linux-musl
、mipsel-unknown-linux-musl
、およびi586-pc-windows-msvc
最初の2つのプラットフォームは、クロスコンパイルに関して特に興味深いものです。 最近のrustup
詳細を参照してください 。
コンパイルの高速化
型の統一中に変数の等価性をチェックする時間的な複雑さは 、O(n!)からO(n)に削減されました。 この結果、一部のコードサンプルははるかに高速にコンパイルされます。
専門化の使用を展開する
このリリースでは 、標準ライブラリで最初に特殊化が使用されます。 現在、スペシャライゼーションは夜間にのみ利用できます。 これにより、より具体的なタイプの汎用コードを特化することができます。
標準ライブラリでこれが発生する1つの例は、文字列のスライス( &str
)から独自の文字列( String
)への変換です。 to_string
メソッドは、特殊なto_owned
メソッドよりも低速であった汎用インターフェイスから取得されます。 現在、これらの関数は同等です。
この単純なケースを実装したら、専門化によって生産性を向上できる他の場所に進みます。
ライブラリの安定化
1.9では、約80個のライブラリ関数が安定化されています。 最も顕著な変更は、前述のstd::panic
モジュールです。 彼以外にもいくつかのことがあります。
ネットワーキング
TcpStream
、 TcpListener
およびUdpSocket
はTcpListener
接続構成メソッドを受け取りました。SocketAddr
とそのバリアントには、便利なset_ip()
およびset_port()
メソッドがあります。
コレクション
BTreeSet
とHashSet
は、 take()
、 replace()
、およびget()
メソッドを取得しました。これらのメソッドにより、元のキーの所有権を取り戻すことができます。OsString
はいくつかの新しいメソッドが追加され、 String
ようになりました。- スライスは、
memcpy
安全な形式であるcopy_from_slice()
取得しました。
エンコーディング
char
はUTF-16でデコードできるようになりました。
ポインタ
- 生のポインタは
as_ref()
およびas_ref()
をas_mut()
、 Option<&T>
を返し、nullポインタをNone
変換します。 ptr::{read,write}_volatile()
は、rawポインターによるマルチスレッド(揮発性)読み取りおよび書き込みを許可します。
最後に、 libcore
多くのタイプには、 Debug
libcore
実装がありませんでした。 これはリリース1.9で修正されました。
詳細はこちらをご覧ください 。
貨物の特徴
貨物には2つの大きな変更があります。
まず、複数の貨物プロセスが同時に機能するようになりました 。
次に、新しいフラグRUSTFLAGS
が追加されました。 このフラグを使用すると、 rustc
が環境を通過する任意のフラグを指定できます。 これは、たとえばパッケージパッカーに便利です。
詳細はこちらをご覧ください 。
開発者バージョン1.9
バージョン1.9のリリースには127人が参加しました。 どうもありがとう!