[翻訳] Rustの正式リリースから１年を振り返って（米Rust公式ブログより、DropboxやFirefoxの事例、開発状況やコミュニティの動向など）

この記事は、Rustの正式リリースから１年を記念して、Rust 公式ブログに2016年5月16日に投稿された、「One year of Rust[^1]」を日本語に翻訳したものです[^80]。

[^1]: 元記事：[One year of Rust, The Rust Programming Language Blog - May 16, 2016, By Aaron Turon](http://blog.rust-lang.org/2016/05/16/rust-at-one-year.html)
[^80]: 連絡がとれたのが公開後になってしまいましたが、著者の Aaron Turon氏の [了承を得ています](https://users.rust-lang.org/t/simple-questions-about-one-year-of-rust-japanese-translation/5999/1)


## Rust における１年間 (One year of Rust)

2016年5月16日
Aaron Turon

Rust とは、あなたに、こんな力を与えてくれる言語です：

- 妥協のないパフォーマンスとコントロール
- 古典的な並列プログラミングの落とし穴[^2] を含む、あらゆる種類のバグの回避
- Python[^3] や Ruby[^4] といった言語に匹敵する使いやすさ

[^2]: リンク：[Fearless Concurrency（恐れ知らずの並列プログラミング）](http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html)
[^3]: リンク：[[翻訳] Python プログラマーのための Rust 入門](http://qiita.com/t2y/items/434854fab16159a7c0f7)
[^4]: リンク：[Diesel、Rustのための安全で、拡張可能なORMおよびクエリビルダー](http://diesel.rs/)

Rust は、高い安定性と高速性を備えたソフトウェアを書くための言語であり、なによりも、楽しみながら使えるものなのです。

そして、5月15日、Rust は１歳になりました。


## 数字で見る Rust

この365日間に、様々なことがありました：

- コアライブラリには、702人のコントリビューターから、11,894回のコミット[^5] がありました。
- 88個の RFC[^6] がマージされました。
- 18 種類のコンパイラ・ターゲットが導入されました
- 9回のリリースがありました
- 1年間に渡る安定性をお届けできました[^7]

[^5]: リンク：[rust-lang/rustのコミットログ](https://github.com/rust-lang/rust/commits/master)
[^6]: リンク：[RustのRFC](https://github.com/rust-lang/rfcs)
[^7]: リンク：[Stability as a Deliverable](http://blog.rust-lang.org/2014/10/30/Stability.html)


この１年の間、Rust コミュニティの **平均的な１週間** では、２つの RFC がマージされ、53個のクレート[^8] が新たに公開されました。パッケージのセントラルマネージャに、新しい Rust ライブラリが１つも追加されなかった日は、１日もありませんでした。また Rust は、今年の StackOverflow アンケートの「最も愛されている言語[^9]」で、トップに選ばれました。

[^8]: リンク：[Crates.io](https://crates.io/)
[^9]: リンク：[StackOverflow アンケート、2016年、最も愛されている言語](https://stackoverflow.com/research/developer-survey-2016)


数字についてですが、いま、私たち自身によるアンケート[^10] を実施中です。あなたが Rust ユーザーの古株か、あるいは、全くの未経験者であるかに関係なく、ぜひご意見をお聞かせください。（訳注：アンケートの全質問の日本語訳を [こちら](http://qiita.com/tatsuya6502/items/0125868a6b303728b151) に掲載しています。締め切りは６月８日です）

[^10]: リンク：[Launching the 2016 State of Rust Survey](http://blog.rust-lang.org/2016/05/09/survey.html)

あるエリアの数字だけは、私たちの望んでいるような結果になっていません。それは、コミュニティの多様性です。これまでも、各地へのアウトリーチ活動をしてきましたが、Rust コミュニティチームでは、近いうちに、Bridge[^11] モデル（例：RailsBridge）を参考にした、グローバルな規模で連動した活動を開始する予定です。もし、この活動に参加したい、あるいは、アウトリーチについてもっと良いアイデアがあるのでしたら、ぜひ [コミュニティ・チームまで](mailto:community-team@rust-lang.org) お知らせください。

[^11]: リンク：[Bridge](http://bridgefoundry.org/)


## 本番システムにおける Rust

この１年で、さらに多くの企業が Rust に賭ける[^12] のを見てきました。１つ１つに物語がありますが、その中の２つが、特に印象に残りました。

[^12]: リンク：[Friends of Rust（Rustを本番環境で実行している組織）](https://www.rust-lang.org/friends.html)

１つ目は Dropbox です。この企業は、過去数年に渡り、AWS から自社インフラへの移行[^13]を、秘密裏に進めてきました。この移行（現在は完了してます）には、特注のハードウェアや、それを動作させるためのソフトウェアの開発も含まれていました。Dropbox のバックエンド・インフラの大半は、歴史的に Go で書かれています（訳注：別の意見もあります。脚注 [^79] を参照してください）。しかし、一部の重要なコンポーネントで、メモリ・フットプリントや、詳細な制御を欠いていることによる問題が起こり、目標としていたサーバーリソース利用率の達成を拒んでいました。そこで彼らは、それらのコンポーネントを Rust で書き直したのです。プロジェクトのリードエンジニアである Jamie Turner氏はこう語っています。「Rust には有利な点が数多くあります。高度な抽象化の仕組みを持ち、null、segfault、メモリリークが存在せず、その上、C のような性能やメモリの制御を実現できるのです」

[^79]: 訳注：この表現「歴史的に Go で書かれています」は誤解を招きそうです。Hacker News での [コメント](https://news.ycombinator.com/item?id=11709282) によると、Dropbox のバックエンドの大半は Python で書かれており、この３年くらいで、少しずつ Go（現在のデフォルト言語）に移行しているようです。Rust が使われているのは、ごく一部のコア・コンポーネントで、CPU キャッシュの効率が重要な、Rust のメモリ管理モデルが活かされる場面のようです。

[^13]: リンク：[WIRED.com -- The Epic Story of Dropbox's Exodus from The Amazon Cloud Empire](http://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/)
[^14]: リンク：[Hacker News での Jamie Turner 氏の発言](https://news.ycombinator.com/item?id=11283688)

２つ目は Mozilla です。彼らは長い間 Rust を使って、Servo[^15] という研究用のブラウザーエンジンを開発してきました。しかし、最初の本番向け Rust コードは、別の製品を経て出荷されました。Firefox です。Firefox 45では、mp4 メタデータのパースを行う Rust コードが、華やかな宣伝なしに、OS X と64ビット Linux ユーザー向けに配布されました。また、バージョン48で Windows にも対応する予定です。このコードは、現時点ではテストモードで実行中ですが、その処理結果をレガシーな C++ ライブラリの結果と比較しています。報告のあった実行結果 **10億回**[^17] の全てが、100%正しかったのです。しかし、このコードは、まだ氷山の一角です。Rust 統合を見据えた大規模な基礎改修工事を終え[^18]、Firefox は相当な量の Rust コードを受け入れる準備ができています。これには Servo 由来のコンポーネントも含まれ、テストモードだけに留まりません。

[^15]: リンク：[Servo, the Parallel Browser Engine Project](https://github.com/servo/servo/)
[^16]: リンク：[Parser for ISO Base Media Format aka video/mp4 written in Rust](https://github.com/mozilla/mp4parse-rust)
[^17]: リンク：[10億回の実行結果レポート](https://telemetry.mozilla.org/new-pipeline/dist.html#!cumulative=0&end_date=2016-04-07&keys=__none__!__none__!__none__&max_channel_version=release%252F45&measure=MEDIA_RUST_MP4PARSE_SUCCESS&min_channel_version=null&product=Firefox&sanitize=1&sort_keys=submissions&start_date=2016-03-03&table=0&trim=1&use_submission_date=0)
[^18]: リンク：[Mozilla Wiki -- Oxidation（酸化）](http://wiki.mozilla.org/Oxidation)、Rustって「錆」の意味なので

私たちの元へは、Rust を実戦に投入している他の企業からも、よく似たお話[^19] が聞こえてきます。それは、Rust が、チームが本来持っている以上の力を発揮するのに役立ったというものです。Rust は、伝統的なシステム言語のような長所を持ちながら、同時に、より扱いやすく、安全で、多くにおいて、より高い生産性をもたらすものなのです。

[^19]: リンク：RustCamp 2015 のトークより、ユーザー事例 ["Using Rust from C... or Any Language"](http://confreaks.tv/videos/rustcamp2015-using-rust-from-c-or-any-language)

これは、本番環境における Rust 事例のほんの一部です。そして、[あなたの物語](https://github.com/rust-lang/rust-www/issues/new?title=New+Website+Logo%3A+%5Binsert+name%5D%0A&body=To+list+your+organization%27s+logo+on+the+Rust+website%2C+fill+out+the+following+information+and+click+%22submit+new+issue%22.+Alternately%2C+you+may+edit+_data%2Fusers.yml+as+described+therein+and+submit+a+pull+request.%0D%0A%0D%0A-+Organization+name%3A+%28as+you+want+it+displayed%29%0D%0A-+Homepage+url%3A+%28homepage%2Fprimary+entry+point+for+users%29%0D%0A-+Logo+url%3A+%28svg+if+possible%2C+pngs+over+400x200px+with+transparent+backgrounds+are+also+acceptable%29%0D%0A-+How+you+are+using+Rust%3A+%28one+sentence+describing+your+use+of+Rust%29%0D%0A-+Url+describing+Rust+usage%3A+%28optional+link+to+e.g.+blog+post+explaining+how+you+use+Rust%29%0D%0A-+Organization+contact%3A+%28name+and+email.+we+may+contact+you+when+updating+this+page.+alternately+you+may+email+this+information+to+user-logos%40rust-lang.org+and+it+will+be+kept+secret%29.%0D%0A) も、ぜひ聞かせてください！


## 進化し続ける Rust

もちろん、Rust は一箇所に立ち止まってはいません。１年目のフォーカスは、エコシステムとツール類を育て、磨きをかけていくことでした：

- **エコシステム**：標準ライブラリは着実に拡張されてきました。成長に特に力を注いだ API は、ファイルシステムのアクセス[^20]、ネットワーキング[^21]、時刻[^22]、コレクション[^23] です。また、ドキュメントのカバレージも劇的に改善されました。C ライブラリのサポートも充実しており、libc[^24]、winapi[^25]、gcc[^26] クレートを経由して使えます。また、新しいライブラリとして、低レベルの非同期 IO[^27]、簡単に使える並列プログラミング[^28]、ロックフリー・データ構造[^29]、Rails に似た OR マッピング[^4]、正規表現[^31] があります。そして、いくつかのパーシング・ライブラリ[^32] [^33] もあり、これには、html5ever[^34] という、Rust のマクロシステムにより、コードを限りなくスペックに近づけた、独創的な HTML5 パーサーも含まれます。もちろんこれらは、全体のごく一部に過ぎません。今後１年、エコシステムの成長、キュレーション[^81]、全体の調和や一貫性[^82] を維持し、特に非同期 IO とウェブスタックに注力していく予定です。

[^20]: リンク：[std::fs](http://static.rust-lang.org/doc/master/std/fs/index.html)
[^21]: リンク：[std::net](http://static.rust-lang.org/doc/master/std/net/index.html)
[^22]: リンク：[std::time](http://static.rust-lang.org/doc/master/std/time/index.html)
[^23]: リンク：[std::collections](http://static.rust-lang.org/doc/master/std/collections/index.html)

[^24]: リンク：[libc](https://github.com/rust-lang/libc)
[^25]: リンク：[winapi-rs](https://github.com/retep998/winapi-rs)
[^26]: リンク：[gcc-rs](https://github.com/alexcrichton/gcc-rs)

[^27]: リンク：非同期 IO ライブラリ ["MIO - Metal IO"](https://github.com/carllerche/mio/)
[^28]: リンク：並列プログラミングライブラリ ["Rayon: Data Parallelism in Rust"](http://smallcultfollowing.com/babysteps/blog/2015/12/18/rayon-data-parallelism-in-rust/)
[^29]: リンク：ロックフリー [Lock-freedom without garbage collection](http://aturon.github.io/blog/2015/08/27/epoch/)

[^31]: リンク：[regex](https://github.com/rust-lang-nursery/regex)

[^32]: リンク：[nom](https://github.com/Geal/nom)
[^33]: リンク：[LALRPOP](http://smallcultfollowing.com/babysteps/blog/2015/09/14/lalrpop/)
[^34]: リンク：[html5ever](https://kmcallister.github.io/talks/rust/2014-rust-macros/slides.html)

[^81]: 訳注：キュレーション(curation) とは、人力で情報を収集、整理、要約、共有すること
[^82]: 訳注：原文は coherence。翻訳にあたって意味が取れなかったので質問したところ、コミュニティメンバーの１人から次のような [説明を受けました](https://users.rust-lang.org/t/simple-questions-about-one-year-of-rust-japanese-translation/5999/2)。「全体がうまく組み合わさって動作すること。断片化したり、分断したりしないこと。基本的に避けたいのは、ライブラリが、相互運用不可な複数のクラスタに分かれてしまうこと（例：Python 2 と 3）」


- **プラットフォームとターゲット**：Rust のメモリ・フットプリントは、C と比べても見劣りしません。これにより、あらゆる場所での利用に理想的なものとなっています。この１年間、Rust は、Windows のネイティブな MSVC ツールチェインとも直接動作するようになりました[^35]。また、その他のターゲットとして、musl[^36]（様々な Linux 上で依存ライブラリのないバイナリが生成できます）、Android や ARM デバイス、その他、多数のプラットフォームが加わりました[^37]。新しい rustup ツール[^38] を使うと、これらの多数のターゲットの管理やコンパイルが、いともたやすく実現できます。Rust 1.6[^39] の時点で、フル装備の標準ライブラリではなく、OS サービスを必要としないコアライブラリだけに限定して Rust を使うことが可能になりました（これにより、Rust は OS を書くのに適した言語になりました[^40] [^41]） 最後に、Rust コードを node.js[^42]、Ruby[^43]、Go[^44] といった、別のコンテキストに埋め込むためのライブラリも増加しました。

[^35]: リンク：[MSVC ツールチェインサポート](https://github.com/rust-lang/rust/pull/25350)
[^36]: リンク：[musl libc](https://www.musl-libc.org/)
[^37]: リンク：[Platform Support（プラットフォームの対応状況）](https://forge.rust-lang.org/platform-support.html)

[^38]: リンク：[rustup ツール](http://blog.rust-lang.org/2016/05/13/rustup.html)
[^39]: リンク：[Rust 1.6 のリリースアナウンス](http://blog.rust-lang.org/2016/01/21/Rust-1.6.html)

[^40]: リンク：[Writing an OS in Rust](http://os.phil-opp.com/)
[^41]: リンク：[intermezzOS, (a little OS)](https://intermezzos.github.io/)

[^42]: リンク：[Neon: Node.js + Rust](http://calculist.org/blog/2015/12/23/neon-node-rust/)
[^43]: リンク：[Helix: Rust + Ruby, without the Glue](http://blog.skylight.io/introducing-helix/)
[^44]: リンク：[RURE-Go: Go bindings to RUst's REgex engine](https://github.com/BurntSushi/rure-go).


- **ツール**：Rust の実行ファイルは C とそっくりですので、ほとんどの既存のツールが使えます：特になにも手を加えずに使えるのは、lldb[^45]、gdb[^46]、perf[^47]、valgrind[^48]、callgrind[^49] などなど、たくさんあります。ここしばらく注力しているのは、Rust 特有のフック[^51] やワークフロー[^52] を追加することで、これらのツールの使い勝手[^50] を向上させることです。もう１つ優先的に対応しているのは、IDE のフルサポートです。これには、デーモン化されたコンパイラサービスを提供することも含まれおり、この１年で大きく進歩しました[^53]。また、Racer[^54] プロジェクトの功績により、すでにたくさんの IDE プラグイン[^55] において、Rust のセマンティクスに対する何らかのサポートが提供されています。また同時に、コード整形ツールの rustfmt[^56] が、Rust コミュニティが公式なコードスタイル[^57] を作成するのに十分なレベルにまで成熟しました。そして、Rust のワークフローにおいて熱く鼓動する心臓部 Cargo[^58] に至っては、この１年で多くの機能が追加されました。特筆すべきは install サブコマンド[^59] でしょう。


[^45]: リンク：[lldb](http://lldb.llvm.org/)
[^46]: リンク：[gdb](https://www.gnu.org/software/gdb/)
[^47]: リンク：[perf](https://perf.wiki.kernel.org/index.php/Main_Page)
[^48]: リンク：[valgrind](http://valgrind.org/)
[^49]: リンク：[callgrind](https://kcachegrind.github.io/html/Home.html)

[^50]: リンク：[rust-gdb. rust-lldb.](https://michaelwoerister.github.io/2015/03/27/rust-xxdb.html)
[^51]: リンク：[gdb -- add Rust language support](https://sourceware.org/ml/gdb-patches/2016-04/msg00570.html)
[^52]: リンク：[Introducing Cargo Profiler](http://www.suchin.co/2016/05/11/Introducing-Cargo-Profiler/)
[^53]: リンク：[Rust and IDEs](https://www.rust-lang.org/ides.html)
[^54]: リンク：[Racer project](https://github.com/phildawes/racer)
[^55]: リンク：[Are we (I)DE yet? IDE plugins](https://areweideyet.com/)
[^56]: リンク：[rustfmt](https://github.com/rust-lang-nursery/rustfmt)
[^57]: リンク：[RFC process for formatting style and Rustfmt defaults](https://github.com/rust-lang/rfcs/pull/1607)
[^58]: リンク：[Cargo](http://blog.rust-lang.org/2016/05/05/cargo-pillars.html)
[^59]: リンク：[cargo install -- Rust 1.5のリリースアナウンス](http://blog.rust-lang.org/2015/12/10/Rust-1.5.html)


- **コンパイラ**：これまでに何度か、コンパイル時間に関わる全面的な改善[^60] がありました。そしていま、並列化されたコード生成[^61] によって、さらなるスピードアップが見込まれています。しかし、最大の成功は、現在進行中の、インクリメンタルなコンパイル[^62] によって、もたらされるでしょう。これは、コードの修正後に必要となる作業量を最小化します。これに不可欠なステップは、専用の内部表現[^63] への移行で、これ自身にも、多くの利点があります。もう１つのフォーカスはコンパイルエラーに関するもので、これには、大半のエラーについての[^64] 詳細な説明や、現在進行中の、複数のエラーに対する一覧性と視認性の向上[^65] などがあります。この２点については、近々、新たなニュースがあるでしょう。


[^60]: リンク：Across-the-board improvements: [Rust 1.1 のリリースアナウンス](http://blog.rust-lang.org/2015/06/25/Rust-1.1.html)
[^61]: リンク：Parallelized code generation: [Rust 1.2 のリリースアナウンス](http://blog.rust-lang.org/2015/08/06/Rust-1.2.html)
[^62]: リンク：[Incremental compilation RFC](https://github.com/rust-lang/rfcs/pull/1298)
[^63]: リンク：[MIR](http://blog.rust-lang.org/2016/04/19/MIR.html)
[^64]: リンク：[Error Index（エラーの索引）](https://doc.rust-lang.org/error-index.html)
[^65]: リンク：[New error format](https://internals.rust-lang.org/t/new-error-format/3438)


- **コア言語**：この１年間、私たちがあえて短く保ったリストがあります。それは、コア言語の拡張に関するものです。今後の作業予定には、いくつかの重要な機能が控えています（例えば、エラーハンドリングの改善[^66]、より柔軟性の高い借用規則[^67]、特殊化(specialization)[^68] など）　しかし、Rust のユーザー[^69] は、現在のコア言語に概ね満足しており、コミュニティがエコシステムやツール類に注力することを望んでいます。

[^66]: リンク：[First-class error handling with `?` and `catch`](https://github.com/rust-lang/rfcs/pull/243)
[^67]: リンク：[Non-lexical Lifetimes](http://smallcultfollowing.com/babysteps/blog/2016/04/27/non-lexical-lifetimes-introduction/)
[^68]: リンク：[RFC: impl specialization](https://github.com/rust-lang/rfcs/pull/1210)
[^69]: リンク：[Production User Research Summary（本番ユーザーの調査まとめ）](https://internals.rust-lang.org/t/production-user-research-summary/2530)


Rust の世界でこれまで起こったことや、これから起こることについて、まだまだ言い足りません。これから何ヶ月かに渡って、ブログを通してお話していきます。


## コミュニティにおける Rust

どうやら多くの人が、みんなで集まって、Rust について語りたいと思っているようです。昨年８月の RustCamp[^70] は満席となり、2016年もいくつかのイベントが控えています：

- 2016年9月9日から10日：オレゴン州ポートランドにて、初の RustConf[^71]
- 2016年9月17日：ドイツ、ベルリンにて、RustFest というヨーロッパのコミュニティ・カンファレンス
- 2016年10月27日から28日：ペンシルバニア州ピッツバーグにて、Rust Belt Rust[^72] という Rust カンファレンス
- 世界中に71の Rust 関連ミートアップ・グループ[^73]

[^70]: リンク：[RustCamp](http://rustcamp.com/)
[^71]: リンク：[RustConf](http://rustconf.com/)
[^72]: リンク：[Rust Belt Rust](http://rust-belt-rust.com/)
[^73]: リンク：[Rust関連のミートアップ](http://rust.meetup.com/)

そして、思った通りでした。私的な観点から述べますと、Rust のために働く上での最大の喜びは、そのコミュニティです[^74]。グループの一員となって働くのがどういうことかを説明するのは非常に難しいのですが、２点伝えたいことがあります。１つ目は純然たるエナジーです：どの１週間をとっても様々なことが起こっており、This Week in Rust[^75] は、これらの出来事に追従したい全ての人にとって不可欠な情報ソースとなっています。２つ目は、参加を歓迎する精神でしょう：Rust の核となるメッセージは、エンパワーメント[^83]のひとつ「安全で、ローレベルなシステムコードを、恐れることなく[^2] 書くこと」であり、これがコミュニティにも受け継がれています。私たちはみなここで、お互いを助け合うことを通して、より良いプログラマーになるための方法を学んでいるのです。

[^74]: リンク：[Rustコミュニティ](https://www.rust-lang.org/community.html)
[^75]: リンク：[This Week in Rust（今週のRust）](https://this-week-in-rust.org/)
[^83]: エンパワーメント(empowerment)：能力強化

Rust を始めるのに、これ以上いい時期なんてありません。地元のミートアップ[^73]、ユーザーフォーラムへの初投稿[^76]、トーク[^77] を観たり、本[^78] を読んだり。どこから入っても、最高の結果をもたらすでしょう。

[^76]: リンク：[ユーザーフォーラム（英語）](https://users.rust-lang.org/)
[^77]: リンク：カンファレンスでのトーク（英語） [Rustのスレッド安全性](http://www.infoq.com/presentations/rust-thread-safety)
[^78]: リンク：[書籍一覧](https://doc.rust-lang.org/book/)

Rust へ、誕生日おめでとう！

* * *