Rust 2018が登堎したしたが、それは䜕ですか

この蚘事はLin ClarkeがRust開発チヌムず共同で䜜成したした本文では「私たち」。 Rustの公匏ブログで投皿を読むこずもできたす。



Rust 2018の最初のバヌゞョンは2018幎12月6日にリリヌスされたした。このリリヌスでは、Rustの開発者が可胜な限り効率的に䜜業を開始できるように生産性に焊点を圓おたした。





タむムラむンは、ベヌタからRust 2018およびRust 2015ぞの移行を瀺しおいたす。ツヌルのアむコンず4぀の領域WebAssembly、組み蟌み、ネットワヌク、CLIに囲たれおいたす。 赀い䞞-開発者の生産性-はRust 2015を陀くすべおを囲んでいたす



しかし、䞀般的にRust 2018が䜕であるかを説明するのは簡単ではありたせん。



䞀郚の人は、それを蚀語の新しいバヌゞョンずしお提瀺しおいたす...そのようなものですが、実際にはそうではありたせん。 ここで「新しいバヌゞョン」ずは、他の蚀語の新しいバヌゞョンを意味するものではないため、「実際にはない」ず蚀いたす。



他のほずんどの蚀語では、すべおの新機胜により新しいバヌゞョンが远加されたす。 前のバヌゞョンは曎新されたせん。



Rustシステムの動䜜は異なりたす。 これは、蚀語の開発方法によるものです。 ほずんどすべおの新機胜は、Rustず100互換性がありたす。 倉曎は必芁ありたせん。 これは、Rust 2018コヌドに限定する理由がないこずを意味したす。コンパむラの新しいバヌゞョンは、デフォルトで「Rust 2015モヌド」を匕き続きサポヌトしたす。



しかし、蚀語の開発には、新しい構文などの革新が必芁になる堎合がありたす。 そしお、この新しい構文は既存のコヌドベヌスを砎壊する可胜性がありたす。



たずえば、 async/await



関数。 圓初、Rustにはそのような抂念はありたせんでした。 しかし、これらのプリミティブは本圓に有甚であり、非同期コヌドの蚘述を簡玠化するこずがわかりたした。



この機胜では、 async



およびawait



キヌワヌドを远加する必芁がありたす。 ただし、 async



たたはawait



を倉数名ずしお䜿甚できる叀いコヌドを壊さないように泚意する必芁がありたす。



したがっお、Rust 2018にキヌワヌドを远加したす。機胜はただリリヌスされおいたせんが、キヌワヌドは珟圚予玄されおいたす。 今埌3幎間の開発における互換性のない倉曎たずえば、新しいキヌワヌドの远加はすべお、Rust 1.31で䞀床に行われたす。







Rust 2018には互換性のない倉曎がありたすが、これはコヌドが砎損するずいう意味ではありたせん。 async



およびawait



倉数を䜿甚しおも、コヌドはコンパむルされたす。 デフォルトでは、コンパむラは以前ず同様に動䜜したす。



ただし、新しい関数のいずれかを䜿甚する堎合は、Rust 2018の新しいコンパむルモヌドを遞択できたす。 cargo fix



コマンドは、新しい関数を䜿甚するためにコヌドを曎新し、倉曎を行うプロセスを自動化する必芁があるかどうかを通知したす。 その埌、新しい関数の䜿甚に同意する堎合は、 edition=2018



をCargo.tomlに远加できたす。



Cargo.tomlのこのバヌゞョン指定子は、プロゞェクト党䜓には適甚されず、䟝存関係にも適甚されたせん。 特定の1぀のラックに制限されたす。 ぀たり、Rust 2015ずRust 2018のクレヌトを同時に䜿甚できたす。







したがっお、Rust 2018を䜿甚しおも、すべおがRust 2015ずほが同じに芋えたす。ほずんどの倉曎はRust 2018ずRust 2015で同時に実装されたす。互換性のない倉曎が必芁な機胜はごくわずかです。







Rust 2018は、䞻芁蚀語の倉曎だけではありたせん。 圌らだけではありたせん。



Rust 2018は、第䞀に、䞻に蚀語倖のツヌルのおかげで、たた特定のアプリケヌションの開発ず、Rustをこれらのケヌスで最も効果的なプログラミング蚀語にする方法の理解のおかげで、Rust開発者の生産性を改善するための掚進力です。



したがっお、Rust 2018をCargo.tomlの指定子ずしお衚すこずができたす。これは、互換性のない倉曎を必芁ずするいく぀かの関数を含めるために䜿甚されたす...







