Rust 1.18リリース

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ます。 現在、 consolewindowsのみ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でSuboptimalOptimalサイズを確認すると、両方ともサイズが4バイトであることがわかります。


この変更は長い間計画されています。 Rustの以前のバージョンではこの最適化がナイトリービルドに含まれていましたが、一部の人々は正確なメモリデータを必要とする安全でないコードを記述しました。 この変更をロールバックし、知っていたすべてのそのようなケースを修正しました。 ただし、正しく機能しないコードを見つけた場合は、修正できるようお知らせください


rustdocをMarkdown互換のCommonMarkパーサーに移行する予定でした。 ただし、CommonMarkの仕様は現在のパーサーであるHoedownとは異なるため、単純な移行では問題が発生する可能性があります。 移行計画の一環として、 rustdoc rustdoc --enable-commonmark rustdoc 。 このフラグには、古いパーサーの代わりに新しいパーサーの使用が含まれます。 やってみてください! 私たちが知る限り、両方のパーサーは同じ結果を生成しますが、結果が異なるシナリオを見つけたかどうかを知りたいです!


最後に、 rustc自体のコンパイルrustc 15%-20%高速になりました 。 このPRのコミットメッセージにはいくつかの詳細が含まれています。 多くの非効率的な場所がありましたが、現在はすべて修正されています。


詳細については 、詳細なリリースノートを参照してください。


標準ライブラリの安定化


このリリースでは、7つの新しいAPIが安定化されました。



詳細については 、詳細なリリースノートを参照してください。


貨物の特徴


Cargo 、Rustで記述されたPijul VCSのサポートを追加しました。
cargo new my-awesome-project --vcs=pijulはオンにします!


--allフラグに加えて、Cargoにはいくつかの新しいフラグが追加されました。たとえば、-- --examples 、-- --benches 、-- --benches 、および--benchesで、特定のタイプのすべてのプログラムを収集できます。


最後に、CargoはHaikuAndroidをサポートするようになりました!


詳細については 、詳細なリリースノートを参照してください。


1.18.0への貢献


多くの人々がRust 1.18の作成に参加しました。 皆さんの助けなしにはこれを達成できませんでした。 よろしくお願いします!


翻訳者から
翻訳に協力してくれたGordon-Fとozkriffに感謝します。



Source: https://habr.com/ru/post/J330778/


All Articles