あずんひの日

あずんひの色々を書き留めるブログ

ゆくRustくるRust 2022

そろそろ2021年も終わりを迎え、2022年の足音が近づいて参りました。 と言うわけで2021年のRustを振り返りつつ、 2022年のRustがどうなるのかを見ていきましょう。

2021年のRust

2021年におけるRustのトピックを3つ選んでみました。

Rust財団の発足

Rustの商標やインフラ資産などは元々Mozillaが所有している物でしたが、 2021年2月に発足したRust財団がその全てを継承しました。

Mozillaの先行きが不安視される中、AWSGoogleHuaweiMicrosoftMozillaと名だたる企業がメンバー企業となって設立されたRust財団により、完全に独立した組織として安定的な運営が出来るようになりました。 もちろん言語そのものの開発はGitHubやZulipなどのオープンなプラットフォーム上で行われており、メンバー企業による言語の独占はありません。

Rust財団設立による新たな動きはありませんでしたが、 親組織の経営状況から解放されたと言う意味では 動きが無かったことそれ自体がひとつの成果と言えるでしょう。

定数ジェネリクスの導入

Rust 1.51で定数ジェネリクスが導入され、ジェネリクスにおいて型だけでなく値を取ることが出来るようになりました。 nalgebrandarrayといった多次元配列ライブラリでは静的配列の要素数に直接数値を指定出来るようになるなど、非常に柔軟なプログラミングが可能となりました。

今のところ定数値として許可されているのは一部の型のみであるなど制限が多い機能ではありますが、Rust 1.59(2022/2/25リリース)ではデフォルト値が指定出来るようになるなど制限の緩和に向けて実装が進んでいます。進捗はrust-lang/rust#44580を参照してください。

Rust 2021エディションがリリース

Rust 1.56ではRust 2021エディションがリリースされ、2015/2018エディションとは非互換の機能が使えるようになりました。 非常に多くの変更があった2018エディションと比べて2021エディションは小規模な変更に留まるものの、地味にフラストレーションの溜まる部分が改善されています。

2021年の深掘りを振り返り

2021年の「早めに深掘り」シリーズも記事イラストの元ネタを交えて振り返りましょう。

Rust 1.49は1/1リリースと言うことで初夢に見ると縁起が良いとされる「一富士二鷹三茄子」が元ネタです。あまり執筆に時間が取れなかったのですが太陽をくりぬいてRustロゴを貼り付けるくらいしか出来なかったのは流石にサボりすぎ・・・。

Rust 1.50はダーウィンの日である2/12リリースということで、ダーウィンに関連したイラストやテキストを採用しました。 イラストは全てガラパゴス諸島に生息する生物で、それぞれバットフィッシュガラパゴスペンギンゾウガメです。 テキストはダーウィンの名言「A man who dares to waste an hour of time has not discovered the value of life.(1時間の浪費をなんとも思わない人は人生の価値を未だ見出していない)」を和訳しつつRustでのライフタイムの存在意義と掛けて「1ワードの浪費をなんとも思わない言語はライフタイムの価値を未だ見出していない」としました。

Rust 1.51は普通選挙法成立の日である3/26リリースということで選挙っぽいイラストです。投票箱にはStack Overflowのロゴがありますが、これはRustが人気言語ナンバーワンであることと掛けています。

Rust 1.52はソニーの設立日である5/7リリースということで、ソニーの顔であるオーディオ製品からヘッドホンとウォークマンを採用しました。また真ん中はPlayStation VRをイメージしています。 テキストの「It's a Rust」はCMのキャッチフレーズである「It's a Sony」と掛けています。

Rust 1.53は京大の前身・京都帝国大学創立の日である6/18リリースと言うことで、京大の代名詞でもある(?)折田先生像を元ネタにRustっぽい文言に置き換えました。RustのマスコットキャラFerrisが使いやすいことに気付いた記事でもあります。

