この記事は、Rustの正式リリースから1年を記念して、Rust 公式ブログに2016年5月16日に投稿された、「One year of Rust1」を日本語に翻訳したものです2。
Rust における1年間 (One year of Rust)
2016年5月16日
Aaron Turon
Rust とは、あなたに、こんな力を与えてくれる言語です:
Rust は、高い安定性と高速性を備えたソフトウェアを書くための言語であり、なによりも、楽しみながら使えるものなのです。
そして、5月15日、Rust は1歳になりました。
数字で見る Rust
この365日間に、様々なことがありました:
- コアライブラリには、702人のコントリビューターから、11,894回のコミット6 がありました。
- 88個の RFC7 がマージされました。
- 18 種類のコンパイラ・ターゲットが導入されました
- 9回のリリースがありました
- 1年間に渡る安定性をお届けできました8
この1年の間、Rust コミュニティの 平均的な1週間 では、2つの RFC がマージされ、53個のクレート9 が新たに公開されました。パッケージのセントラルマネージャに、新しい Rust ライブラリが1つも追加されなかった日は、1日もありませんでした。また Rust は、今年の StackOverflow アンケートの「最も愛されている言語10」で、トップに選ばれました。
数字についてですが、いま、私たち自身によるアンケート11 を実施中です。あなたが Rust ユーザーの古株か、あるいは、全くの未経験者であるかに関係なく、ぜひご意見をお聞かせください。(訳注:アンケートの全質問の日本語訳を こちら に掲載しています。締め切りは6月8日です)
あるエリアの数字だけは、私たちの望んでいるような結果になっていません。それは、コミュニティの多様性です。これまでも、各地へのアウトリーチ活動をしてきましたが、Rust コミュニティチームでは、近いうちに、Bridge12 モデル(例:RailsBridge)を参考にした、グローバルな規模で連動した活動を開始する予定です。もし、この活動に参加したい、あるいは、アウトリーチについてもっと良いアイデアがあるのでしたら、ぜひ コミュニティ・チームまで お知らせください。
本番システムにおける Rust
この1年で、さらに多くの企業が Rust に賭ける13 のを見てきました。1つ1つに物語がありますが、その中の2つが、特に印象に残りました。
1つ目は Dropbox です。この企業は、過去数年に渡り、AWS から自社インフラへの移行14を、秘密裏に進めてきました。この移行(現在は完了してます)には、特注のハードウェアや、それを動作させるためのソフトウェアの開発も含まれていました。Dropbox のバックエンド・インフラの大半は、歴史的に Go で書かれています(訳注:別の意見もあります。脚注 15 を参照してください)。しかし、一部の重要なコンポーネントで、メモリ・フットプリントや、詳細な制御を欠いていることによる問題が起こり、目標としていたサーバーリソース利用率の達成を拒んでいました。そこで彼らは、それらのコンポーネントを Rust で書き直したのです。プロジェクトのリードエンジニアである Jamie Turner氏はこう語っています。「Rust には有利な点が数多くあります。高度な抽象化の仕組みを持ち、null、segfault、メモリリークが存在せず、その上、C のような性能やメモリの制御を実現できるのです」
2つ目は Mozilla です。彼らは長い間 Rust を使って、Servo16 という研究用のブラウザーエンジンを開発してきました。しかし、最初の本番向け Rust コードは、別の製品を経て出荷されました。Firefox です。Firefox 45では、mp4 メタデータのパースを行う Rust コードが、華やかな宣伝なしに、OS X と64ビット Linux ユーザー向けに配布されました。また、バージョン48で Windows にも対応する予定です。このコードは、現時点ではテストモードで実行中ですが、その処理結果をレガシーな C++ ライブラリの結果と比較しています。報告のあった実行結果 10億回17 の全てが、100%正しかったのです。しかし、このコードは、まだ氷山の一角です。Rust 統合を見据えた大規模な基礎改修工事を終え18、Firefox は相当な量の Rust コードを受け入れる準備ができています。これには Servo 由来のコンポーネントも含まれ、テストモードだけに留まりません。
私たちの元へは、Rust を実戦に投入している他の企業からも、よく似たお話19 が聞こえてきます。それは、Rust が、チームが本来持っている以上の力を発揮するのに役立ったというものです。Rust は、伝統的なシステム言語のような長所を持ちながら、同時に、より扱いやすく、安全で、多くにおいて、より高い生産性をもたらすものなのです。
これは、本番環境における Rust 事例のほんの一部です。そして、あなたの物語 も、ぜひ聞かせてください!
進化し続ける Rust
もちろん、Rust は一箇所に立ち止まってはいません。1年目のフォーカスは、エコシステムとツール類を育て、磨きをかけていくことでした:
- エコシステム:標準ライブラリは着実に拡張されてきました。成長に特に力を注いだ API は、ファイルシステムのアクセス20、ネットワーキング21、時刻22、コレクション23 です。また、ドキュメントのカバレージも劇的に改善されました。C ライブラリのサポートも充実しており、libc24、winapi25、gcc26 クレートを経由して使えます。また、新しいライブラリとして、低レベルの非同期 IO27、簡単に使える並列プログラミング28、ロックフリー・データ構造29、Rails に似た OR マッピング5、正規表現30 があります。そして、いくつかのパーシング・ライブラリ31 32 もあり、これには、html5ever33 という、Rust のマクロシステムにより、コードを限りなくスペックに近づけた、独創的な HTML5 パーサーも含まれます。もちろんこれらは、全体のごく一部に過ぎません。今後1年、エコシステムの成長、キュレーション34、全体の調和や一貫性35 を維持し、特に非同期 IO とウェブスタックに注力していく予定です。
- プラットフォームとターゲット:Rust のメモリ・フットプリントは、C と比べても見劣りしません。これにより、あらゆる場所での利用に理想的なものとなっています。この1年間、Rust は、Windows のネイティブな MSVC ツールチェインとも直接動作するようになりました36。また、その他のターゲットとして、musl37(様々な Linux 上で依存ライブラリのないバイナリが生成できます)、Android や ARM デバイス、その他、多数のプラットフォームが加わりました38。新しい rustup ツール39 を使うと、これらの多数のターゲットの管理やコンパイルが、いともたやすく実現できます。Rust 1.640 の時点で、フル装備の標準ライブラリではなく、OS サービスを必要としないコアライブラリだけに限定して Rust を使うことが可能になりました(これにより、Rust は OS を書くのに適した言語になりました41 42) 最後に、Rust コードを node.js43、Ruby44、Go45 といった、別のコンテキストに埋め込むためのライブラリも増加しました。
- ツール:Rust の実行ファイルは C とそっくりですので、ほとんどの既存のツールが使えます:特になにも手を加えずに使えるのは、lldb46、gdb47、perf48、valgrind49、callgrind50 などなど、たくさんあります。ここしばらく注力しているのは、Rust 特有のフック51 やワークフロー52 を追加することで、これらのツールの使い勝手53 を向上させることです。もう1つ優先的に対応しているのは、IDE のフルサポートです。これには、デーモン化されたコンパイラサービスを提供することも含まれおり、この1年で大きく進歩しました54。また、Racer55 プロジェクトの功績により、すでにたくさんの IDE プラグイン56 において、Rust のセマンティクスに対する何らかのサポートが提供されています。また同時に、コード整形ツールの rustfmt57 が、Rust コミュニティが公式なコードスタイル58 を作成するのに十分なレベルにまで成熟しました。そして、Rust のワークフローにおいて熱く鼓動する心臓部 Cargo59 に至っては、この1年で多くの機能が追加されました。特筆すべきは install サブコマンド60 でしょう。
- コンパイラ:これまでに何度か、コンパイル時間に関わる全面的な改善61 がありました。そしていま、並列化されたコード生成62 によって、さらなるスピードアップが見込まれています。しかし、最大の成功は、現在進行中の、インクリメンタルなコンパイル63 によって、もたらされるでしょう。これは、コードの修正後に必要となる作業量を最小化します。これに不可欠なステップは、専用の内部表現64 への移行で、これ自身にも、多くの利点があります。もう1つのフォーカスはコンパイルエラーに関するもので、これには、大半のエラーについての65 詳細な説明や、現在進行中の、複数のエラーに対する一覧性と視認性の向上66 などがあります。この2点については、近々、新たなニュースがあるでしょう。
- コア言語:この1年間、私たちがあえて短く保ったリストがあります。それは、コア言語の拡張に関するものです。今後の作業予定には、いくつかの重要な機能が控えています(例えば、エラーハンドリングの改善67、より柔軟性の高い借用規則68、特殊化(specialization)69 など) しかし、Rust のユーザー70 は、現在のコア言語に概ね満足しており、コミュニティがエコシステムやツール類に注力することを望んでいます。
Rust の世界でこれまで起こったことや、これから起こることについて、まだまだ言い足りません。これから何ヶ月かに渡って、ブログを通してお話していきます。
コミュニティにおける Rust
どうやら多くの人が、みんなで集まって、Rust について語りたいと思っているようです。昨年8月の RustCamp71 は満席となり、2016年もいくつかのイベントが控えています:
- 2016年9月9日から10日:オレゴン州ポートランドにて、初の RustConf72
- 2016年9月17日:ドイツ、ベルリンにて、RustFest というヨーロッパのコミュニティ・カンファレンス
- 2016年10月27日から28日:ペンシルバニア州ピッツバーグにて、Rust Belt Rust73 という Rust カンファレンス
- 世界中に71の Rust 関連ミートアップ・グループ74
そして、思った通りでした。私的な観点から述べますと、Rust のために働く上での最大の喜びは、そのコミュニティです75。グループの一員となって働くのがどういうことかを説明するのは非常に難しいのですが、2点伝えたいことがあります。1つ目は純然たるエナジーです:どの1週間をとっても様々なことが起こっており、This Week in Rust76 は、これらの出来事に追従したい全ての人にとって不可欠な情報ソースとなっています。2つ目は、参加を歓迎する精神でしょう:Rust の核となるメッセージは、エンパワーメント77のひとつ「安全で、ローレベルなシステムコードを、恐れることなく3 書くこと」であり、これがコミュニティにも受け継がれています。私たちはみなここで、お互いを助け合うことを通して、より良いプログラマーになるための方法を学んでいるのです。
Rust を始めるのに、これ以上いい時期なんてありません。地元のミートアップ74、ユーザーフォーラムへの初投稿78、トーク79 を観たり、本80 を読んだり。どこから入っても、最高の結果をもたらすでしょう。
Rust へ、誕生日おめでとう!
-
元記事:One year of Rust, The Rust Programming Language Blog - May 16, 2016, By Aaron Turon ↩
-
リンク:WIRED.com -- The Epic Story of Dropbox's Exodus from The Amazon Cloud Empire ↩
-
訳注:この表現「歴史的に Go で書かれています」は誤解を招きそうです。Hacker News での コメント によると、Dropbox のバックエンドの大半は Python で書かれており、この3年くらいで、少しずつ Go(現在のデフォルト言語)に移行しているようです。Rust が使われているのは、ごく一部のコア・コンポーネントで、CPU キャッシュの効率が重要な、Rust のメモリ管理モデルが活かされる場面のようです。 ↩
-
リンク:10億回の実行結果レポート ↩
-
リンク:Mozilla Wiki -- Oxidation(酸化)、Rustって「錆」の意味なので ↩
-
リンク:RustCamp 2015 のトークより、ユーザー事例 "Using Rust from C... or Any Language" ↩
-
リンク:std::collections ↩
-
リンク:非同期 IO ライブラリ "MIO - Metal IO" ↩
-
リンク:並列プログラミングライブラリ "Rayon: Data Parallelism in Rust" ↩
-
リンク:ロックフリー Lock-freedom without garbage collection ↩
-
訳注:キュレーション(curation) とは、人力で情報を収集、整理、要約、共有すること ↩
-
訳注:原文は coherence。翻訳にあたって意味が取れなかったので質問したところ、コミュニティメンバーの1人から次のような 説明を受けました。「全体がうまく組み合わさって動作すること。断片化したり、分断したりしないこと。基本的に避けたいのは、ライブラリが、相互運用不可な複数のクラスタに分かれてしまうこと(例:Python 2 と 3)」 ↩
-
リンク:MSVC ツールチェインサポート ↩
-
リンク:rustup ツール ↩
-
リンク:Rust 1.6 のリリースアナウンス ↩
-
リンク:Rust and IDEs ↩
-
リンク:Racer project ↩
-
リンク:Across-the-board improvements: Rust 1.1 のリリースアナウンス ↩
-
リンク:Parallelized code generation: Rust 1.2 のリリースアナウンス ↩
-
リンク:Error Index(エラーの索引) ↩
-
リンク:New error format ↩
-
リンク:Rust Belt Rust ↩
-
リンク:Rust関連のミートアップ ↩ ↩2
-
リンク:Rustコミュニティ ↩
-
エンパワーメント(empowerment):能力強化 ↩
-
リンク:ユーザーフォーラム(英語) ↩
-
リンク:カンファレンスでのトーク(英語) Rustのスレッド安全性 ↩