Go は中心的な概念の 1 つとして同時実行性に重点を置いています。 Rust では Go と同様の同時実行効果を実現できないというわけではありませんが、実装の難しさはプログラマにとっては試練のようなものです。 Go は、中心的な概念の 1 つとして同時実行性に重点を置いています。 Rust では Go と同様の同時実行効果を実現できないというわけではありませんが、実装の難しさはプログラマにとっては試練のようなものです。
大規模なアプリケーションや分散システムの場合、コードの実行速度は開発速度よりも重要ではないことがよくあります。無駄のない設計を意図的に強調する Go のような言語を使用すると、新しい開発者の 適応時間を短縮し、より迅速に参加できるようになります。大規模なコードベースに貢献するため。
GO 言語を使用すると、多くの場合、初級開発者にとっては生産性が向上しやすくなりますが、中級開発者にとっては複雑な抽象化を導入して問題を引き起こすことが難しくなります。この特性のため、エンタープライズ ソフトウェア開発の世界では、Rust は Go ほど魅力的ではない傾向があります。
— ロリス・クロ
大規模なソフトウェア開発では、美しさよりも明瞭さと読みやすさが常に重要です。 **実際、Go には制限があるため、Rust などのより複雑で強力な言語よりも Go が企業や大規模組織のニーズに適応しやすくなっています。 **
Rust と Go: 違い
Rust と Go はどちらも人気があり、広く使用されている現代言語ですが、おそらく完全に異なるユースケースをターゲットとしているため、実際の競合相手ではありません**。
Go でのプログラミングへの全体的なアプローチは Rust とはまったく異なり、これらの機能は一部の人には特に適していますが、一方で、他の人を完全にイライラさせる可能性があります。これは当然のことです。なぜなら、Rust と Go がどちらも基本的に同じ問題を基本的に同様の方法で解決しているのであれば、なぜ 2 つの異なる言語が必要なのでしょうか。
それでは、Rust と Go が採用しているアプローチから始めて、それぞれの本質を解釈できますか?一緒に試してみましょう。
Rust VS Go、2023 年に開発者はどちらの言語を選択すべきでしょうか?
出典: InfoQ
2023 年には、Rust を学ぶ理由がたくさんあります。
8 月 7 日、Rust Foundation は 2022 Rust 調査レポートの結果を発表しました。このレポートは、Rust の採用率が増加し続けていることを示しています。調査回答者の 90% 以上が Rust ユーザーであると回答しました。Rust は、コーディング作業の大部分は で行われており、前年比 51.8% の大幅な増加となっています。
Rust は、その優れたメモリ安全性と同時実行パフォーマンスにより、開発者の間でますます注目を集めていることは疑いの余地がありません。ただし、今年のプログラミング言語に選ばれたこともある比較的「ベテラン」のプレイヤーである Go を無視することもできません。
2009 年に誕生した Go 言語は、その独自の同時実行モデルと強力なパフォーマンス上の利点から大きな注目を集めています。 Rust言語と同様に、Go言語の作成者もC++を「嫌っ」ており、Goもクラウドネイティブの主流言語であることは注目に値します。
Stack Overflow 2022 開発者調査では、「人々に好き嫌いを与えるプログラミング言語」という質問に対する 70,000 の回答のうち、プログラマーは明らかに Rust を好み、そのうち 86% が Rust が好きだと答え、64% が Go が好きだと答えています。 Rust の熱い状況に直面して、一部の開発者は「2023 年になっても Go は学ぶ価値があるのか?」と自分の心に問いかけました。
さらに、ここ 2 日間で、Rust と Go のどちらを選択するかが Hacker News で話題になりました。
Rustを支持するネチズンは、「私もこの選択について長い間悩んできました。最終的にはRustが勝ちました。まず、Rustは以前のPascal時代のものに近く、すべてを制御できると感じています」と語った。 ; 2 番目に、もし wasm と関連テクノロジが大規模に発生した場合、Rust がより安全な選択となるでしょう; その場合、迅速な開発のための Python はすでにあるので、もう少し極端なものを選択するのは理にかなっていて、Go はやや中間点に位置します。最後に、Rust はコアと注目度の高いものに使用されるべきであるため、廃止される可能性は低いです。」
これに反対した別の開発者は、「私は 10 年近く Go で開発してきましたが、最近 Rust も試してみました。私の経験を含め、さまざまなスタートアップでの経験から、現在は Rust に対する必須かつ誤解を招きやすい好みがあると思います」と述べました。現在の言語では、バックエンド開発には Go が断然最良の選択です! パフォーマンス、機能などに注目してください...2 つの言語は非常によく似ています!」
Go と Rust はどちらも間違いなく優れたプログラミング言語であると言わざるを得ません。これらはモダンで強力、多用途で、優れたパフォーマンスを提供します。しかし、Go と Rust のどちらが優れているかを直接比較することは実際には意味がありません。各プログラミング言語にはその背後に一連の深いトレードオフがあるからです。言語が異なれば、ニーズに合わせて最適化されるため、言語を選択するときは、その言語を使用してどのような問題を解決したいのかも考慮する必要があります。そこで、Go 言語と Rust 言語の適用可能なシナリオから始めて、Go と Rust の設計の「方法」について説明します。
Rust と Go は構文とスタイルが大きく異なりますが、どちらもソフトウェアを構築するための第一級のツールです。以下、具体的な分析を始めましょう。
Go と Rust: 類似点
Rust と Go には多くの共通点があるため、人々はよくこの 2 つを比較します。彼らにはどんな共通の目標があるのでしょうか?
そして:
メモリの安全性
Go と Rust はどちらも、メモリの安全性を重視する最新のプログラミング言語の 1 つです。 C や C++ などの古い言語の数十年にわたる開発を通じて、エラーやバグの主な原因の 1 つは、メモリへの安全でない/不正なアクセスであることが明らかになりました。
そのため、Rust と Go はそれぞれ異なるソリューションを提供しましたが、両方の目標はメモリ管理の点でよりスマートかつ安全になり、開発者が優れたパフォーマンスを備えた正しいプログラムを作成できるようにすることです。
高速でコンパクトな実行可能ファイル
どちらもコンパイル言語であるため、プログラムを実行可能なマシン コードに直接変換できるため、プログラムを単一のバイナリ ファイルとして展開できます。 Python や Ruby のようなインタープリタ型言語とは異なり、インタープリタや多くのライブラリ/依存関係をプログラムに同梱する必要はありません。この核となる強みを直接反映して、Rust および Go プログラムはインタプリタ型言語よりも高速に実行される傾向があります。
汎用言語
Rust と Go はどちらも強力で拡張可能な汎用プログラミング言語であり、Web アプリケーションから分散マイクロサービス、組み込みマイクロコントローラー、モバイル アプリケーションなど、あらゆる種類の最新ソフトウェアの開発に使用できます。 **どちらも優れた標準ライブラリと活発なサードパーティ エコシステムに加え、強力な商用サポートと大規模なユーザー ベースを備えています。 **どちらも何年も前から存在しており、今後も繁栄し続けるでしょう。今では、Go や Rust を学ぶことは、非常に妥当な時間とエネルギーの投資となるでしょう。
実用的なプログラミング スタイル
どちらも過度に関数型の言語 (Scala や Elixir など) ではなく、完全なオブジェクト指向言語 (Java や C# など) でもありません。それどころか、Go と Rust はどちらも関数型プログラミングとオブジェクト指向プログラミングの機能を備えていますが、常に 実用的な方向性を強調しています。つまり、すべての人にプログラミングの使用を強制するのではなく、最も適切な方法で問題を解決するということです。 「イデオロギー」による具体的な方法、物事を行う方法。 **ただし、関数型プログラミングのスタイルが本当に気に入っている場合は、Rust 側にさらに関連ツールのオプションがあり、これが Go に対する Rust の利点の 1 つです。 **
大規模開発
Rust と Go はどちらも大規模なプログラミングに役立つ多くの機能を提供するため、どちらも大規模な開発チームや大規模なコード ベースの現実世界のニーズに適応できます。 **たとえば、C プログラマは、括弧をどこに置くか、コードをタブとスペースのどちらでインデントするかについて何年も議論してきましたが、Rust と Go はすでに標準の書式設定ツール (Go には gofmt、Rust It には Rustfmt) が使用されており、これらの問題は完全に解決されています。問題。準拠したスタイルを使用してコードを自動的に書き換えます。
この特定の形式が微妙というわけではありませんが、**Rust と Go のプログラマはより実用的であり、むしろ統一された実装標準を選択したいと考えています。 **
これら 2 つの言語のもう 1 つの大きな利点は、ビルド パイプラインに反映されています。どちらも、優れた組み込みのパフォーマンスの高い標準ビルドおよび依存関係管理ツールを備えています。これは、プログラマーが複雑なサードパーティのビルド システムに対処する必要がなく、数年ごとに新しいシステムを学習する必要もないことを意味します。
**錆びるか、なくなるか? **
非常に多くの問題について話し合った後、そして両方の言語が非常によく設計され強力であるという事実を踏まえて、このコンテストで何らかの結果は得られたでしょうか?あるいは、どちらも優れた選択肢であるにもかかわらず、なぜ人々は未だにソーシャルメディアで激怒し、「Rust はバカのためのものだ」とか「Go はまったくプログラミング言語ではない」といった厳しい言葉のような長い解説ブログ投稿を書いているのでしょうか?
もちろん、自分の感情を吐き出したいだけの人もいますが、これは明らかに実際の問題の解決には役立ちません。少なくとも、プロジェクトでどの言語を使用するか、またはプログラミングの世界に参入するためにどの言語を使用するかに関しては、大きな声が正しい選択をするのに役立たないのは明らかです。
大人の議論に戻って、合理的な分析のもとで Rust と Go にどのような長所と短所があるかを見てみましょう。
Go 対 Rust: パフォーマンス
前述したように、Go と Rust によって生成されたプログラムは、インタプリタや仮想マシンを経由せずにネイティブ マシン コードにコンパイルされるため、非常に高速に実行されます。しかし、Rust のパフォーマンスは依然として優れており、業界のパフォーマンス ベンチマークとして知られる C や C++ と比較しても遜色ありません。また、これらの昔ながらの言語とは異なり、Rust はメモリ安全性と同時実行性安全性のメカニズムも提供しますが、実行速度にはほとんど影響しません。 Rust を使用すると、開発者は実行時にパフォーマンスを犠牲にすることなく複雑な抽象化を構築できます。
対照的に、Go プログラムのパフォーマンスも優れていますが、設計では実行の程度ではなく、主に開発速度 (コンパイルを含む) に重点が置かれています。 Go プログラマーは明確で読みやすいコードを好むため、実行速度は少し遅くなります。
また、Go コンパイラーは、最も効率的なマシンコードの生成に多くの時間を費やすのではなく、大量のコードを迅速にコンパイルすることに重点を置いています。 **したがって、実行時のベンチマークでは、Rust プログラムが Go プログラムを圧倒することがよくあります。 **
Rust はガベージ コレクションを使用しないため、実行時のパフォーマンスも非常に安定しており、予測可能です。 Go のガベージ コレクターは非常に効率的で、一時停止時間をできるだけ短く保つように最適化されています (Go のリリースごとに一時停止時間は短くなります)。しかし、とにかく、ガベージ コレクションは常にプログラムの動作に予測不可能性をもたらします。これは、特定のアプリケーション (組み込みシステムなど) にとっては深刻な場合、またはまったく許容できない場合さえあります。
Rust の目標は、プログラマが基盤となるハードウェアを完全に制御できるようにすることであるため、**Rust プログラムを徹底的に最適化して、マシンの理論上の最大パフォーマンスに近づけることができます。 **このため、ゲーム プログラミング、オペレーティング システム カーネル、Web ブラウザ コンポーネント、リアルタイム制御システムなど、実行速度が他のすべてに優先する特定のユースケースでは、Rust が最適な選択肢となります。
プログラミング言語がどれほど強力であっても、習得が難しすぎてほとんどの人が遠ざかってしまうのであれば、意味がありません。 Go は、C++ などの複雑さが増す言語と区別するように意図的に設計されているようです。 ** Go には、構文、キーワードが非常に少なく、関数もあまりありません。 **
これは、Go 言語は学習しやすく、少し理解すれば、さまざまなプログラムを作成できることを意味します。
ここでのキーポイントは 「シンプルさ」 の 3 つの言葉です。もちろん、シンプルだからといって簡単というわけではありません。しかし、小さくて単純な言語は、大きくて複雑な言語よりも確実に習得が簡単です。 1 つの効果を実現する方法はそれほど多くないため、高品質の Go コードはほとんど常に同じに見えます。これにはもう 1 つの利点があります。馴染みのないサービスが何をしているのかをすぐに理解できるのです。
**Go のコア オントロジーは小さいですが、標準ライブラリは非常に強力です。 **つまり、Go 構文に加えて、学習曲線では標準ライブラリのこの部分も考慮する必要があります。
一方、言語から標準ライブラリに機能を移すということは、全員が現在の開発ニーズに関連するライブラリの学習だけに集中すればよいことを意味します。 **Go は大規模なソフトウェア開発のニーズを十分に考慮して設計されており、大規模なコード ベースと開発チームを強力にサポートできます。 **このタイプのシナリオでは、新しい開発者がすぐに開始できる必要があります。この目的を達成するために、Go コミュニティは常にプログラムの単純さ、明確さ、多用途性、直接性を優先してきました。
**Rust は、プログラマが少ないコードでより多くのことを実行できるようにする、さまざまな強力で便利な機能を組み込むように特別に設計されています。 **たとえば、Rust の match 関数を使用すると、柔軟で表現力豊かなロジックをすばやく作成できます。
しかし、Rust には多くの設計上の考慮事項があるため、特に初期段階では学習がより困難になります。しかし、それは問題ありません。結局のところ、C++ や Java には学ぶべきことがたくさんあり、メモリ安全性などの Rust の高度な機能さえ提供されていません。したがって、Rust の複雑すぎるサウンドを批判するのはまったく不合理です。Rust は 表現力と豊富な機能を強調するように設計されており、利点を活かしながらこれほどシンプルで純粋であることは期待できません。したがって、Rust には独自の学習曲線があります。しかし、この困難を乗り越えれば、必ず平坦な道が待っています。
**Rust と Go は相互にいくつかの機能 (ジェネリックなど) を借用していますが、Rust の機能の方がまだ優れており、Go の機能は比較的不足していると言っても過言ではありません。 **
ほとんどの言語は、同時プログラミング (つまり、複数の操作を同時に実行すること) に対して何らかの形でサポートを提供しますが、Go は最初からこのために設計されています。 **Go はオペレーティング システム スレッドを使用しませんが、軽量の代替手段である goroutines を提供します。 **各ゴルーチンは、独立して実行される Go 関数であり、Go スケジューラが制御下にあるオペレーティング システム スレッドの 1 つにマップします。つまり、スケジューラは、限られた数のオペレーティング システム スレッドのみを使用しながら、多数の同時ゴルーチンを非常に効率的に管理できます。
したがって、重大なパフォーマンス上の問題を引き起こすことを心配することなく、単一のプログラムで何百万もの goroutine を同時に実行できます。このため、**Go は、Web サーバーやマイクロサービスなどの大規模な同時アプリケーション シナリオに対する完全なソリューションです。 **
Go はゴルーチン用のチャネルも提供します。これは、データの通信と共有を行うための高速、安全、効率的な方法です。 Go の同時実行設計レベルは確かに非常に高く、使用エクスペリエンスは非常にリラックスしていて快適です。
一般に、並行プログラムの設計は非常に難しく、どの言語でも信頼性が高く正しい並行プログラムを構築することは決して簡単ではありません。ただし、この要件はプロジェクトの開始時に検討されて以来、Go の同時プログラミング メカニズムは可能な限りシンプルになり、適切に統合されました。
対照的に、Rust の同時実行メカニズムは登場したばかりで、まだ安定化していないため、皆さんは今後もこの積極的な開発の方向性に注目してください。たとえば、Rust の rayon ライブラリは、逐次計算を並列計算に変換できる非常にエレガントで軽量なメソッドを提供します。
Rust で同時実行プログラムを実装するのは簡単ではないかもしれませんが、それでも完全に実行可能であり、** これらのプログラムは、Rust が注意深く設計したメモリの安全性保証の恩恵も受けています。 **標準ライブラリの Mutex クラスを例に挙げると、Go ではアクセスする前にミューテックスの取得を忘れることがありますが、Rust ではその心配はまったくありません。
前述したように、Go と Rust はどちらも、さまざまな一般的なプログラミングの間違い、特にメモリ管理に関連する問題を防ぐ独自の方法を持っています。しかし **Rust はさらに進んでおり、誰もが予期しないセキュリティ上の間違いを犯さないようにするための努力を惜しまないと言えます。 **
とはいえ、Rust でのプログラミング エクスペリエンスは他のほとんどの言語とは異なり、初めて導入するときは非常に困難になる可能性があります。しかし、多くの開発者の目には、この取り組みには明らかにお金をかける価値があります。
Go を含む多くの言語も、プログラマが間違いを回避できるようにするツールを提供していますが、Rust はこの効果を新たなレベルに引き上げています。多くの間違ったプログラムはコンパイルさえできません。
「借用チェッカーと戦う」ことはRust初心者にとって必須ですが、ほとんどの場合、チェッカーは本当の敵ではありません。検出される問題は、コード内の実際のバグ (または少なくとも潜在的なバグ) です。 そのような問題を回避するには、プログラムを根本的にリファクタリングする必要があるかもしれません - 本当に正確さと信頼性を最優先に考えるのであれば、この厳格な要件は明らかに良いことです。
別の視点から見ると、プログラミング手法を変えない新しい言語は新しい言語と言えるのでしょうか?また、他の言語を使用する場合、Rust は安全に考えることを教えてくれます。これは同様に重要です。
Rust プログラミング モデルを使い始めるときの実際の難しさは、これまでに使用したことのある他の言語によって異なる可能性があります*。 Python や Ruby のプログラマーにとっては Rust は制限が多すぎると感じるかもしれませんが、その明確さと明確な制約が良いと感じる人もいるかもしれません。
一人で問題を解決するとき、または小さなチームで問題を解決するとき、シンプルな言語を選択するか、リッチな言語を選択するかは、まったく個人的な好みの問題です。しかし、ソフトウェアの規模、複雑さ、チームの拡大の拡大に伴い、2 つの言語の違いが実際に現れ始めました。
大規模なアプリケーションや分散システムの場合、コードの実行速度は開発速度よりも重要ではないことがよくあります。無駄のない設計を意図的に強調する Go のような言語を使用すると、新しい開発者の 適応時間を短縮し、より迅速に参加できるようになります。大規模なコードベースに貢献するため。
大規模なソフトウェア開発では、美しさよりも明瞭さと読みやすさが常に重要です。 **実際、Go には制限があるため、Rust などのより複雑で強力な言語よりも Go が企業や大規模組織のニーズに適応しやすくなっています。 **
Rust と Go: 違い
Rust と Go はどちらも人気があり、広く使用されている現代言語ですが、おそらく完全に異なるユースケースをターゲットとしているため、実際の競合相手ではありません**。
Go でのプログラミングへの全体的なアプローチは Rust とはまったく異なり、これらの機能は一部の人には特に適していますが、一方で、他の人を完全にイライラさせる可能性があります。これは当然のことです。なぜなら、Rust と Go がどちらも基本的に同じ問題を基本的に同様の方法で解決しているのであれば、なぜ 2 つの異なる言語が必要なのでしょうか。
それでは、Rust と Go が採用しているアプローチから始めて、それぞれの本質を解釈できますか?一緒に試してみましょう。
「ガベージ コレクションをするか、しないか」は常に正解のない質問です。一般に、ガベージ コレクションと自動メモリ管理は、信頼性が高く効率的なプログラムを迅速かつ簡単に開発するのに役立ちます。したがって、一部の開発者にとって、これらは不可欠な機能です。
また、パフォーマンスのオーバーヘッドと全体的な一時停止を伴うガベージ コレクションは、実行時の予測不能な動作を引き起こし、許容できない遅延を引き起こす可能性があると主張する人もいます。もちろん、この発言には真実があります。
コンピューター プログラミングの歴史は、ますます複雑化、抽象化された開発プロセスであると言えます。これにより、プログラマーは、基盤となるハードウェアが実際にどのように動作するかにあまり注意を払うことなく、問題を解決できます。この設計により、プログラムの作成が容易になり、移植性も向上します。しかし、他のプログラムの場合は、ハードウェアへのアクセスとプログラムの実行方法の正確な制御の方が重要です。
**Rust の目標は、プログラマが「ハードウェアに近づいて」より多くの制御を取り戻せるようにすることですが、Go はアーキテクチャの詳細を抽象化し、プログラマが問題に近づくことができるようにします。 **
実際、ほとんどのプログラムでは、パフォーマンスはコードの読みやすさよりも重要です。しかし、一部のプロジェクトが本当にパフォーマンスを最優先する場合、**Rust にはコードの実行速度を限界まで高めるのに役立つ多くの設計上のトレードオフがあります。 **
対照的に、Go はコードの単純さをより重視しており、そのために実行時のパフォーマンスをある程度犠牲にすることさえいとわない。しかし、Go のビルド速度は比類のないものであり、大規模なコード プロジェクトではこれがさらに重要になることがよくあります。
一方、プログラムが絶対に失敗しないように強制しない場合、トレードオフは異なります。ほとんどのコードは長期間使用するように設計されていませんが、一部のプログラムは運用環境で何年も実行されます。このような現実に直面すると、将来的に大きなメンテナンス負担を負うことなく、プログラムが正しく確実に動作することを開発および保証するために、少し余分に時間を投資する価値があるかもしれません。
Go と Rust はどちらも正しいプログラムを作成するのに役立ちますが、その方法は異なります。 ** Go は優れた組み込みテスト フレームワークを提供しますが、Rust は借用チェッカーを通じて実行時のバグを排除することに重点を置いています。 **
Go と Rust は両方とも本格的な開発プロジェクトには十分ですが、それぞれのさまざまな機能と利点を十分に理解することが最善です。つまり、他の人がどう思うかは関係ありません。 **どのプログラミング言語がチームやプロジェクトのニーズにより適しているかを決定できるのはあなただけです。 **
結論 この記事が Rust と Go のそれぞれのハイライトを理解するのに役立つことを願っています。可能であれば、これら 2 つの言語を少し経験しておくとよいでしょう。アマチュアのプログラミング愛好家にとっても、どのような技術的な道でも非常に役立つからです。
ただし、1 つの言語のみを真剣に学習することに時間を費やす場合は、選択する前に Go と Rust のそれぞれの専門知識と傾向を確認してください。
もちろん、プログラミング言語の知識は、ソフトウェア エンジニアとして成功するためのほんの一部にすぎません。エンジニアはプログラミングに加えて、デザイン、エンジニアリング、アーキテクチャ、コミュニケーション、コラボレーションにも熟練している必要があります。どのプログラミング言語を選択しても、誰もが次のことをうまく実行できれば、優れたソフトウェア エンジニアリングのマスターになれるでしょう。