Rust 1.54リリースの7/30は色々と悩ませられましたが、映画「モスラ」公開の日ということでモスラ羽化のシーンをいらすとやで再現しました。 モスラは蛾なので最初蛾のいらすとを採用しようと思ったんですが、いらすとやでも蛾はキモかった・・・。結果モスマンお茶を濁す結果に。 テキストは1961年の雰囲気を醸し出したくカタカナでRustを表記しつつ、当時流行っていたらしい「総天然色」(フルカラー?全編色付き映像?の意味)の文言としました。

Rust 1.55は黒澤映画「羅生門」がヴェネチア国際映画祭で日本初の金獅子賞を受賞した日である9/10リリースということで羅生門のシーンをいらすとやで再現しつつRustっぽい要素をちりばめたイラストです。 同じ映画ネタでもある1.54のリベンジでもありましたが、納得のいく出来になり良かったです。

Rust 1.56はアニメの日である10/22リリースということでポケモンショック以降入ることになった「テレビを見るときは部屋を明るくしてテレビから離れてみて下さい」の文言をもじりました。Ferrisが上手いことアニメっぽさを感じさせてくれます。テレビ左上は時刻表示、右上は局ロゴのイメージです。

Rust 1.57は初代PlayStationの発売日である12/3リリースということで背景は「駅」、下方にはポリゴン風味の格ゲーキャラを配置しました。また駅名標にはプレステのトレードマークである「△○×□」の前半をFerrisとRustロゴを使って記載しています。 テキストは当時のCMのキャッチフレーズである「全てのゲームは、ここに集まる。」をもじっています。

2022年のRust

くるRust、と言うことで2022年のRustに入りそうな変更をちょっとだけ覗いてみましょう。入ることが確約されているわけでは無いことにご留意ください。

GAT(Generic Associated Types)

関連型(Associated Types)でジェネリクスを使えるようにしようという変更です。今のIteratorの定義では参照を返すことが出来ませんが、これが以下のように出来るようになります(動作しないコードです)。

trait StreamingIterator {
    type Item<'a>;
    fn next<'a>(&'a self) -> Option<Self::Item<'a>>;
}

進捗はrust-lang/rust#44265を参照してください。

実装は概ね終わっているようですが、where節をどこに付けるかで揉めているようです。

またこれによってトレイトでも非同期関数が定義出来るようになる予定です。

Read::read_buf

Read::readと概ね一緒ですが、未初期化のバッファを使って読み込むことが出来る機能で、高速化が期待出来ます。

時々Vec::with_capacityMaybeUninitなどをRead::readに渡して未初期化バッファに読み込むコードを見掛けますが、実はこの結果は未定義なので本来は書くべきではありません。 標準ライブラリ内にも(未定義であることを明記しつつ)ちゃっかり使ってる部分がありますが、その後Read::read_bufの実装が進んだ事によって安全なコードに書き換えられました

進捗はrust-lang/rust#78485を参照してください。 APIとしてはまだまだ未成熟であるようです。

tryブロック

?演算子を使ってエラーを捉えるためのtryブロックの導入です。 これによりエラー処理が楽になります。

let result: anyhow::Result<u32> = try {
    std::fs::read_to_string("hoge.txt")?.parse::<u32>()? * 2
};

進捗はrust-lang/rust#31436を参照してください。 今のところ型推論が曖昧で、型の明示が必要になってしまう問題があります。

!型

値が入らないことを表す型で、より強力な最適化が可能になります。 例えばResult<u32, !>な変数xには常にOkの値しか入らないためx.unwrap()は常に成功します。結果として分岐及びパニックを発生させるコードが生成されません。

これまでに2回安定化が決定されたことがありますが、2回とも互換性を破壊してしまうということで撤回されている過去があります。 解決の目処が立っているかは良く分からないですが、早く解決してくれー!という願望を込めて2022年のRustに入れてみました。

進捗はrust-lang/rust#35121を参照してください。

さいごに

  終
制作・著作
━━━━━
 @aznhe21