研究レポート: Rust 言語を理解するには 30,000 語
この記事の由来はこの記事の由来は覚学協会
、著者の張漢東、許可を得て複製。
コンテンツディレクトリ:
文前
Rust言語を理解する
C/Cppに匹敵する高性能
信頼性
生産力
Rustとオープンソース
Rust言語の弱点
Rustのエコロジーベースライブラリとツールチェーン
錆び業界のアプリケーション一覧
データサービス
クラウドネイティブ
オペレーティング·システム
機械学習
ゲーム
ゲーム
クライアント開発
ブロックチェーン/デジタル通貨
実稼働環境で Rust を使用している企業を調査する
国内
国内
npm
著者について
MDNICEエディター
文前
Rust 言語は、GC がなく、メモリの安全性、同時実行性の安全性、および高いパフォーマンスが保証される汎用システムレベルのプログラミング言語です。 2008 年から Graydon Hoare によって個人的に開発され、2009 年に Mozilla のスポンサーとなりました。サーボ エンジンの開発のために 2010 年にバージョン 0.1.0 が最初にリリースされました。バージョン 1.0 は 2015 年 5 月 15 日にリリースされました。
リリース以来、6 年間の開発期間を経た 2021 年の今日の時点で、Rust は着実に成長しており、徐々に成熟して安定してきました。2016 年から 2021 年にかけて、Rust は
StackOverflow 言語リスト [1] で最も人気のある言語。
2021 年 2 月 9 日、Rust Foundation が発表されました。 Huawei、AWS、Google、Microsoft、Mozilla、Facebook、その他テクノロジー業界の大手企業がプラチナメンバーとして Rust Foundation に参加し、世界規模で Rust 言語の推進と開発を行っています。
では、開発者や巨大企業をこれほどまでに惹きつけるRust言語の魅力とは何でしょうか?
注: この記事に記載されているデータはすべて、インターネット上の公開コンテンツからのものです。
MDNICEエディター
Rust言語を理解する
プログラミング言語の設計は、一見相容れない 2 つの願望の間で長い間対立してきました。
安全(安全)。私たちは、多くのエラーを静的に排除する強力な型システムを望んでいます。自動メモリ管理が必要です。プライベート変数の不変オブジェクト表現を強制し、信頼できないコードによって破損されないようにするには、データのカプセル化が必要です。
コントロール。少なくとも、Web ブラウザー、オペレーティング システム、ゲーム エンジンなどのシステム プログラミング プログラムでは、パフォーマンスやリソースの制約が重要な問題となるため、データのバイト レベルの表現を理解する必要があります。私たちは、低レベルのプログラミング技術を使用して、プログラムの時間とスペースの使用量を最適化したいと考えています。必要に応じてベアメタルを使用したいと考えています。
しかし、伝統的な考え方によれば、ケーキを持ってそれを食べることはできません。 Java のような言語は、優れたセキュリティ保証を提供しますが、その代償として、基礎となる層の制御が犠牲になります。その結果、多くのシステム プログラミング アプリケーションにとって、唯一の現実的な選択肢は、リソース管理をきめ細かく制御できる C または C++ などの言語を使用することです。ただし、この制御を取得するには、高いコストがかかります。たとえば、Microsoft は最近、パッチを適用したセキュリティ バグの 70% がメモリ安全性違反によるものであり 33[2]、厳密に型指定されたシステムによって除外できる問題であると報告しました。同様に、Mozilla は、Firefox で発見された重大なバグの大部分がメモリ関連であったと報告しました16 [3]。
基盤となる層を制御しながらセキュリティ システムをプログラミングするという、両方の長所を何らかの形で実現できれば素晴らしいと思いませんか。こうしてRust言語が誕生しました。
公式 Web サイトでは、誰もが信頼性が高く効率的なソフトウェアを構築できるようにする言語である Rust を次のように紹介しています。
Rust 言語には、誰もが注目するに値する 3 つの主要な利点があります。
ハイパフォーマンス。 Rust は驚くほど高速で、メモリ効率が非常に優れています。ランタイムやガベージ コレクションがないため、特に要求の厳しいサービスを実行でき、組み込みデバイス上で実行でき、他の言語と簡単に統合できます。
信頼性。 Rust の豊富な型システムと所有権モデルにより、メモリの安全性とスレッドの安全性が保証され、コンパイル時にあらゆる種類のエラーを排除できます。
生産力。 Rust には、優れたドキュメント、フレンドリーなコンパイラ、明確なエラー メッセージがあり、また、一流のツール、パッケージ マネージャーとビルド ツール、型チェックのためのインテリジェントなオートコンプリートとマルチエディタのサポート、自動フォーマット コードなども統合されています。
Rust は十分に低レベルであるため、必要に応じて C と同様に最適化してパフォーマンスを最大化できます。
抽象化レベルが高くなると、メモリ管理がより便利になり、利用可能なライブラリが豊富になり、Rust プログラム コードの数が増え、やるべきことが増えますが、制御しないとプログラムの肥大化につながる可能性があります。
ただし、Rust プログラムも十分に最適化されており、場合によっては C よりも優れており、バイト単位、バイト単位、ポインター単位で最小限のコードを記述するのに適しています。一方、Rust には複数の関数やライブラリ全体を効率的に組み合わせる能力もあります。がまとめられています。
Rust 言語は、高い同時実行性とゼロコストでの非同期プログラミングもサポートしており、非同期プログラミングをサポートする最初のシステムレベル言語となるはずです。
MDNICEエディター
Rust vs C
Rust vs Cpp
Rust vs Go
C/Cppに匹敵する高性能
Rust で書かれたプログラムは、C で書かれたプログラムと同様の実行速度とメモリ使用量を持つはずですが、2 つの言語は全体的なプログラミング スタイルが異なるため、パフォーマンスについて一般化するのは困難です。
一般的に:
抽象化は両刃の剣です。 Rust 言語は C 言語よりも高度な抽象化を備えており、その抽象化により、あまり最適化されていない一部のコードが隠蔽されてしまいます。これは、Rust コードのデフォルト実装のパフォーマンスが最高ではないことを意味します。したがって、C のようなパフォーマンスを実現するには、Rust コードを最適化する必要があります。 Unsafe Rust は高パフォーマンスのエクスポートです。
Rust はデフォルトでスレッドセーフであるため、データ競合が排除され、マルチスレッド同時プログラミングがより実用的になります。
確かに、Rust はいくつかの点で C よりも高速です。理論上、C言語は何でもできます。しかし実際には、C の抽象化能力は比較的低く、それほど最新ではなく、開発効率も比較的低いです。開発者に無制限の時間と労力がある限り、これらの方法で C を Rust よりも高速に作成できます。
C 言語は高いパフォーマンスを表すのに十分であるため、C と Rust の類似点と相違点について話しましょう。 C/Cpp に精通している場合は、この比較に基づいて Cpp と Rust を評価することもできます。
Rust と C は両方ともハードウェア直接抽象化です
Rust と C は両方とも直接ハードウェア抽象化であり、どちらも「ポータブル アセンブラ」と考えることができます。"Rust と C はどちらも、データ構造のメモリ レイアウト、整数サイズ、スタックとヒープのメモリ割り当て、ポインタの間接アドレス指定などを制御でき、一般に理解可能なマシン コードに変換でき、コンパイラが次のようなコードを挿入することはほとんどありません。"。
魔法"Rust にはイテレータ、トレイト、スマート ポインタなどの C よりも高レベルの構成要素がありますが、それらは単純なマシンコード (別名) に予想通り最適化されるように設計されています。")。
ゼロコストの抽象化
正確に {バイト*、容量、長さ}。 Rust には Cpp の移動コンストラクターやコピー コンストラクターのような概念がないため、オブジェクトの受け渡しはポインターや memcpy の受け渡しと同じくらい複雑ではないことが保証されています。
Rust の借用チェックは、単にコード内の参照をコンパイラーが静的に分析することです。生涯情報は、中級中間言語 (MIR) が生成されるずっと前に完全に抽出されました。
従来の例外処理の代わりに、Rust は戻り値ベースのエラー処理を使用します。ただし、Cpp のようにパニック (Panic) を使用して異常な動作を処理することもできます。コンパイル時に無効にすることもできますが (パニック = アボート)、その場合でも、Rust は Cpp 例外や longjmp を使いたくないのです。
同じ LLVM バックエンド
Rust は LLVM と優れた統合を備えているため、ThinLTO を含むリンク時の最適化や、C/C++/Rust 言語の境界を越えたインライン化もサポートします。プロファイルに基づく最適化 (PGO) のサポートもあります。 Rustc は Clang よりも冗長な LLVM IR を生成しますが、オプティマイザはこれを適切に処理します。
C 言語は、LLVM よりも GCC を使用した方がコンパイルが速く、現在、Rust コミュニティの一部の人々が GCC の Rust フロントエンドを開発しています。
理論上、Rust には C よりも厳格な不変性とエイリアスのルールがあるため、C 言語よりもパフォーマンスの最適化が優れているはずですが、実際にはそのような効果はありません。 C を超える最適化は現在 LLVM で進行中であるため、Rust はまだその可能性を最大限に発揮していません。
いくつかの小さな例外を除いて、どちらも手動での最適化が可能です
Rust のコードは低レベルで予測可能なため、最適化するアセンブリ コードに合わせて手動で調整できます。
Rust は SIMD をサポートしており、インライン化と呼び出し規約を細かく制御できます。
Rust と C はよく似ているため、C 用の分析ツールの一部は Rust でも使用できます。
一般に、パフォーマンスが絶対的に重要であり、パフォーマンスを最後の一滴まで絞り出すために手作業による最適化が必要な場合、Rust の最適化は C の最適化と何ら変わりません。
しかし、下位レベルの機能の一部については、Rust には特に優れた代替機能がありません。
後藤。 Rust では Goto は提供されていませんが、代わりにループ ブレーク ラベルを使用できます。 C言語では一般にメモリのクリーンアップにgotoを使用しますが、Rustでは決定論的なデストラクタ関数があるためgotoは必要ありません。ただし、パフォーマンスの最適化に役立つ非標準の goto 拡張機能があります。
スタック メモリ割り当て alloca および C99 可変長配列により、メモリ領域を節約し、メモリ割り当ての数を減らすことができます。しかし、これらはCでも議論の余地があるため、Rustはそれらから遠ざかっています。
C と比較した Rust のオーバーヘッド
Rust は手動で最適化されていない場合、その抽象化によりオーバーヘッドが発生します。
Rust には暗黙的な型変換と use-only インデックスがないため、開発者は、より小さなデータ型であっても、この型の使用に制限を受けます。 64 ビット プラットフォームで usesize をインデックスとして使用すると、未定義の動作を心配することなく最適化が容易になりますが、余分なビットによりレジスタとメモリへの負担が大きくなる可能性があります。一方、C では 32 ビット型を選択できます。
Rust の文字列には常にポインタと長さが含まれます。ただし、C コードの多くの関数は、サイズに関係なくポインターのみを受け入れます。
for i in 0...len {arr[i]} のような反復では、パフォーマンスは LLVM オプティマイザーが長さの一致を証明できるかどうかに依存します。場合によってはそれができないこともあり、境界チェックによって自動ベクトル化も阻害されます。
C 言語は比較的自由で、メモリの「賢い」使用テクニックが数多くありますが、Rust はそれほど自由ではありません。しかし、Rust は依然としてメモリ割り当てを大幅に制御でき、メモリ プーリング、複数の割り当てを 1 つにマージする、スペースの事前割り当てなどの基本的なことを行うことができます。
Rust の借用チェックに慣れていないと、参照を使用してエスケープするために Clone が使用される可能性があります。
Rustの標準ライブラリのI/Oはキャッシュされないため、BufWriterでラップする必要があります。時間の 99% が I/O に費やされるため、Rust で書かれたコードは Python ほど速くないと言う人がいるのはこのためです。
実行ファイルのサイズ
すべてのオペレーティング システムには、約 30MB のコードを含む標準 C ライブラリが組み込まれています。 C言語の実行ファイルはこれらのライブラリを「無料」で利用できます。"Hello World "小さな
レベル C の実行可能ファイルは実際には何も印刷できません。オペレーティング システムが提供する printf を呼び出すだけです。
Rust ではそうではありません。Rust 実行可能ファイルには独自の標準ライブラリ (300KB 以上) がバンドルされています。幸いなことに、これは削減できるオーバーヘッドは 1 回限りです。"no-std"組み込み開発の場合は、次を使用して標準ライブラリをオフにすることができます。"、錆が発生します。"裸
コード。"関数ごとに見ると、Rust コードのサイズは C とほぼ同じですが、"一般的なインフレ
問題。ジェネリック関数には、使用されるタイプごとに最適化されたバージョンがあるため、同じ関数の 8 つのバージョンが存在する可能性があり、cargo-bloat[4] ライブラリはこれらの問題の発見に役立ちます。
Rust で依存関係を扱うのは非常に簡単です。 JS/npm と同様に、現在は小規模で単一目的のパッケージが推奨されていますが、そのパッケージは増加します。カーゴツリーコマンドは、それらを剪定するのに非常に役立ちます。
Rust が C にわずかに勝る点
実装の詳細を隠すために、C ライブラリは多くの場合、不透明なデータ構造ポインターを返し、構造の各インスタンスが正確に 1 つのコピーを持つようにします。ヒープ割り当てとポインター間接化のコストが消費されます。 Rust に組み込まれたプライバシー、単一所有権ルール、およびコーディング規約により、ライブラリはオブジェクトを間接化せずに公開できるため、呼び出し元はオブジェクトをヒープに配置するかスタックに配置するかを決定できます。スタック上のオブジェクトは、積極的にまたは徹底的に最適化できます。
デフォルトでは、Rust は標準ライブラリ、依存関係、その他のコンパイル単位から関数をインライン化できます。
Rust は構造体フィールドを再配置してメモリ レイアウトを最適化します。
文字列にはサイズ情報が含まれるため、長さのチェックが高速になります。また、部分文字列のインプレース生成が可能になります。
C++ テンプレートと同様に、Rust の汎用関数は単相化されており、さまざまな型のコピーを生成するため、sort などの関数や HashMap などのコンテナーは、対応する型に対して常に最適化されます。 C では、マクロを変更するか、void* やランタイム変数のサイズを処理するあまり効率の悪い関数を変更するかを選択する必要があります。
Rust のイテレータは、ユニットとして一緒に最適化されるチェーンに結合できます。したがって、同じバッファに複数回書き込む一連の呼び出しの代わりに、it.buy().use().break().change().mail().upgrade() を呼び出すことができます。
同様に、読み取りおよび書き込みインターフェイスを通じて、バッファされていないストリーム データを受信し、ストリームに対して CRC チェックを実行し、トランスコード、圧縮、ネットワークへの書き込みをすべて 1 回の呼び出しで行います。ジェネリックとトレイトを使用しない場合は C で実行できるはずですが、実行するのは非常に困難です。
Rust 標準ライブラリには高品質のコンテナと最適化されたデータ構造が組み込まれており、C よりも使いやすくなっています。
Rust の serde は世界最速の JSON パーサーの 1 つであり、その使用体験は非常に優れています。
Rust の C に対する明らかな利点
主に次の2点です。
Rust はデータ競合を排除し、本質的にスレッドセーフであり、マルチスレッドの生産性を解放します。この点で、Rust は C/Cpp などの言語より明らかに優れています。
Rust 言語は、非同期の高同時実行プログラミングをサポートしています。
Rust は安全なコンパイル時評価をサポートしています。
スレッドセーフティ
サードパーティのライブラリでも、コードの作成者がスレッド セーフに注意を払わなかったとしても、Rust はすべてのコードとデータに対してスレッド セーフを強制します。すべてが特定のスレッドの安全性保証に従っているか、クロススレッドの使用を許可していません。スレッドセーフでないコードを作成すると、コンパイラーは安全でないコードを正確に特定します。
Rustエコシステムには、データ並列処理、スレッドプール、キュー、タスク、ロックフリーデータ構造など、すでに多くのライブラリがあります。このようなコンポーネントと型システムの強力なセーフティ ネットの助けにより、Rust プログラムの同時実行/並列化は非常に簡単になります。場合によっては、iter の代わりに par_iter を使用しても問題はありません。コンパイルさえできれば、正常に動作するはずです。これは必ずしも直線的に高速化するとは限りませんが (アムダールの法則は残酷です)、多くの場合、比較的少ない作業で 2 ~ 3 倍の高速化が実現します。
拡張: アムダールの法則。ジーン・アムダールにちなんで名付けられたコンピューターサイエンスの経験則。これは、並列コンピューティング後の効率を向上させるプロセッサーの能力を表します。
スレッドセーフの文書化に関しては、Rust と C の間には興味深い違いがあります。
Rust には、送信と同期、ガード、セルなど、スレッド セーフの特定の側面を説明するために使用される用語集があります。
C ライブラリの場合、「一方のスレッドで割り当て、もう一方のスレッドで解放することはできますが、両方のスレッドから同時に使用することはできません」ということはありません。
Rust では、データ型の観点からスレッドの安全性を説明し、それを使用するすべての関数に一般化します。
C 言語の場合、スレッド セーフには個々の関数と構成フラグのみが含まれます。
Rust の保証は通常、コンパイル時に、少なくとも無条件に提供されます。
C 言語の場合、「turboblub オプションが 7 に設定されている場合にのみスレッドセーフである」と言うのが一般的です。
非同期同時
Rust 言語は、async/await 非同期プログラミング モデルをサポートしています。
このプログラミング モデルは、JavaScript では Promise とも呼ばれる、Future と呼ばれる概念に基づいています。 Future は未解決の値を表し、その値が解決される前にさまざまな操作を実行してその値を取得できます。多くの言語では、Future についてはあまり作業が行われていませんが、この実装では、コンビネータ (Combinator) などの多くの機能がサポートされており、特にこれに基づいて、より人間工学に基づいた async/await 構文を実現します。
Future はあらゆる種類のものを表すことができ、特に非同期 I/O を表すのに役立ちます。ネットワーク リクエストを行うと、Future オブジェクトがすぐに取得され、ネットワーク リクエストが完了すると、応答が返した値が返されます。を含む場合があります。「タイムアウト」などの意味もあり、「タイムアウト」は実際には一定時間後に解決される Future であり、I/O ではない作業や、CPU を集中的に使用して実行するためにスレッド プールに配置する必要がある作業も含まれます。作業は Future で表すこともでき、Future はスレッド プールが作業を完了した後に解決されます。
Future の問題は、ほとんどの言語での表現方法が、Future の解決後に実行するコールバック関数を指定するコールバック ベースのアプローチであることです。つまり、Future は、いつ解決されるかを把握する責任があり、コールバックが何であっても実行されます。そして、すべての不便な点もこのモデルに組み込まれており、すでに多くの作業が完了しているため、使用するのが非常に困難です。多くの開発者が開発した結果、多くの割り当てコードを記述し、動的ディスパッチを使用する必要があることがわかりました。実際、ディスパッチしようとする各コールバックは、クレート オブジェクト、ヒープ メモリ割り当て、これらの割り当てなど、独自の独立したストレージ スペースを取得する必要があります。そしてダイナミックなディスパッチをどこへでも。このアプローチは、ゼロコスト抽象化の 2 番目の原則を満たしていません。また、これを使用する場合は、自分で作成するよりもはるかに時間がかかります。では、なぜこれを使用する必要があるのでしょうか。
Rustではスキームが異なります。 Future スケジューリング コールバックの代わりに、エグゼキュータと呼ばれるコンポーネントが Future をポーリングします。 Future は「まだ準備ができていない (Pending)」を返す場合もあれば、解決後に「Ready (Ready)」を返す場合もあります。このモデルには多くの利点があります。利点の 1 つは、将来をキャンセルするには、将来の保有を中止するだけなので、非常に簡単に将来をキャンセルできることです。コールバックベースのアプローチでは、スケジュールを介してキャンセルしたり停止したりするのはそれほど簡単ではありません。
同時に、プログラムの異なる部分の間に非常に明確な抽象的な境界を確立することもできます。他のほとんどの Future ライブラリにはイベント ループ (イベント ループ) があり、Future が I/O を実行するようにスケジュールする方法でもあります。 , しかし、実際にはこれを制御することはできません。
しかし、Rust ではコンポーネント間の境界は非常に明確で、エグゼキューターが Future のスケジュールを担当し、リアクターがすべての I/O を処理してから実際のコードを処理します。したがって、エンドユーザーは、どのアクチュエータを使用するか、どのリアクタを使用するかを自分で決定できるため、より詳細な制御が可能になります。これは、システム プログラミング言語において非常に重要です。
そして、このモデルの最も重要な本当の利点は、この種のステートマシンの未来を実質ゼロコストで完璧な方法で実装できることです。つまり、作成した Future コードが実際のローカル (ネイティブ) コードにコンパイルされると、ステート マシンのようなものになります。このステート マシンでは、各 I/O 一時停止ポイントにバリアント (バリアント) があり、代わりに、各バリアントが実行を再開するために必要な状態。
そして、この Future 抽象化の本当に便利な点は、その上に他の API を構築できることです。ステート マシンは、これらのコンビネータ メソッドを Future に適用することで構築でき、イテレータ (フィルター、マップなど) のアダプターのように機能します。ただし、この方法にはいくつかの欠点があり、特にコールバックが入れ子になっているなど、可読性が非常に悪いです。そのため、async / await 非同期構文を実装する必要があります。
現在の Rust エコシステムには、epoll などの非同期 I/O をサポートする成熟した tokio[5] ランタイム エコシステムがすでに存在します。 io_uring を使用したい場合は、Glommio[6] を使用するか、tokio による io_uring のサポートを待つこともできます。さらに、smol ランタイムによって提供される async_executor[7] および async-io[8] を使用して、独自のランタイムを構築することもできます。
コンパイル時の計算
Rust は、Cpp と同様にコンパイル時の定数評価をサポートできます。これは明らかに C よりも優れています。
Rust でコンパイル時の評価をサポートすることがそれほど賢明であるのはなぜでしょうか? Rust のコンパイル時の評価は安全である必要があるため、多くの考慮事項があります。 Rust のコンパイル時評価は、Cpp ほど無料ではなく悪用しやすいものではありません。
MDNICEエディター
信頼性
2020年6月、3大学の5人の学者が、近年のRust言語を使用したオープンソースプロジェクトにおけるセキュリティ上の欠陥を包括的に調査した研究結果をACM SIGPLAN国際会議(PLDI'20)で発表した。この研究では、Rust 言語を使用して開発された 5 つのソフトウェア システム、広く使用されている 5 つの Rust ライブラリ、および 2 つの脆弱性データベースを調査します。調査には、合計 850 件の安全でないコードの使用、70 件のメモリ安全性の欠陥、100 件のスレッド安全性の欠陥が含まれていました。
研究者らは調査の際、すべての脆弱性データベースで報告されたバグやソフトウェアで公的に報告されたバグだけでなく、すべてのオープンソース ソフトウェア コード リポジトリのコミット レコードも調査しました。手動分析を通じて、提出物によって修正されるバグの種類を定義し、対応するメモリ安全性/スレッド安全性の問題に分類します。調査されたすべての問題はパブリック Git リポジトリに整理されます: https://github.com/system-pclub/rust-study[9]
調査結果の説明:
Rust 言語の安全なコードは、空間と時間のメモリの安全性の問題をチェックするのに非常に効果的であり、安定版のすべてのメモリの安全性の問題は安全でないコードに関連しています。
メモリの安全性の問題はすべて安全でないコードに関連していますが、多くの問題は安全なコードにも関連しています。問題によっては、安全でないコードではなく、安全なコードのエンコード エラーに起因するものもあります。
スレッドセーフの問題は、ブロッキングか非ブロッキングかに関係なく、コードが Rust 言語のルールに完全に準拠している場合でも、安全なコードで発生する可能性があります。
多くの問題は、Rust 言語のライフサイクル ルールを正しく理解していないプログラマーによって引き起こされます。
Rust 言語の典型的な問題に対応する新しい欠陥検出ツールを構築する必要があります。
では、この調査レポートの背後にある Rust のセキュリティはどのように保証されているのでしょうか?安全でない Rust となぜ安全でないのか?
所有権: Rust 言語メモリの安全メカニズム
Rust の設計は、安全なシステム プログラミングに関する学術研究に大きく基づいています。特に、Rust の設計は、他の主流言語と比較して、独自の型システム (学術文献ではアフィンまたは部分構造型システムと呼ばれることが多い 36[10]) を採用している点で際立っています。
所有権メカニズムは、「メモリ安全性」の概念を実現するために型システムの助けを借りて Rust 言語によって表現される安全なプログラミング セマンティクスとモデルです。
所有権メカニズムによって対処されるメモリの安全性の問題には、次のようなものがあります。
ヌルポインタが参照されています。
初期化されていないメモリの使用。
Use-after-free、つまりダングリング ポインタを使用します。
境界外の配列などのバッファ オーバーフロー。
すでに解放されているポインタや未割り当てのポインタを不正に解放する、つまり解放を繰り返すこと。
メモリ リークはメモリの安全性の問題ではないため、Rust ではメモリ リークも解決されないことに注意してください。
メモリの安全性を確保するために、Rust 言語は厳密に安全なメモリ管理モデルを確立しました。
所有権システム。割り当てられた各メモリには、そのメモリの排他的所有権を持つポインタがあります。ポインタが破壊された場合にのみ、それに応じて対応するメモリを解放できます。
借金と生涯。すべての変数にはライフサイクルがあり、ライフサイクルを超えると、変数は自動的に解放されます。借用の場合は、コンパイラ検査用の有効期間パラメータをマークすることで、ダングリング ポインタ、つまり解放後の使用状況を防ぐことができます。
所有権システムには、最新の C++ から借用した RAII メカニズムも含まれています。これは、Rust の GC フリーだが安全なメモリ管理の基礎です。
安全なメモリ管理モデルが確立されると、型システムで表現できるようになります。 Rust は、Haskell の型システムから次の機能を借用しています。
null ポインタがありません
デフォルトで不変
表現
高次関数
代数データ型
パターンマッチング
ジェネリック
特性と関連するタイプ
ローカル型の推論
メモリの安全性を実現するために、Rust には次のような独自の機能もあります。
Affine Type。Rust の所有権で Move セマンティクスを表現するために使用されます。
借りる、ライフサイクル。
型システムの能力を利用して、Rust コンパイラはコンパイル時に型をチェックして安全なメモリ モデルを満たしているかどうかを確認したり、コンパイル時にメモリの安全性の問題を検出したりして、未定義の動作の発生を効果的に防ぐことができます。
メモリ安全性バグと同時安全性バグの内部原因は同じで、どちらもメモリへの不適切なアクセスによって引き起こされます。同様に、Rust は所有権をロードした強力な型システムによって同時実行の安全性の問題にも対処しています。 Rust コンパイラーは、静的検査分析を通じてコンパイル時にマルチスレッド同時コード内のすべてのデータ競合問題をチェックおよび分析します。
Unsafe Rust: セキュリティ境界の分割
既存のエコシステムとうまく統合するために、Rust は非常に便利でゼロコストの FFI メカニズムをサポートし、C-ABI と互換性があり、Rust 言語を言語アーキテクチャ レベルから Safe Rust と Unsafe Rust に分割します。
その中でも、Unsafe Rust は、オペレーティング システム カーネルなどの外部システムの処理に特化しています。この分割の理由は、Rust コンパイラの検査と追跡には限界があり、他の外部言語インターフェイスのセキュリティ状況を確認することは不可能であり、開発者自身が保証するしかないためです。
Rust の最終目標は、これらの危険箇所を完全に排除することではありません。ある時点で、メモリやその他のリソースにアクセスできる必要があるからです。実際、Rust の目標は、安全でない要素をすべて抽象化することです。セキュリティについて考えるときは、「攻撃対象領域」、つまりプログラムのどの部分と対話できるのかについて考える必要があります。パーサーのようなものは、次の理由から大きな攻撃対象領域となります。
これらは通常、攻撃者によってアクセス可能です。
攻撃者が提供するデータは、解析に必要となることが多い複雑なロジックに直接影響を与える可能性があります。
従来の攻撃面を「攻撃面」(プログラム コードに直接影響を与える可能性のある部分)と、攻撃面が依存するコードである「セキュリティ層」に分解することで、さらに細分化できます。アクセスできず、潜在的なバグがある可能性があります。 C でもこれらは同じです。C の配列はまったく抽象的ではないため、可変数の項目を読み取る場合は、すべての不変式が定数のままであることを確認する必要があります。レイヤー化は安全ではなく、エラーが発生する可能性があるためです。 。
したがって、Rust は、安全なコードと外部インターフェイスにアクセスする安全でないコードを明示的に区別する unsafe キーワードと unsafe ブロックを提供し、開発者がエラーをデバッグするための利便性も提供します。安全な Rust は、開発者がコンパイル時に安全性を確保するコンパイラを信頼することを意味し、安全でない Rust は、コンパイラが開発者の安全性を確保する能力を信頼することを意味します。
人がいるところには虫もいます。 Rust言語の精緻な設計により、マシンがチェック・制御できる部分はコンパイラに実行が渡され、マシンが制御できない部分は開発者自身に渡されます。
Safe Rust が保証するのは、コンパイラがコンパイル時にメモリの安全性を最大限に高め、未定義の動作が発生するのを防ぐことです。
Unsafe Rust は、現時点で開発されたコードが未定義の動作を引き起こす可能性があることを開発者に警告するために使用されます。注意してください。人間とコンパイラは同じ「セキュリティ モデル」を共有し、相互に信頼し、調和することで、人間によるバグの可能性を最大限に排除します。
Unsafe Rust は、Rust のセキュリティ境界です。世界の本質は安全ではありません。それを避けることはできません。 Unsafe Rust の存在により、必ずしも C/C++ より安全ではないという人もいます。 Unsafe Rust は確かに C/C++ と同じで、その安全性を確保するのは人にかかっています。しかし、人々にはより高い要求が課せられます。
また、開発者に安全でない境界を与えますが、これは実際にはセキュリティ境界です。コード内の地雷原を明示的にマークします。チームコードでレビューすると、問題をより早く見つけることができます。これ自体が一種のセキュリティです。 C++ とは対照的に、Rust のような明らかな境界 (安全でないブロック) がないため、作成するコードのすべての行は安全ではありません。
以下は、誰もがトレードオフできるように、Unsafe を使用するための 5 つの簡単な仕様をまとめたものです。
Safe Rust を使用できる場合は、Safe Rust を使用してください。
Unsafe Rust はパフォーマンスのために使用できます。
Unsafe Rust を使用する場合は、UB を生成しないように注意し、そのセキュリティ境界を判断して Safe メソッドとして抽象化するようにしてください。
安全として抽象化できない場合は、安全でないとしてマークし、UB を生成するための条件付きドキュメントを伴う必要があります。
安全でないコードについては、レビューに集中できます。
ただし、Rust コミュニティ エコロジーには Rust セキュリティ ワーキング グループがあり、貨物監査 [11] などの一連のツールを提供し、「RustSecurity」セキュリティ データベース ライブラリに記録されている Rust エコロジー コミュニティで見つかったセキュリティ問題を管理しています。 [12]。 Rustプロジェクトの依存ライブラリのセキュリティ問題を確認するのに便利です。
MDNICEエディター
生産力
プログラミング言語の生産性は、次の 3 つの側面によって評価できます。
学習曲線。
言語エンジニアリング能力。
ドメインの生態学。
学習曲線
学習曲線は個人のレベルに応じて高くも低くもなります。以下はRustの基礎を学ぶ上で注意すべき箇所のリストです。
完全にゼロベースの開発者: 基本的なコンピュータ システムの知識構造を習得し、Rust 言語とハードウェア/OS 層の抽象化を理解し、Rust 言語の中心概念とその抽象モードを理解し、Rust 言語の特定の適用可能な分野を選択します。実践的なトレーニング: ドメイン知識を習得しながら、実践を通じて Rust 言語の習熟度を向上させ、理解の深さを高めます。
C 言語の基礎: C 言語開発者は高級言語の抽象化を十分に理解していないため、所有権のセマンティクス、ライフサイクル、借用チェックなど、Rust の所有権メカニズムを理解して習得することに重点を置いています。 Rust 言語の抽象パターン、主に型と特性、および Rust 自体の OOP と関数型言語の機能を理解します。
C++ の基礎: C++ 開発者は Rust 言語の所有権をよく理解しており、Rust の抽象パターンと関数型言語の機能に重点を置いています。
Java/Python/Ruby の基礎を持ちます。Rust の所有権メカニズム、抽象パターン、関数型プログラミング言語の機能を理解して克服することに重点を置きます。
Go の基礎: Go 言語開発者にとって、Rust の型と特性の抽象化パターンを理解するのは簡単ですが、Go は GC 言語でもあるため、所有権メカニズムと関数型言語の機能が学習の焦点となります。
Haskell の基礎を持っている: Haskell 開発者は Rust 言語の機能的特徴をよく理解しており、主に所有権メカニズムと OOP 言語機能を克服しています。
したがって、一定の基礎を備えた開発者にとって、Rust 言語を学習する際に習得すべき重要な概念は次のとおりです。
1. Rust の所有権メカニズム (所有権セマンティクス、ライフサイクル、借用チェックなど)
所有権メカニズムは Rust 言語の中核機能です。ガベージ コレクション メカニズムなしでメモリの安全性が保証されます。したがって、GC に慣れている開発者にとって、Rust の所有権を理解することは最も重要な部分です。次の 3 つの点を覚えておいてください:
Rust のすべての値には、その所有者と呼ばれる変数があります。
値の所有者は 1 人だけです。
所有者 (変数) がスコープ外になると、この値は破棄されます。これには、ライフサイクルや借入小切手などの概念も関係しますが、これは比較的難しい問題です。
2. Rust言語の抽象モード、主に型と特性。特性は、Haskell の Typeclass から借用しています。これは型の動作の抽象化であり、他のプログラミング言語のインターフェイスとよく比較されます。型が提供する必要がある関数型言語の機能をコンパイラーに指示します。使用する場合は一貫性を保つ必要があり、競合する実装を定義することはできません。
3. OOP言語機能。オブジェクト指向プログラミング (OOP) の 4 つの共通機能 (オブジェクト、カプセル化、継承、ポリモーフィズム) に精通していると、impl、pub、trait などの Rust のいくつかの機能をよりよく理解できるようになります。
4. 関数型言語の機能。 Rust言語の設計は関数型プログラミングの影響を深く受けていますが、関数型プログラミング言語の最大の特徴は計算処理を入れ子の関数の連続として書くことなので、関数型の特徴を見ると数学が苦手な人は敬遠してしまうかもしれません。 Rust では、クロージャとイテレータをマスターすることが、関数型言語スタイルで高性能の Rust コードを記述する重要な部分です。
言語エンジニアリング能力
Rust は、工業用に強力な製品を開発する準備ができています。
安全性を確保するために、Rust は強力な型システムと所有権システムを導入しています。これにより、パフォーマンスを犠牲にすることなく、メモリの安全性だけでなく同時実行性の安全性も保証されます。
ハードリアルタイムシステムのサポートを確実にするために、Rust は C++ から決定論的デストラクター、RAII、スマート ポインタを借用して自動かつ決定論的メモリ管理を行い、それによって GC の導入を回避するため、「ワールド一時停止」問題は発生しません。これらの項目は C++ から借用されたものですが、C++ よりも使用が簡潔です。
プログラムの堅牢性を確保するために、Rust はエラー処理メカニズムを再検討しました。日々の開発においては、通常、障害、エラー、例外の 3 種類の異常事態が発生します。ただし、C のようなプロセス指向言語では、開発者は戻り値や goto などのステートメントを通じてのみエラーを処理でき、統一されたエラー処理メカニズムはありません。 C++ や Java などの高級言語では例外処理メカニズムが導入されていますが、通常のロジックとエラー ロジックを効果的に区別できる構文は特に提供しておらず、それらをグローバルに処理するだけであるため、開発者はすべての異常な状況を例外として扱うことになります。それは堅牢なシステムの開発には役に立ちません。また、例外処理は比較的大きなパフォーマンスのオーバーヘッドももたらします。
Rust言語では、これら3種類の異常事態に対して特別な処理方法が用意されており、開発者が状況に応じて選択できるようになっています。
失敗した場合には、アサーション ツールを利用できます。
エラーについては、Rust は戻り値に基づいて階層化されたエラー処理メソッドを提供します。たとえば、Option は null 値が存在する可能性がある状況を処理するために使用できますが、Result は、合理的に解決でき、解決する必要があるエラーを処理するために特に使用されます。伝播した。
Rustでは例外を合理的に解決できない問題とみなし、例外発生時にスレッドを安全に終了できるスレッドパニック機構を提供しています。
このような絶妙な設計により、開発者は異常な状況をより細かい粒度で合理的に処理し、最終的にはより堅牢なシステムを作成できるようになります。
柔軟なアーキテクチャ機能を提供するために、Rust はゼロコスト抽象化の基礎として特性を使用します。特性は継承ではなく合成を指向しているため、開発者は密結合システムと疎結合システムを柔軟に設計できます。 Rust には、型の抽象化を表現するためのジェネリックスも用意されており、トレイト機能と組み合わせることで、静的ポリモーフィズムとコードの再利用が可能になります。ジェネリックスとトレイトを使用すると、さまざまな設計パターンを柔軟に使用してシステム アーキテクチャを再形成できます。
強力な言語拡張機能と開発効率を提供するために、Rust にはマクロベースのメタプログラミング メカニズムが導入されています。 Rust は、宣言型マクロと手続き型マクロの 2 種類のマクロを提供します。マクロの宣言の形式はCのマクロ置換に似ていますが、Rustがマクロ展開後にコードをチェックする点が異なり、セキュリティの面ではこちらの方が有利です。プロシージャル マクロは、Rust にコードの再利用とコード生成における強力な機能を提供します。
既存のエコシステムとうまく統合するために、Rust は非常に便利でゼロコストの FFI メカニズムをサポートし、C-ABI と互換性があり、Rust 言語を言語アーキテクチャ レベルから Safe Rust と Unsafe Rust に分割します。その中でも、Unsafe Rust は、オペレーティング システム カーネルなどの外部システムの処理に特化しています。この分割の理由は、Rust コンパイラの検査と追跡には限界があり、他の外部言語インターフェイスのセキュリティ状況を確認することは不可能であり、開発者自身が保証するしかないためです。 Unsafe Rust は、安全でないキーワードと安全でないブロックを提供します。これらは、外部インターフェイスにアクセスする安全なコードと安全でないコードを明示的に区別し、開発者がエラーをデバッグする際の利便性も提供します。安全な Rust は、開発者がコンパイル時に安全性を確保するコンパイラを信頼することを意味し、安全でない Rust は、コンパイラが開発者の安全性を確保する能力を信頼することを意味します。
人がいるところには虫もいます。 Rust言語の精緻な設計により、マシンがチェック・制御できる部分はコンパイラに実行が渡され、マシンが制御できない部分は開発者自身に渡されます。 Safe Rust が保証するのは、コンパイラがコンパイル時にメモリの安全性を最大限に高め、未定義の動作が発生するのを防ぐことです。 Unsafe Rust は、現時点で開発されたコードが未定義の動作を引き起こす可能性があることを開発者に警告するために使用されます。注意してください。人間とコンパイラは同じ「セキュリティ モデル」を共有し、相互に信頼し、調和することで、人間によるバグの可能性を最大限に排除します。
開発者同士の共同作業を容易にするために、Rust は非常に便利なパッケージ マネージャー Cargo[13] を提供します。 Rust コードはパッケージ (クレート) に基づいてコンパイルおよび配布されます。Cargo には、開発者が独自のパッケージを作成、構築、配布、管理できるようにするための多くのコマンドが用意されています。 Cargo は、開発者がより多くのニーズを満たすカスタム プラグインを作成するのに便利なプラグイン メカニズムも提供します。たとえば、公式のrustfmtツールとclippyツールを使用すると、コードを自動的にフォーマットしたり、コード内の「悪臭」を検出したりできます。別の例として、Rustfix ツールは、開発者がコンパイラの提案に基づいて誤ったコードを自動的に修正するのにも役立ちます。 Cargo はオープン ソース コミュニティと Git も自然に受け入れており、作成したパッケージを他のユーザーが使用できるように、ワンクリックで crates.io Web サイトに公開することもサポートしています。
開発者が Rust を学びやすくするために、公式 Rust チームは次のような取り組みを行っています。
専用のコミュニティ ワーキング グループを分離し、公式 Rust Book や、コンパイラ ドキュメント、nomicon ブックなどのさまざまな深さの他のドキュメントを作成します。無料のコミュニティ教育イベント「Rust Bridge」を主催したり、コミュニティのブログを強く奨励したりすることもできます。
Rust 言語のドキュメントは Markdown 形式をサポートしているため、Rust 標準ライブラリのドキュメントは表現力が豊富です。エコシステム内の多くのサードパーティ パッケージのドキュメントの表現力も向上しました。
開発者がコードを学習、使用、共有するための非常に便利なオンライン Playground ツールを提供します。
Rust 言語は非常に早い段階でブートストラップされているため、学習者はソース コードを読んで内部メカニズムを理解し、さらにはコントリビューションに参加することもできます。
Rust コアチームは継続的に Rust を改善し、Rust の使いやすさを改善し、初心者の精神的負担を軽減し、学習曲線を遅らせることに努めてきました。たとえば、NLL 機能を導入して借用チェック システムを改善すると、開発者はより直感的なコードを作成できるようになります。
Haskell から型システムに関連する多くのコンテンツを借用していますが、Rust チームは、Rust の概念を人々がより理解しやすいものにするために、言語機能を設計および推進する際に、意図的に非学術的になります。
型システムに基づいて、混合プログラミング パラダイムのサポートを提供し、強力で簡潔な抽象表現機能を提供し、開発者の開発効率を大幅に向上させます。
Rust 開発者が開発効率を向上できるようにするために、Rust コミュニティは強力な IDE サポートも提供します。 VSCode/Vim/Emacs + Rust Analyzer は Rust 開発の標準となっています。もちろん、JetBrains ファミリーの IDEA/Clion も Rust を強力にサポートしています。
MDNICEエディター
Rustとオープンソース
オープンソース プロジェクト自体として、Rust 言語は現代のオープンソース ソフトウェアにおいて輝く真珠でもあります。
Rust より前に生まれた言語はすべて商業開発のみに使用されていましたが、Rust 言語はこの状況を変えました。 Rust 言語の場合、Rust オープンソース コミュニティも言語の一部です。同時に、Rust 言語もコミュニティに属しています。
Rust チームは Mozilla メンバーと Mozilla 以外のメンバーで構成されており、これまでに 1,900 人を超える貢献者が Rust プロジェクトに貢献しています。 Rust チームはコア グループとその他のドメイン ワーキング グループに分かれており、Rust 2018 の目標に向けて、組み込みワーキング グループ、CLI ワーキング グループ、ネットワーク ワーキング グループ、WebAssembly ワーキング グループに分かれています。エコシステムワーキンググループやコミュニティワークグループなどとして。
これらの分野のデザインは最初に RFC プロセスを通過しますが、RFC プロセスを通過する必要のない一部の変更については、Rust プロジェクト ライブラリにプル リクエストを送信するだけで済みます。すべてのプロセスはコミュニティに対して透明であり、コントリビューターもレビューに参加できますが、最終的な意思決定権はコア グループと関連フィールド ワーキング グループにあります。その後、FCP プロセスを合理化するために、MCP も導入されました。
Rust Foundation の設立後、Rust チームは常に新しいオープンソース ガバナンス ソリューションを模索しています。
MDNICEエディター
Rust言語の弱点
Rustには多くの利点がありますが、確かにいくつかの欠点もあります。
Rustのコンパイルが遅い。 Rust関係者は、増分コンパイルのサポート、新しいコンパイルバックエンド(クレーンリフト)の導入、並列コンパイル、その他の手段を含めて、Rustのコンパイル速度を改善してきましたが、まだ遅いです。また、増分コンパイルには現在バグがあります。
学習曲線は急勾配です。
Rust 言語に特有のメモリ安全性の問題を検出するさまざまなツールが不足しています。
MDNICEエディター
Rustのエコロジーベースライブラリとツールチェーン
Rust エコシステムはますます豊富になってきています。多くの基本的なライブラリとフレームワークが crates の形で crates.io[14] にリリースされます。これまでのところ、crates.io には 62,981 のクレートがあり、総ダウンロード数は次のとおりです。 76億5,497万3,261回。
パッケージの使用シナリオ別に分類すると、Crates.io の最も一般的なシナリオは次のとおりです。
コマンドラインツール (3133 クレート)
標準ライブラリなし (2778 クレート)
開発ツール (テスト/デバッグ/リンティング/パフォーマンス検出など、2652 クレート)
Web プログラミング (1776 クレート)
API バインディング (http API、ffi 関連 API など、Rust 用の特定の API パッケージ、1738 クレート)
ネットワーク プログラミング (1615 クレート)
データ構造 (1572 クレート)
組み込み開発 (1508 クレート)
暗号化テクノロジー (1498 クレート)
非同期開発 (1487 クレート)
アルゴリズム (1200 クレート)
科学計算 (物理学、生物学、化学、地理学、機械学習などを含む、1100 個のクレート)
さらに、WebAssembly、エンコーディング、テキスト処理、同時実行、GUI、ゲーム エンジン、視覚化、テンプレート エンジン、パーサー、オペレーティング システム バインディング、および多くのライブラリなどの他のカテゴリもあります。
よく使用されるよく知られた基本ライブラリとツール チェーン
その中には、優れた基本ライブラリが多数登場しており、 crates.io のホームページで見ることができます。以下にいくつか挙げます。
シリアル化/逆シリアル化: Serde[15]
コマンドライン開発: clap[16]/structopt[17]
非同期/Web/ネットワーク開発: tokio [18] / tracing [19] / async-trait [20] / tower [21] / async-std [22] tonic [23] / actix-web [24] / smol [25] ] ]/surf[26]/async-graphql[27]/warp/[28]タングステン[29]/encoding_rs[30]/loom[31]/Rocket[32]
FFi 開発: libc [33]/winapi [34]/bindgen [35]/ pyo3 [36]/ num_enum [37]/ jni [38]/rusler_sys[39]/ cxx [40]/ cbindgen [41]/ autocxx-ビンゲン [42]
API 開発: jsonwebtoken [43]/ validator [44]/ tarpc [45]/ nats [46]/ tonic[47]/ protobuf [48]/ hyper [49]/ httpparse [50]/ reqwest [51] / url [ 52】
パーサー: nom[53]/pest[54]/csv[55]/combine[56]/wasmparser[57]/ron[58]/lalrpop[59]
WebAssembly: wasm-bindgen[67]/ wasmer [68]/ wasmtime [69]/ yew [70]
暗号化: openssl [60] / リング [61] / hmac [62] / Rustls [63] / orion [64] / themis [65] / RustCrypto [66]
データベース開発:diesel [71]/sqlx [72]/rocksdb [73]/mysql [74]/elasticsearch [75]/rbatis [76]
同時実行:crossbeam [77]/ parking_lot [78]/crossbeam-channel [79]/ rayon [80]/ concurrent-queue[81]/ threadpool [82] / flume [83]
組み込み開発:embedded-hal [84]/cortex-m [85]/bitvec [86]/cortex-m-rtic [87]/embedded-dma [88]/cross [89]/ローレットツール[90]
テスト: static_assertions [91] / 差分 [92] / クイックチェック [93] / 任意 [94] / モックオール [95] / 基準 [96] / proptest [97] / ターポリン [98] / フェイク RS [99]
マルチメディア開発:rust-av[100]/image[101]/svg[102]/rusty_ffmpeg[103]/Symphonia[104]/"rapier") / Rustcraft[115] Nestadia[116]/ naga[117]/ Bevy Retro[118]/ Texture Generator[119] / building_blocks[120] / rpg-cli [121]/ macroquad[122]
TUI/GUI 開発: winit [123]/ gtk [124]/ egui [125]/ imgui [126]/ yew [127]/ cursive [128]/ Iced [129]/ fontdue [130]/ tauri [131]/ドルイド僧 [132]
MDNICEエディター
錆び業界のアプリケーション一覧
Rust は汎用の高級システムレベルプログラミング言語であり、その応用分野は基本的に C/Cpp/Java/Go/Python の応用分野を同時にカバーできます。
国内外の様々な分野のRustプロジェクトを棚卸してみましょう。コード量、チーム規模、プロジェクトサイクルに関するデータを提供することで、誰もがRust分野のアプリケーションや開発効率をより直感的に理解できるようになれば幸いです。
MDNICEエディター
データサービス
データ サービスの分野には、データベース、データ ウェアハウジング、データ ストリーム、ビッグ データなどが含まれます。
キーワード: データベース / 分散システム / CNCF
導入
導入
TiKV [133] は、オープンソースの分散型トランザクション Key-Value データベースであり、次世代データベース向けに信頼性が高く、高品質で実用的なストレージ アーキテクチャを提供することに重点を置いています。 TiKV は当初 PingCAP チームによって開発され、Zhihu、Yidian、Shopee、Meituan、JD Cloud、Zhuanzhuan およびその他の多くの業界の大手企業で導入され、適用されてきました。
TiKV は、Raft コンセンサス アルゴリズムを使用して、データの複数のコピー間の一貫性を実現します。RocksDB ストレージ エンジンは、データの保存にローカルに使用されます。同時に、TiKV は自動データ セグメント化と移行をサポートします。 TiKV の銀行間トランザクションは、当初 Google Percolator トランザクション モデルを参照しており、スナップショット分離とロック付きスナップショット分離を提供し、分散トランザクションをサポートするためにいくつかの最適化が行われています。
2018年8月にCNCFよりサンドボックスクラウドネイティブプロジェクトとして採択されたことが発表され、2019年5月にサンドボックスからインキュベーションプロジェクトに昇格しました。
コードとチームの規模
TiKV プロジェクトには、約 300,000 行の Rust コード (テスト コードを含む) が含まれています。
TiKV はグローバルなオープンソース プロジェクトであり、チームの規模は貢献者のリストから確認できます [134]。 TiKV 組織にはいくつかの Go/Cpp プロジェクトも含まれていますが、これは含まれておらず、Rust プロジェクトに関与した人員の数のみがカウントされます。
主な開発人数:約20名。
コミュニティへの貢献: 300 人以上。
プロジェクトサイクル
TiKV は、TiDB の進化後の TiDB の基盤となるストレージです。 TiDB は Go 用に開発され、TiKV は Rust 用に開発されました。
2016 年 1 月に、TiDB の基盤となるストレージ エンジンとして設計および開発されました。
最初のバージョンは 2016 年 4 月にオープンソースとしてリリースされました。
2017 年 10 月 16 日に、TiDB は GA バージョン (TiDB 1.0) をリリースし、TiKV は 1.0 をリリースしました。
2018 年 4 月 27 日に、TiDB はバージョン 2.0 GA をリリースし、TiKV はバージョン 2.0 をリリースしました。
2019 年 6 月 28 日に、TiDB はバージョン 3.0 GA をリリースし、TiKV はバージョン 3.0 をリリースしました。
2020 年 5 月 28 日に、TiDB は 4.0 GA バージョンをリリースし、TiKV は 4.0 をリリースしました。
2021 年 4 月 7 日に、TiDB はバージョン 5.0 GA をリリースし、TiKV はバージョン 5.0 をリリースしました。
コメント
友人の中には、Rust の開発効率にもっと関心があり、特に C/Cpp/Go などの他の言語の開発効率を比較するために、それを定量化したいと考えている人もいるかもしれません。
個人的には、特に他の言語と比較して、開発効率を数値化するのは非常に難しいと考えています。この問題を別の角度から、たとえばアジャイルなプロジェクト反復管理の観点から見てみるのもよいでしょう。言語がアジャイル開発反復の日々のニーズを満たし、製品の進化を完了するのに役立つのであれば、この言語の開発効率を説明するには十分です。
PingCAP の Go 開発者の数は Rust 開発者の 4 ~ 5 倍であり、当然のことながら作業負荷はほぼ同じであることがわかります。上記のデータから、Rust プロジェクト (TiKV) が Go プロジェクト (TiDB) の反復リズムに引き続き対応できることがわかります。これは、Rust の開発効率が現代の開発のニーズを満たすのにまだ十分であることを示しています。
キーワード: リアルタイム データ ウェアハウス / 起業家精神 / エンジェル ラウンド
導入
導入
TensorBase[135] は、2020 年 8 月に Jin Mingjian 博士によって立ち上げられた起業家プロジェクトです。オープンソースの文化と手法を使用して、新しい現代的な視点から始まり、大量データの時代に対応するために Rust の下でリアルタイム データ ウェアハウスを再構築します。データの保存と分析。 TensorBase プロジェクトは、世界的に有名なベンチャーキャピタルアクセラレーターからエンジェルラウンド投資を受けています。
コードとチームの規模
TensorBase は Apache Arrow[136] と Arrow DataFusion[137] の上に構築されているため、コード統計にはこれら 2 つのプロジェクトの依存関係が除外されます。
TensorBase のコア コード行は 54000 行を超えています。
チームの規模:
メイン開発:1名。
地域貢献者:13名。
新しいプロジェクトであるため、オープンソース コミュニティはまだ構築中です。
プロジェクトサイクル
TensorBase は、セマンティック バージョンではなく、時間ベースで公開します。イテレーション サイクルは、メジャー バージョンが 1 年で、マイナー バージョンが 1 月になる予定です。
2021 年 4 月 20 日の正式リリースから最新の 6 月 16 日まで、このリズムを維持してください。
キーワード: データフロー/分散システム/起業家精神
導入
導入
Timely Dataflow[138] は、Microsoft の Timely Dataflow 論文「Naiad: A Timely Dataflow System」[139] に基づいた最新の Rust 実装です。これは、Clockworks.io 社のオープンソース製品です [140]。
分散システムでストリーミング データに対して複数の反復や増分計算などの複雑な処理を実行することは非常に困難です。 Storm、Streaming Spark、および MillWheel は、さまざまなアプリケーションの複雑なニーズに十分に適合していません。タイムスタンプの概念を導入することにより、Naiad は任意の複雑なストリーム コンピューティングを記述するために使用できる非常に低レベルのモデルを提供します。
データフロー システムは包括的なものであり、MapReduce と Spark がその代表とみなすことができます。タイムリーなデータフローは、完全に時間ベースの抽象化を提供し、ストリーム コンピューティングと反復コンピューティングを統合します。 Timely Dataflow は、ストリーミング データの並列処理と反復制御が必要な場合に使用できます。
コードとチームの規模
Rustのコードサイズは約13000行です。
チームの規模:
主な開発者:4名。
コミュニティへの貢献: 30 人以上。
プロジェクトサイクル
2017 年 9 月 7 日、バージョン 0.3.0。
2018 年 6 月 28 日、バージョン 0.6.0。
2018 年 9 月 16 日、バージョン 0.7.0。
2018 年 12 月 3 日、バージョン 0.8.0。
2019 年 3 月 31 日、バージョン 0.9.0。
2019 年 7 月 10 日、バージョン 0.10.0。
2021 年 3 月 10 日、バージョン 0.12.0。
基本的に、小規模バージョンは 3 か月ごとにリリースされます。Timely Dataflow に加えて、チームは Timely Dataflow 上に構築された Differential Dataflow[141] も保守しており、Timely Dataflow と同期して反復されます。
キーワード: データベース/学術論文プロジェクト
導入
導入
Noria [142] は、MIT Jon Gjengset の博士論文 [143] に基づいて高負荷 Web アプリケーション用の高速ストレージ バックエンドとして設計された新しいストリーミング データフロー システムです。OSDI'18 論文 [145] でも参照されています。これはデータベースに似ていますが、クエリを高速化するために、リレーショナル クエリ結果の事前計算とキャッシュをサポートしています。 Noria は、キャッシュされた結果を基になるデータとして自動的に保持し、永続的な基になるテーブルに保存します。 Noria は部分的にステートフルなデータフローを使用してメモリのオーバーヘッドを削減し、動的なランタイム データフローとクエリの変更をサポートします。
コードとチームの規模
Rustのコード行数は約59000行です。
チームの規模:
主な投稿者: 2 人
コミュニティ貢献者: 21 人
プロジェクトサイクル
個人的な学術研究プロジェクトであるため、リリースサイクルはそれほど明確ではありません。
プロジェクト サイクルは 2016 年 7 月 30 日から 2020 年 4 月 30 日までで、コミット数は合計 5,000 件を超えています。
ベクター (海外/オープンソース/データ パイプライン)
キーワード: データパイプライン / 分散システム / 起業家精神
Vector[146] は、Timer によって構築された高性能のエンドツーエンド (ブローカーおよびアグリゲーター) 可観測性データ パイプラインです。これはオープンソースであり、この分野のすべての代替手段 (Logstash、Fluentd など) よりも 10 倍高速です。現在、Douban、checkbox.ai、fundamentei、BlockFi、Fly.io などの企業が Vector を使用しています。公式パフォーマンスレポートについてはここ [147] をクリックし、実稼働環境で Vector を使用している企業についてはここ [148] をクリックしてください。
コードとチームの規模
コード量はRustコードで約18万行。
チームの規模:
主な開発者:9名
地域貢献:140名
プロジェクトサイクル
2019 年 3 月 22 日に初期バージョンがリリースされました。
2019年6月10日、バージョン0.2.0がリリースされました
2019 年 7 月 2 日、バージョン 0.3.0 リリース
2019 年 9 月 25 日、バージョン 0.4.0 リリース
2019年10月11日、バージョン0.5.0がリリースされました
2019年12月13日、バージョン0.6.0がリリースされました
2020年1月12日、バージョン0.7.0がリリースされました
2020年2月26日、バージョン0.8.0がリリースされました
2020 年 4 月 21 日、バージョン 0.9.0 リリース
2020年7月23日、バージョン0.10.0がリリースされました
2021年3月12日、バージョン0.11.0~0.12をリリース予定
2021 年 4 月 22 日、バージョン 0.13.0 リリース
2021 年 6 月 3 日、バージョン 0.14.0 リリース
Arrow-rs (外国/オープンソース/ビッグデータ標準)
キーワード: ビッグデータ/データフォーマット規格/Apach
arrow-rs[149] は Apache Arrow の Rust 実装です。 Apache Arrow は、異種ビッグ データ システムに適したインメモリ列ストレージ データ形式標準です。同社には非常に大きなビジョンがあります。それは、インメモリ分析のための開発プラットフォームを提供し、異種ビッグ データ システム間でのデータのより高速な移動と処理を可能にすることです。
Arrow はバージョン 2.0 から Rust[150] を導入し、バージョン 4.0 以降、Rust 実装は独立したウェアハウス arrow-rs に移行しました。
Arrow の Rust 実装は、実際には、次の個別のクレートとライブラリを含む、いくつかの異なるプロジェクトで構成されています。
arrow[151]、arrow-rs コア ライブラリ。arrow-rs に含まれています。
arrow-flight [152]。arrow-rs コンポーネントの 1 つで、arrow-rs に含まれています。
arrow-rs コンポーネントの 1 つである parquet[153] は arrow-rs に含まれています。ビッグ データ エコシステムでは、Parquet が最も人気のあるファイル ストレージ形式です。
スケーラブルなインメモリ クエリ実行エンジンである DataFusion [154] は、形式として Arrow を使用します。
Ballista [155] は、Apache Arrow と DataFusion を利用した分散コンピューティング プラットフォームであり、DataFusion に含まれています。
コードとチームの規模
arrow-rs の関連コンポーネントを合計すると、Rust コードの量は約 180,000 行になります。
チームの規模:
主な開発者:約10名
コミュニティへの貢献: 550 人以上
プロジェクトサイクル
DataFusion プロジェクトは 2016 年に構築を開始し、後に Apache Arrow プロジェクトに加わりました。
arrow-rs 4.0 以降:
2021 年 4 月 18 日に、バージョン 4.0 がリリースされました。
2021 年 5 月 18 日に、バージョン 4.1 がリリースされました。
2021 年 5 月 30 日に、バージョン 4.2 がリリースされました。
2021 年 6 月 11 日に、バージョン 4.3 がリリースされました。
InfluxDB IOx (海外/オープンソース/時系列データベース)
キーワード: 時系列データベース / 分散
InfluxDB の次世代タイミング エンジンである InfluxDB IOx[156] は、Rust + Aarow を使用して書き直されました。
既存の設計には主に次の致命的な問題があります。
タイムラインの膨張の問題が解決できない
クラウドネイティブ環境では、メモリ管理要件が比較的厳しいため、mmap は適用できなくなり、InfluxDB はローカル ディスクを使用しない動作モードをサポートする必要があります。
インデックスとデータが別々に保存されるため、効率的なデータのインポートおよびエクスポート機能を実現するのが困難
上記の 3 つの問題は既存の設計の中核であるため、現在のニーズをサポートするには書き直す方が良い選択です。
コードとチームの規模
InfluxDB IOx コードのサイズは、Rust コードで約 160,000 行です。
チームの規模:
主な開発者:5名
地域貢献:24名
プロジェクトサイクル
このプロジェクトは 2019 年 11 月に開始されましたが、現時点ではプロジェクトは非常に初期段階にあり、テストの準備ができておらず、ビルドやドキュメントもありません。
しかし、GitHub の活動状況から判断すると、開発状況は依然として非常に活発です。大規模な開発作業は 2021 年に開始される予定です。
キーワード: 時系列データベース
導入
導入
CeresDB は、Ant Group によって開発された TP/AP 融合時系列データベースであり、財務タイミング、モニタリング、IOT などにおける大量の時系列データの保存、多次元クエリのドリルダウン、リアルタイム分析のニーズを満たします。シナリオ。オープンソース計画はありますが、まだオープンソースではありません。
チームの規模
現在データベース開発に携わる人数は8~10名ほどです。
その他の情報は不明です。
Tantivy (外国語/オープンソース/全文検索)
キーワード: 全文検索 / ルシーン
Tantivy[157] は、Apache Lucene からインスピレーションを得た全文検索エンジン ライブラリであり、Rust で実装されています。
Tantivy は素晴らしいです。Rust + Tantivy + AWS で構築されたアプリは次のとおりです。10 億件の Web 検索を処理し、一般的な単語のクラウドを生成します [158]。
コードとチームの規模
コードサイズはRustコードで約50000行です。
チームの規模:
主な開発:1名
地域貢献:85名
プロジェクトサイクル
このプロジェクトは 2016 年に設立され、平均して月に 1 回のマイナー バージョン リリースが繰り返され、現在はバージョン 0.15.2 までリリースされています。
キーワード: Zhihu / ルシーン
導入
導入
Rucene[159] は、Zhihu チームによってオープンソース化された Rust ベースの検索エンジンです。 Rucene は完全なアプリケーションではありませんが、全文検索機能をアプリケーションに簡単に追加するために使用できるコード ライブラリと API です。これは、Apache Lucene 6.2.1 プロジェクトの Rust ポートです。
コードとチームの規模
コードサイズはRustコードで約10万行です。
チームの規模:
主な開発者:4名
コミュニティ貢献:0名
これは、会社の内部プロジェクトがオープンソースであり、現時点では特定のセマンティック バージョンが反復されていないことが原因である可能性があります。 Zhihu の実稼働環境で使用されます。
MDNICEエディター
クラウドネイティブ
クラウド ネイティブ分野には、機密コンピューティング、サーバーレス、分散コンピューティング プラットフォーム、コンテナ、WebAssembly、運用および保守ツールなどが含まれます。
StratoVirt(国産/オープンソース/コンテナ)
キーワード: コンテナ / 仮想化 / サーバーレス
StratoVirt[160] は、Huawei OpenEuler チームによって開発された次世代の Rust ベースの仮想化プラットフォームです。
Stratosphere は成層圏から取られ、地球の大気中の成層圏を意味し、大気は地球を外部環境から保護することができ、成層圏は大気中で最も安定した層です。同様に、仮想化テクノロジはオペレーティング システム プラットフォーム上にあります。上位レベルの悪意のあるアプリケーションによる損傷からオペレーティング システム プラットフォームを保護するだけでなく、通常のアプリケーションに安定した信頼性の高い動作環境を提供することもできます。Strato という名前は、システム上でのサービスのスムーズな動作を保護する、薄くて軽い保護層を意味します。オープンオイラープラットフォーム。同時に、Strato はプロジェクトのビジョンと将来性、つまり軽量、柔軟、安全で完全な保護機能も担っています。
StratoVirt は、コンピューティング業界のクラウド データ センター向けのエンタープライズ レベルの仮想化プラットフォームです。仮想マシン、コンテナ、およびサーバーレス シナリオをサポートする統合アーキテクチャを実現します。軽量、低ノイズ、ソフトウェアとハードウェアのコラボレーションで主要なテクノロジー コンペティションを行っています。とセキュリティ。利点。 StratoVirt は、アーキテクチャ設計およびインターフェイスにおけるコンポーネント アセンブリの機能とインターフェイスを確保しており、標準の仮想化をサポートするように進化するまで、高度な機能をオンデマンドで柔軟に組み立てることができ、機能要件、アプリケーション シナリオ、軽さと機敏性の間の最適なバランスを見つけます。
コードとチームの規模
コードサイズはRustコードで約27000行です。
チームの規模:
主な開発者:4名。
コミュニティ貢献者: 15 人。
プロジェクトサイクル
2020 年 9 月 23 日、バージョン 0.1.0 をリリース。
2021 年 3 月 25 日、バージョン 0.2.0 をリリース。
2021 年 5 月 28 日、バージョン 0.3.0 をリリース。
爆竹(外国産・品)


