diff --git a/src/editions/index.md b/src/editions/index.md index 77f4146..071afa3 100644 --- a/src/editions/index.md +++ b/src/editions/index.md @@ -4,118 +4,119 @@ # エディションとは? -Rust 1.0 のリリースでは、Rust のコア機能として[「よどみない安定性」](https://blog.rust-lang.org/2014/10/30/Stability.html)が提供されるようになりました。 -Rust は、1.0 のリリース以来、いちど安定版にリリースされた機能は、将来の全リリースに渡ってサポートし続ける、というルールの下で開発されてきました。 +2015年5月に Rust が[バージョン 1.0](https://blog.rust-lang.org/2015/05/15/Rust-1.0.html)を迎えるにあたり、 +[「よどみない安定性」](https://blog.rust-lang.org/2014/10/30/Stability.html)という根本理念が掲げられました。 +これにより、「安定版にリリースされた機能は、将来の全リリースに渡って開発者がサポートし続ける」というルールを厳守しながら、 +Rust は 1.0 から今まで開発され続けてきました。 -一方で、後方互換でないような小さい変更を言語に加えることも、ときには便利です。 -最もわかりやすいのは新しいキーワードの導入で、これは同名の変数を使えなくします。 -例えば、Rust の最初のバージョンには `async` や `await` といったキーワードはありませんでした。 -後のバージョンになってこれらを突然キーワードに変えてしまうと、例えば `let async = 1;` のようなコードが壊れてしまいます。 +一方で、後方互換性を破るような言語仕様変更をすべきときもあります。 +例えば、Rust の初期のバージョンには `asnyc` や `await` といったキーワードはありませんでした。 + +後のバージョンになってそれらが突然キーワードになってしまうと、例えば `let async = 1;` のようなコードが壊れてしまいます。 + + このような問題を解決するために、**エディション**という仕組みが使われています。 -後方互換性を失わせるような機能をリリースしたいとき、我々はこれを新しい*エディション*の一部として提供します。 -エディションはオプトイン、すなわち導入したい人だけが導入できるので、既存のクレートは明示的に新しいエディションに移行しない限りは変化を受けません。 -すなわち、2018 以降のエディションを選択しない限り、たとえ最新バージョンの Rust であっても `async` はキーワードとして*扱われません*。 -導入の可否は*クレートごとに*決めることができ、[`Cargo.toml` への記載内容](https://doc.rust-lang.org/cargo/reference/manifest.html#the-edition-field)により決定されます。 -`cargo new` コマンドで作成される新しいクレートは、常に最新の安定版のエディションでセットアップされます。 +後方互換性を破るような変更は、次回のエディションで導入されます。 +エディションはオプトイン、すなわち導入したい人だけが導入できるので、既存のクレートは明示的に新しいエディションに移行しない限りは影響を受けません。 +例えば、2018 以降のエディションを選択しない限り、たとえ最新バージョンの Rust であっても `async` はキーワードとして扱われません。 + + + +エディションは [`Cargo.toml` で指定](https://doc.rust-lang.org/cargo/reference/manifest.html#the-edition-field)することができ、クレートごとに独立です。 +Cargo で新しいクレートを作る場合は、自動的に最新の安定版のエディションが選ばれます。 + + + +## エディションはエコシステムを分断しない -### エディションはエコシステムを分断しない +エディションを導入するにあたって最重要なのは、 +あるエディションのクレートと別のエディションでコンパイルされたクレートがシームレスに相互運用できることです。 -エディションで最も重要な規則は、あるエディションのクレートと別のエディションでコンパイルされたクレートがシームレスに相互運用できるようになっているということです。 -これにより、新しいエディションへ移行するかどうかは、他のクレートに影響を与えない「自分だけの問題」だと言えるのです。 +すなわち、新しいエディションへ移行するかどうかは、クレートごとに決められます。 +移行の決断が、他のクレートに影響を与えない「自分だけの問題」となるのです。 -クレートの相互運用性を守るために、我々がエディションに加えられる変更にはある種の制限がかかります。 -一般に、エディションに加えられる変更は「表面上の」ものになりがちです。 -エディションに関わらず、すべての Rust のコードは最終的にはコンパイラの中で同じ内部表現に変換されるのです。 +Rust では、クレートの相互運用性を守るために、エディションへの機能追加はある程度制限されます。 +一般に、エディションが上がることによる変更は「表面上の」ものになりがちです。 +エディションにかかわらず、すべての Rust のコードは最終的にはコンパイラの中で同じ内部表現に変換されるのです。 -### エディションの移行は簡単で、ほとんど自動化されている +## エディションの移行は簡単で、ほとんど自動化されている -我々は、クレートを新しいエディションにアップグレードするのが簡単になるよう目指しています。 -新しいエディションがリリースされるとき、我々は[移行を自動化するツール](https://doc.rust-lang.org/cargo/commands/cargo-fix.html)も提供します。 -このツールは、新しいエディションに適合させるために必要な小さな変更をコードに施します。 +Rust は、クレートを簡単に新しいエディションにアップグレードできるように目指しています。 +新しいエディションがリリースされたら、[自動移行ツール](https://doc.rust-lang.org/cargo/commands/cargo-fix.html)が使用できます。 +これを使うと、Cargo はコードが新バージョンに適合するように微修正します。 + + 例えば、Rust 2018 への移行の際は、`async` と名のつく全てのものを、等価な[生識別子構文](https://doc.rust-lang.org/rust-by-example/compatibility/raw_identifiers.html)である `r#async` へと書き換える、といった具合です。 +Cargo の自動移行は完璧でないので、手作業での変更が必要なコーナーケースもまれにあります。 +正常動作やパフォーマンスといった、コードの意味を損ないうる変更はしないよう設計されています。 -この自動移行は必ずしも完璧とは限らず、手作業での変更が必要なコーナーケースもないとは言えません。 -このツールは、コードの正しさやパフォーマンスに影響を与えうるような、プログラムの意味に関わる変更は避けるために全力を尽くします。 + +## このガイドの対象読者 +自動移行ツールに加えて、本資料「Rust エディションガイド」では各エディションにおける変更内容を説明しています。 +各変更内容に加え、もっと詳しく知りたい人向けのリンクもあれば紹介していますし、 +さらには把握しておくべき詳細や重箱の隅まで網羅しています。 + + +クレート作者の皆様は、 + +- エディションの概要 +- 特定のエディションへの移行ガイド +- 自動移行ツールに何らかの問題が生じたときのトラブルシューティング -我々はこのツールの他に、エディションを構成する変更を取り扱っている、本エディション移行ガイドも管理しています。 -このガイドでは、それぞれの変更内容と、もっと詳しく知りたい人向けのリンク、さらには知っておくべき詳細や重箱の隅まで網羅しています。 -このガイドはエディションの概要を示すと同時に、自動化ツールに何らかの問題が生じたときのトラブルシューティング用の文献にもなります。 +の資料としてご利用ください。