あるいは、パフォヌマンス、リ゜ヌスの効率的な䜿甚、たたは高い信頌性が必芁なずきに、Rustが倚くのアプリケヌションにずっお最も効率的な蚀語の1぀になっおいる時点で想像できたす。







定矩の2番目のバヌゞョンをお勧めしたす。 それでは、蚀語倖で行われたすべおの改善点を芋おから、蚀語自䜓に飛び蟌んでみたしょう。



特定の甚途の錆



プログラミング蚀語は、抜象的には効果的ではありたせん。 特定のアプリケヌションで効果的です。 したがっお、Rustを蚀語たたはツヌルずしお改善するこずだけが必芁ではないこずを理解したした。 たた、特定の領域でのRustの䜿甚を簡玠化する必芁がありたす。







堎合によっおは、これはたったく新しい゚コシステム甚のたったく新しいツヌルセットを䜜成するこずを意味したした。 他の堎合では、既存の機胜ず優れたドキュメントを磚いお、皌働䞭のシステムを簡単に起動および実行できるようにしたす。



Rust開発チヌムは、4぀の分野でワヌキンググルヌプを圢成しおいたす。





Webassssembly



WebAssemblyは、たったく新しいツヌルセットを䜜成する必芁がありたした。



WebAssemblyがRustなどの蚀語をコンパむルしおむンタヌネット䞊で実行できるようにしたのは昚幎だけです。 それ以来、Rustはすぐに既存のWebアプリケヌションずの統合に最適な蚀語になりたした。







Rustは、次の2぀の理由でWeb開発に適しおいたす。



  1. 貚物箱゚コシステムは、ほずんどのWebアプリケヌション開発者が慣れおいる方法で機胜したす。 倚数の小さなモゞュヌルを組み合わせお、より倧きなアプリケヌションを䜜成したす。 ぀たり、Rustは必芁な堎所で簡単に䜿甚できたす。
  2. Rustはリ゜ヌスが少なく、ランタむムを必芁ずしたせん。 倚くのコヌドは必芁ありたせん。 倧量のハヌドコンピュヌティング䜜業を行う小さなモゞュヌルがある堎合は、Rustの行をいく぀か実装しお速床を䞊げおください。


Rustコヌドのweb-sysおよびjs-sysクレヌトを䜿甚するず、 fetch



やappendChild



などのWeb APIを簡単に呌び出すこずができappendChild



。 たた、 wasm-bindgen



するず、WebAssemblyがネむティブにサポヌトしおいない高レベルのデヌタ型を簡単にサポヌトできたす。



Rust WebAssemblyモゞュヌルを蚘述した埌、Webアプリケヌションの残りの郚分に簡単に接続するツヌルがありたす。 wasm-packを䜿甚しおこれらのツヌルを自動的に起動し、必芁に応じおnpmでモゞュヌルを実行できたす。



詳现に぀いおは、 本Rust and WebAssemblyを参照しおください 。



次は



Rust 2018のリリヌス埌、開発者は、どの分野でさらに䜜業を進めるかに぀いおコミュニティず話し合う予定です。



組み蟌みアプリケヌション



組み蟌み開発では、既存の機胜の安定性を高める必芁がありたした。



理論的には、Rustは垞に組み蟌みアプリケヌションに適した蚀語でした。 これは、開発者にずっお非垞に欠けおいた最新のツヌルキットであり、非垞に䟿利な高レベル蚀語機胜です。 これらすべおは、CPUずメモリに䞍必芁な負荷をかけるこずなく行われたす。 したがっお、Rustは組み蟌みに最適です。



しかし、実際にはそれは異なっお刀明したした。 安定したチャネルには必芁な機胜がありたせんでした。 さらに、組み蟌みデバむスで䜿甚するには、暙準ラむブラリを倉曎する必芁がありたした。 ぀たり、人々は独自のバヌゞョンのRustコアクレヌトすべおのRustアプリケヌションで䜿甚され、Rustの基本的な構成芁玠である組み蟌み関数ずプリミティブを提䟛するクレヌトをコンパむルする必芁がありたした。







その結果、開発者はRustの実隓バヌゞョンに䟝存しおいたした。 たた、自動テストがない堎合、実隓アセンブリはマむクロコントロヌラヌで機胜しないこずがよくありたした。



これを修正するために、開発者は必芁なすべおの機胜を安定したチャネルに転送し、マむクロコントロヌラヌのCIシステムにテストを远加しようずしたした。 これは、デスクトップコンポヌネントを倉曎しおも、組み蟌みバヌゞョンが壊れないこずを意味したす。



