ホームページ  >  記事  >  バックエンド開発  >  ホリネズミのための錆

ホリネズミのための錆

王林
王林オリジナル
2024-07-19 14:08:58746ブラウズ

Rust for Gophers

packagemain.tech の元の記事を読む

Rust をすべきか、それとも Go をすべきか?どちらの言語が優れているのでしょうか?また、その質問は意味があるのでしょうか?特別ゲストの John Arundel と 2024 年の Go 対 Rust について話しましょう。 John は、『For the Love of Go』、『Cloud Native DevOps with Kubernetes』、その他多くの本の著者です。彼は Go と Rust の両方を教えているので、彼の視点を聞くのは興味深いでしょう。インタビューはこちら!

ジョン、最近 Rust について聞くことが増えているようです。簡単に紹介してもらえますか? Rust は何のためにあり、なぜ存在するのでしょうか?

もちろん、それは簡単です。 Rust はエレベーターを制御するための言語です。

冗談ですか?

そんなことはありません。 Rust の創始者である Graydon Hoare 氏は、ソフトウェアの問題により建物のエレベーターが故障し続けたときにイライラしていました。彼は「きっとこれよりもうまくできるはずだ!」と思いました。そして残りは歴史です。

すべてのバグを防ぐことはできませんが、少なくとも、バッファ オーバーフロー、データ競合、「解放後の使用」問題など、いくつかの主要なカテゴリのバグを排除するプログラミング言語を使用することはできます。そのため、Rust は当初から、信頼性の高いソフトウェアを構築し、優秀なプログラマが行う安全性チェックの多くを自動化し、本番環境に入る前に間違いを発見できるようにすることに重点を置いてきました。

それは良いアイデアのように聞こえますが、Rust は、特に Go と比較すると、習得するのが難しい言語であるという印象を受けます。それは公平ですか?もしそうならその理由は何ですか?

Go と Rust はどちらも、異なる方法で同じ問題を解決しようとしています。C や C++ などの従来の言語で大規模なソフトウェアを作成するのは困難です。プログラマーは、間違いを避けるために非常に経験と知識が必要だからです。専門家でも時には失敗する可能性があり、プログラマーを専門家に育てるには長い時間がかかります。

Go は、言語を根本的に単純化することでこの問題に取り組んでいます。C++ などと比較して、学習する構文がはるかに少なくなります。そのため、プログラマーは、大きくて複雑な言語を習得するのではなく、プログラムをうまく書くことの学習に時間を費やすことができます。 Go は無駄がありませんが、効果的です。

たとえて言うと、宇宙船を操縦するよりもトラクターの運転を学ぶ方が簡単です。トラクターは地味で実用的な機械かもしれませんが、その仕事は完璧にこなします。実際、畑を耕すなど、多くの作業には宇宙船よりも優れた選択肢です。

あなたのたとえが気に入っています。 Rust は宇宙船なのでしょうか?

はい、Rust は大きく、複雑で強力であり、C などの伝統的な命令型言語の優れたアイデアの多くと、Haskell や Lisp などの言語から借用した関数型プログラミングの概念を組み合わせています。

Rust では Go よりも学ぶべきことがたくさんありますが、それ以上のことができます。火星に行きたいなら、トラクターよりも宇宙船の方が良い選択です。もちろん、宇宙飛行士の訓練にはトラクターの運転手よりも少し時間がかかります。

Go にはガベージ コレクションが組み込まれており、シンプルさには優れています。 Rust ではメモリ管理はどのように機能しますか?また、それを学ぶのは大きな課題ですか?

はい、ガベージ コレクションを使用すると、C++ などの言語のように、自分でメモリの割り当てや解放について心配する必要がなくなります。これにより、プログラミングが容易になり、メモリ関連のあらゆる種類のバグが排除されます。一方で、比較的複雑なランタイムが必要となり、ガベージ コレクションがパフォーマンスに影響します。

Rust は異なるアプローチを採用しています。メモリは自動的に再利用されますが、プログラムを一時停止する必要はありません。これは、存在する特定のデータへのすべての参照を追跡することで実現できます。プログラムのどの部分もデータを参照できなくなった場合、Rust はメモリのビットをすぐに安全に再利用できることを認識します。

はい、Rust は所有権と借入に重点を置いていると聞きました。これらの概念は Go でのポインターの操作と比較してどうですか?また、これらの概念を理解するための良い方法は何ですか?

そうですね、良いニュースがあります。すでに Go のポインターに慣れている場合は、Rust での参照は基本的に同じように機能しますが、より安全であるだけです。変数への変更可能な参照を作成すると、それは Go ポインターと同じように機能し、関数に渡すことも、どこかに保存することもできます。

