Rustチームは、Rust 1.18.0のリリースを発表します。 Rustは、セキュリティ、速度、および並列コード実行を目的としたシステムプログラミング言語です。
Rustの以前のバージョンがインストールされている場合、アップグレードするには次のようにします。
$ rustup update stable
Rustをまだインストールしていない場合は、当社のWebサイトの対応するページから rustup
を rustup
し、GitHubの詳細なリリースノート1.18.0を読むことができます。
安定バージョン1.18.0に含まれるもの
いつものように、Rust 1.18.0は多くの改善と新機能を収集しています。
最も大きく、最も予想される変更の1つ:チームメンバーのキャロルニコルズとスティーブクラブニックは、Rustの公式本であるRustプログラミング言語の新版を書いています。 GitHubで公開されており、すでに100人以上が貢献しています。 このリリースには、オンラインドキュメントの第2版の最初のドラフトが含まれています 。 20の章のうち19がすでに作成されており、Rust 1.19リリースでは20章のドラフト版が追加されます。 書籍が完成したら、紙のコピーをご希望の場合は、 No Starch Pressから印刷可能なバージョンを入手できます。 テキストを改善するために、Startchのないエディターと引き続き協力していますが、今では幅広い読者に本を提供したいと考えています。
新しいエディションは完全にゼロから書かれており、過去2年間のRustのトレーニングで得た知識を使用しています。 Rustの重要な概念の多く、新しい学習プロジェクト、その他の多くの興味深く有用なものについて、まったく新しい説明が見つかります。 ご覧になり、ご意見をお聞かせください !
言語自体に関しては、古い関数に新しい機能が追加されました: pub
キーワードが少し拡張されました。 Rustの経験豊富なプログラマーは、Rustではすべての要素がデフォルトでプライベートであることを知っています。それらを公開するには、 pub
キーワードを使用する必要があります。 Rust 1.18.0では、 pub
は新しいフォームを取得しました :
pub(crate) bar;
()
内の式は、スコープを指定する「制約」です。 上記の例でcrate
キーワードを使用すると、 bar
はコンテナ(crate)全体で公開されますが、コンテナの外部では公開されません。 これにより、「コンテナに公開」されているがユーザーにはアクセスできないAPIを簡単に作成できます。 これは、既存のモジュールシステムでは可能ですが、非常に多くの場合、不快に見えました。
たとえば、パスを指定することもできます。
pub(in a::b::c) foo;
これは、「 foo
a::b::c
階層内に公開されてa::b::c
ますが、他のどこにもありません」という意味です。 この機能はRFC 1422で定義され、ドキュメントで説明されています 。
Windowsユーザーの場合、Rust 1.18.0には , #![windows_subsystem]
ます。 次のように機能します。
#![windows_subsystem = "console"] #![windows_subsystem = "windows"]
これらの式 /SUBSYSTEM
リンカー /SUBSYSTEM
制御 /SUBSYSTEM
ます。 現在、 console
とwindows
のみwindows
。
これはいつ役立つのでしょうか? 最も単純なケースでは、グラフィカルアプリケーションを開発していて、 windows
指定しなかった場合、アプリケーションの起動時にコンソールウィンドウが表示されます。 このフラグでは、これは起こりません。
最後に、タプル、列挙、および構造( #[repr]
なし)には、常にメモリ内の不明確な割り当てがありました。 自動リオーダーを有効にしました 。これにより 、構造が小さくなる場合があります。
次の構造を想像してください。
struct Suboptimal(u8, u16, u8);
x86_64プラットフォーム上のRustの以前のバージョンでは、この構造はメモリで6バイトを占有していました。 しかし、コードを見ると、4しか期待できません。アライメントのために、さらに2バイトが表示されます。構造体の最大タイプはu16
であるため、2バイトでアライメントする必要があります。 ただし、この場合、 u16
は1バイトのオフセットでメモリに配置されます。 2バイトのオフセットで配置するには、最初のu8
後に別のアライメントバイトを追加する必要があります。 2番目のu8
後に別のバイトを追加すると、次のu8
になります。
1 + 1 () + 2 + 1 + 1 () = 6
しかし、私たちの構造がこのように見えたらどうでしょうか?
struct Optimal(u8, u8, u16);
この構造は最適に配置されています。 u16
は、構造全体と同じように2バイトにアライメントされます。 位置合わせは必要ありません。 これにより、 1 + 1 + 2 = 4
。
Rustを設計する際、まさにこの理由から、メモリ内の配置の詳細を未定義のままにしました。 特定のポリシーを順守することなく、たとえばこの場合のように、コンパイラがOptimal
Suboptimal
を自動的にOptimal
化できる場合、最適化をSuboptimal
ことができます。 また、Rust 1.18.0でSuboptimal
とOptimal
サイズを確認すると、両方ともサイズが4バイトであることがわかります。
この変更は長い間計画されています。 Rustの以前のバージョンではこの最適化がナイトリービルドに含まれていましたが、一部の人々は正確なメモリデータを必要とする安全でないコードを記述しました。 この変更をロールバックし、知っていたすべてのそのようなケースを修正しました。 ただし、正しく機能しないコードを見つけた場合は、修正できるようお知らせください !
rustdoc
をMarkdown互換のCommonMarkパーサーに移行する予定でした。 ただし、CommonMarkの仕様は現在のパーサーであるHoedownとは異なるため、単純な移行では問題が発生する可能性があります。 移行計画の一環として、 rustdoc
に rustdoc
--enable-commonmark
rustdoc
。 このフラグには、古いパーサーの代わりに新しいパーサーの使用が含まれます。 やってみてください! 私たちが知る限り、両方のパーサーは同じ結果を生成しますが、結果が異なるシナリオを見つけたかどうかを知りたいです!
最後に、 rustc
自体のコンパイルrustc
15%-20%高速になりました 。 このPRのコミットメッセージにはいくつかの詳細が含まれています。 多くの非効率的な場所がありましたが、現在はすべて修正されています。
標準ライブラリの安定化
このリリースでは、7つの新しいAPIが安定化されました。
-
Child::try_wait
、Child::try_wait
の非ブロッキングバージョン。 -
HashMap::retain
およびHashSet::retain
addretain
、これらの2つのストアのVec<T>
APIからretain
します。 -
PeekMut::pop
使用すると、2度目にヒープを配置しなくても、既に読み取った後にBinaryHeap<T>
から最上位の要素を引き出すことができます。 -
TcpStream::peek
、UdpSocket::peek
、UdpSocket::peek_from
、ストリームまたはソケットを表示できます。
貨物の特徴
Cargo は 、Rustで記述されたPijul VCSのサポートを追加しました。
cargo new my-awesome-project --vcs=pijul
はオンにします!
--all
フラグに加えて、Cargoにはいくつかの新しいフラグが追加されました。たとえば、-- --examples
、-- --benches
、-- --benches
、および--benches
で、特定のタイプのすべてのプログラムを収集できます。
最後に、CargoはHaikuとAndroidをサポートするようになりました!
1.18.0への貢献
多くの人々がRust 1.18の作成に参加しました。 皆さんの助けなしにはこれを達成できませんでした。 よろしくお願いします!
翻訳者から
翻訳に協力してくれたGordon-Fとozkriffに感謝します。