このような倉曎により、Rustでの組み蟌みシステムの開発は、高床な実隓の分野から通垞の効率の分野に移行しおいたす。



詳现に぀いおは、 曞籍Rust for Embedded Systemsを参照しおください。



次は



今幎、Rustは人気のあるARM Cortex-Mファミリに察しお非垞に良いサポヌトを埗たした。 ただし、倚くのアヌキテクチャはただ十分にサポヌトされおいたせん。 Rustを拡匵しお、他のアヌキテクチャに同様のサポヌトを提䟛する必芁がありたす。



ネットワヌクタスク



ネットワヌクで動䜜するためには、キヌに抜象化を蚀語に埋め蟌む必芁がありたした async/await



。 したがっお、開発者は非同期コヌドでも暙準のRustむディオムを䜿甚できたす。



ネットワヌクタスクでは、倚くの堎合、埅機する必芁がありたす。 たずえば、リク゚ストぞの応答。 コヌドが同期の堎合、䜜業は停止したす。コヌドが実行されるプロセッサのコアは、リク゚ストが到着するたで䜕もできたせん。 ただし、非同期コヌドでは、このような関数をスタンバむモヌドにするず、CPUコアが残りを実行できたす。



Rust 2015では非同期プログラミングも可胜です。これには倚くの利点がありたす。 高性胜アプリケヌションでは、サヌバヌアプリケヌションが各サヌバヌぞの接続をはるかに倚く凊理したす。 小さなシングルスレッドCPU䞊の組み蟌みアプリケヌションは、シングルスレッドの䜿甚を最適化したす。



しかし、これらの利点には倧きな欠点が䌎いたす。このようなコヌドでは、借甚怜蚌が機胜せず、非暙準のそしお少し混乱したRustむディオムを䜿甚する必芁がありたす。 これはasync/await



利点です。 これにより、コンパむラヌは非同期関数呌び出しの借甚を確認するために必芁な情報を埗るこずができたす。



async/await



キヌワヌドはバヌゞョン1.31で実装されasync/await



が、珟圚実装ではサポヌトされおいたせん。 ほずんどの䜜業は完了しおおり、この機胜は次のリリヌスで利甚可胜になるはずです。



次は



効果的な䜎レベル開発に加えお、Rustはより高レベルのネットワヌクアプリケヌションのより効率的な開発を提䟛できたす。



倚くのサヌバヌは、URLの解析やHTTPの䜿甚など、日垞的なタスクを実行しおいたす。 それらをコンポヌネントクレヌトずしお共有される䞀般的な抜象化に倉換するず、それらを簡単に接続しお、あらゆる皮類のサヌバヌおよびフレヌムワヌク構成を圢成できたす。



コンポヌネントを開発およびテストするために、実隓的なTideフレヌムワヌクが䜜成されたした。



コマンドラむンツヌル



コマンドラむンツヌルの堎合、小さな䜎レベルのラむブラリを組み合わせお高レベルの抜象化を行い、いく぀かの既存のツヌルを掗緎する必芁がありたした。



䞀郚のスクリプトでは、bashが理想的です。 たずえば、他のシェルツヌルを呌び出しお、それらの間でデヌタを枡すだけです。



しかし、Rustは他の倚くのツヌルにずっお玠晎らしいオプションです。 たずえば、既存のラむブラリの機胜の䞊にripgrepなどの耇雑なツヌルやCLIツヌルを䜜成する堎合。



Rustはランタむムを必芁ずせず、単䞀の静的バむナリにコンパむルするため、プログラムの配垃が簡単になりたす。 そしお、CやC ++など、他の蚀語にはない高レベルの抜象化を取埗したす。



Rustを改善できるものは他にありたすか もちろん、さらに高いレベルの抜象化。



高レベルの抜象化により、既補のCLIをすばやく簡単に組み立おるこずができたす。



このような抜象化の䟋は、 人間のパニックラむブラリです。 そのようなラむブラリがない堎合、障害が発生した堎合、CLIコヌドはおそらくすべおのバックトラックを返したす。 しかし、ナヌザヌにずっおはあたり面癜くない。 カスタム゚ラヌ凊理を远加できたすが、それは困難です。



ヒュヌマンパニックラむブラリでは、出力は自動的に゚ラヌダンプファむルに送られたす。 ナヌザヌには、問題を報告しおダンプファむルをダりンロヌドするための情報メッセヌゞが衚瀺されたす。







CLIツヌルの開発も簡単になりたした。 たずえば、 confyラむブラリは構成を自動化したす。 圌は2぀のこずだけを尋ねたす。





Confyは、他のすべおを独自に決定したす。



次は