しかし、Go とは異なり、変更可能な参照が存在する限り、その参照はデータに排他的にアクセスできます。他の誰もそのデータを変更したり、読み取ることさえできません。 Go で言えば、自動ミューテックス ロックのようなものです。また、関数がデータを変更する必要がない場合は、代わりに読み取り専用の共有参照を借用することができ、一度に多数の参照を存在させることができます。

Rust は元のデータも追跡します。元のデータが範囲外になると、そのデータへの参照は無効になります。そのため、コンパイラは、存在しない値への参照を使用しようとするさまざまな種類のダングリング ポインタのバグを検出できます。その結果、未定義の動作が発生します。これは、何か恐ろしいことが起こることを示す良い方法であり、Rust の価値提案の一部は、「未定義の動作は決して存在しない」です。

Rust では、データへの参照が常に有効であり、変更可能な参照が一度に 1 つだけ存在するようにプログラムを記述する方法を見つけ出す必要があります。これには多少の慣れが必要ですが (Rust プログラマはこれを「借用チェッカーとの戦い」と呼んでいます)、結果として得られるプログラムはより信頼性が高く、正しい可能性が高くなります。

たとえば、すべての Go プログラマーはデータ競合に精通しています。データ競合では、2 つ以上のゴルーチンが共有データに同時にアクセスしようとし、予測できない結果が生じます。良くてもプログラムはクラッシュし、最悪の場合は続行されます。データが破損しているか無効です。

Rust では、このようなプログラムはコンパイルできません。所有権と参照のルールは、同じものに対する 2 つの変更可能な参照が同時に存在できないことを意味します。別の方法で問題を解決する必要があるだけです。

これで、きれいに同時実行が可能になります。私は Go のチャネルとゴルーチンによる同時実行機能が好きです。 Rust は同時実行性をどのように処理しますか?私の Go 経験から活用できる類似点はありますか?

はい、ゴルーチンとチャネルは優れています。従来のマルチスレッドと比較して非常に安価な、超軽量のタスク抽象化です。一方、Go は基本的な構成要素しか提供しません。それを安全に使用し、データ競合やデッドロックを回避できるかどうかは、私たち次第です。それは難しいかもしれません!

Rust にはゴルーチンはありませんが、ゴルーチンによく似た非同期タスクがありますが、通常の Rust の安全性が保証されているだけです。また、Tokio や Rayon など、大量のデータを取得し、それを並行して処理する最も効率的な方法を自動的に見つけることができる優れたサードパーティ フレームワークもいくつかあります。

つまり、同時実行プログラムをうまく書くのは常に難しいですが、Go でそれができれば、そのスキルは Rust にもうまく応用できることがわかります。

私は実践して学ぶのが好きです。 Rust を使い始めた Go プログラマーにお勧めできる優れた実践的な演習やプロジェクトはありますか (たとえば、Tour of Go など)。

Rustlings は、始めるのに最適な場所です。これは、言語の基礎をすべて説明する、インタラクティブで簡単な演習のセットです。実際に生きている人間からフィードバックを得たい場合は、Exercism の Rust トラックをチェックしてください。 Rust by Example もあります。これは、実際に動作するサンプル スニペットの素晴らしいリソースです。

あなたは両方の言語のファンのようですね。どちらが好みですか?また、すでに Go を知っている人には Rust も学習してみることをお勧めしますか?

はい、Go と Rust はそれぞれ、私の脳のさまざまな部分に訴えかけます。私は Go の徹底的なシンプルさと実用主義が好きです。Go はほんの少しのことで多くのことを行い、ほとんどの問題をうまく解決します。

一方、Rust は、カーネル、ファームウェア、組み込みデバイス、医療機器、産業、航空宇宙などの安全性が重要なアプリケーションなど、Go が理想的な選択肢ではないギャップをきれいに埋めます。

もちろんエレベーターも。

当然です!ですから、私は Rust のその側面が好きですし、本当に楽しくて表現力豊かな言語でもあります。 Rust を試してみて、最初の構文の不慣れさや借用チェッカーでの苦労を乗り越えられるまで、Rust を長く使い続けることは、誰にとっても時間をかける価値があると思います。

Rust は自分には向いていないと判断した場合でも、問題についての興味深い新しい考え方を学ぶことができます。また、Go が行うさまざまなトレードオフについての理解も深まります。

キャリアの観点から見ると、Go と Rust はどちらも近い将来、非常に価値のあるスキルとなるでしょう。近いうちに、「Go 対 Rust」の代わりに、「Go と Rust 対 その他すべて」について話すことになると思います。

ジョン、ゲストとしてご参加いただき、Go と Rust についての見解を教えていただきありがとうございます。たとえば、あなたの本やトレーニング コースに興味があるかどうかなど、人々はどこであなたについてもっと知ることができますか?

それは嬉しいです!さらに詳しく知りたい場合は、私の Web サイト bitfieldconsulting.com にお立ち寄りください。または、ご連絡ください。喜んでお話しさせていただきます。

以上がホリネズミのための錆の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。