CLIの倚くのタスクを抜象化したした。 しかし、抜象化するものは他にもありたす。 このような高レベルのラむブラリをさらにリリヌスする予定です。



錆ツヌル







任意の蚀語で䜜成する堎合、そのツヌルを䜿甚したす。゚ディタヌから開始し、開発ずサポヌトのすべおの段階で他のツヌルを䜿甚し続けたす。



぀たり、効果的な蚀語は効果的なツヌルに䟝存したす。



Rust 2018の新しいツヌルおよび既存のツヌルの改良点を以䞋に瀺したす。



IDEサポヌト



もちろん、パフォヌマンスは、開発者の心からコンピュヌタヌ画面ぞのコヌドの迅速か぀スムヌズな転送に䟝存したす。 ここではIDEのサポヌトが重芁です。 このためには、IDEにRustコヌドの意味を「説明」できるツヌルが必芁です。たずえば、文字列の自動補完に意味のあるオプションを提案したす。



Rust 2018では、コミュニティはIDEに必芁な機胜に焊点を合わせたした。 Rust Language ServerずIntelliJ Rustの登堎により、倚くのIDEがRustを完党にサポヌトするようになりたした。



より高速なコンパむル



コンパむラヌのパフォヌマンスを向䞊させるこずは、それを高速化するこずを意味したす。 これが私たちがしたこずです。



以前は、Rustクレヌトをコンパむルするず、コンパむラはクレヌト内のすべおのファむルを再コンパむルしおいたした。 増分コンパむルが実装されたした。倉曎された郚分のみをコンパむルしたす。 他の最適化ずずもに、これによりRustコンパむラヌの速床が倧幅に向䞊したした。



rustfmt



たた、効率性のためには、コヌドのフォヌマット芏則に぀いお議論したり、他の人のスタむルを手動で修正したりするこずは決しおありたせん。



rustfmtツヌルはこれに圹立ちたす。デフォルトのスタむル コミュニティが合意に達したスタむルに埓っおコヌドを自動的に再フォヌマットしたす。 Rustfmtは、すべおのRustコヌドがC ++のclang圢匏たたはJavaScriptのPrettierに䌌た同じスタむルに準拠するこずを保蚌したす。



Clippy



コヌドを䜜成するためのベストプラクティスに関するヒントを提䟛する経隓豊富なコンサルタントが近くにいるず䟿利な堎合がありたす。 これがClippyの動䜜です。衚瀺䞭にコヌドをチェックし、暙準的なむディオムを提案したす。



さびた



しかし、叀いむディオムを持぀叀いコヌドベヌスがある堎合は、コヌドを個別に怜蚌および修正するのは面倒です。 誰かにコヌドベヌス党䜓を修正しおもらいたいだけです。



これらの堎合、rustfixはプロセスを自動化したす。 Clippyなどのツヌルから同時にルヌルを適甚し、Rust 2018のむディオムに埓っお叀いコヌドを曎新したす。



Rust自䜓の倉曎



゚コシステムの倉化により、プログラミングの効率が倧幅に向䞊したした。 しかし、䞀郚の問題は蚀語自䜓の倉曎によっおのみ解決できたす。







はじめに述べたように、ほずんどの蚀語の倉曎は既存のRustコヌドず完党に互換性がありたす。 これらの倉曎はすべおRust 2018の䞀郚です。しかし、それらは䜕も壊さないので、Rustコヌドで動䜜したす...叀いコヌドでも動䜜したす。



すべおのバヌゞョンに远加される重芁な機胜を芋おみたしょう。 次に、Rust 2018の機胜の短いリストをご芧ください。



すべおのバヌゞョンの新機胜



以䞋は、蚀語のすべおのバヌゞョンに含たれるたたは含たれる予定の新機胜の小さな䟋です。



より正確な借入怜蚌



Rustの倧きな利点の1぀は、借入怜蚌です。 コヌドがメモリセヌフであるこずを保蚌したす。 しかし、Rustの初心者にずっおはかなり耇雑な機胜でもありたす。



難しさの䞀郚は、新しい抂念を孊ぶこずにありたす。 しかし、別の郚分がありたす...借甚をテストするず、メモリの安党性の抂念を完党に理解しおいるプログラマヌの芳点からは機胜しおいるように芋えるコヌドが拒吊されるこずがありたす。





倉数は既に借甚されおいるため、借甚できたせん



これは、借甚ラむフタむムがフィヌルドの終わりたでたずえば、倉数が配眮されおいる関数の終わりたで延長されるこずになっおいたために発生したす。



぀たり、倉数が倀の凊理を終了し、アクセスを詊行しなくなっおも、他の倉数は関数の終了たでこの倀ぞのアクセスを拒吊されたす。



状況を修正するために、チェックをよりスマヌトにしたした。 これで、倉数が倀の䜿甚を実際に終了したこずがわかりたす。 その埌、デヌタの䜿甚はブロックされたせん。







これはRust 2018でのみ䜿甚可胜ですが、近い将来、この機胜は他のすべおのバヌゞョンに远加される予定です。 すぐにこのトピックに぀いお詳しく説明したす。



安定した錆の手続きマクロ



Rustのマクロは、Rust 1.0より前に存圚しおいたした。 しかし、Rust 2018では、たずえば手続き型マクロが登堎したなど、深刻な改善が行われたした。 Rustに独自の構文を远加できたす。



Rust 2018は、2皮類の手続きマクロを提䟛したす。



関数マクロ



関数のようなマクロを䜿甚するず、通垞の関数呌び出しのように芋えるが、実際にはコンパむル時に実行されるオブゞェクトを䜜成できたす。 圌らは1぀のコヌドを受け取り、別のコヌドを提䟛し、コンパむラはそれをバむナリに挿入したす。



以前は存圚しおいたしたが、限られおいたした。 マクロは䞀臎ステヌトメントのみを実行できたす。 圌は、着信コヌド内のすべおのトヌクンを衚瀺するアクセス暩を持っおいたせんでした。



しかし、手続き型マクロを䜿甚するず、パヌサヌず同じ入力、぀たり同じトヌクンストリヌムを取埗できたす。 これは、関数のようなはるかに匷力なマクロを䜜成できるこずを意味したす。



属性のようなマクロ



JavaScriptのような蚀語のデコレヌタに粟通しおいる堎合、属性マクロは非垞によく䌌おいたす。 これらを䜿甚するず、前凊理しお他の䜕かに倉換する必芁があるRustコヌドのフラグメントに泚釈を付けるこずができたす。



derive



マクロはたさにそれを行いたす。 構造䜓に重ねるず、コンパむラヌはトヌクンのリストずしお解析された埌にこの構造䜓を取埗しお凊理したす。 特に、トレむトからの関数の基本的な実装を远加したす。



比范におけるより人間工孊的な借入



簡単な倉曎がありたす。



以前は、䜕かを借りお䞀臎させようずした堎合、奇劙な構文を远加する必芁がありたした。







今&Some(ref s)



代わりに&Some(ref s)



単にSome(s)



曞きたす。



Rust 2018の新機胜



Rust 2018の最小郚分は、このバヌゞョンに固有の機胜です。 Rust 2018の小さな倉曎点を以䞋に瀺したす。



キヌワヌド



Rust 2018はいく぀かのキヌワヌドを远加したした





これらの機胜はただ完党には実装されおいたせんが、Rust 1.31でキヌワヌドが远加されたした。 したがっお、将来、これらの機胜を実装するずきに新しいキヌワヌドを導入する必芁はなくなりたすこれは互換性のない倉曎になりたす。



モゞュラヌシステム



Rustの初心者にずっお倧きな苊痛の1぀は、モゞュラヌシステムです。そしお、その理由は明らかです。Rustが特定のモゞュヌルを遞択する理由を理解するこずは困難でした。これを修正するために、パスメカニズムにいく぀かの倉曎を加えたした。



たずえば、ラックをむンポヌトした堎合、最䞊䜍のパスで䜿甚できたす。ただし、コヌドをサブモゞュヌルに移動するず、機胜しなくなりたす。



 // top level module extern crate serde; // this works fine at the top level impl serde::Serialize for MyType { ... } mod foo { // but it does *not* work in a sub-module impl serde::Serialize for OtherType { ... } }
      
      





別の䟋は、::



クレヌトのルヌトず倖郚クレヌトの䞡方に䜿甚されるプレフィックスです。私たちの前にあるものを理解するこずは困難です。



より明確にしたした。ルヌトラックを参照する堎合は、プレフィックスを䜿甚したすcrate::



。これは、わかりやすくするための改善点の1぀にすぎたせん。



珟圚のコヌドでRust 2018の機胜を䜿甚する堎合、ほずんどの堎合、新しいパスを反映するようにコヌドを曎新する必芁がありたす。ただし、これを手動で行う必芁はありたせん。Cargo.tomlにバヌゞョン指定子を远加する前に、それcargo fix



を実行しrustfix



お必芁な倉曎を加えたす。



远加情報



蚀語の新しいバヌゞョンに関するすべおの情報は、Rust 2018ガむドに含たれおいたす。



All Articles