Torch

Torch

Rust プログラミング言語学習ガイドライン

Rust プログラミング言語学習ガイドライン。

はじめに#

最も重要なことは、この「Rust プログラミング言語学習ガイドライン」という名前が少し大げさに聞こえることを理解していることです。しかしご安心ください、この名前を付けた唯一の理由は、少しでも格好良く見せるためです。ですので、この小冊子を持って公共の場に行くと、(おそらく)高い注目を集めることができ、学習意欲も高まるかもしれません。

Rust は 2015 年に誕生し、今から 9 年が経過しました。すでに一定の歴史を持つプログラミング言語です。もしインターネットで Rust に関する情報を検索すると、さまざまな意見が見つかります。Rust は学ぶのが難しい以外はすべて良い言語だとコメントする人もいます。確かに、Rust は学ぶのが難しい以外に、他のすべてのプログラミング言語の優れた特性を持っていると評価されることがあります。そのメモリ安全性、並行安全性、実行効率などは比類のないレベルに達しています。また、高効率または現代的な Cargo パッケージマネージャーや、C 標準に準拠した一連のコンパイラツールチェーン(Rust の公式コンパイラは現在も gcc GNU C コンパイラに基づいています)と組み合わせることで、開発からデバッグまで非常に簡単です。さらに、オープンソースコミュニティから生まれ、オープンソースコミュニティを対象とした言語であるため、これらの特性はバージョン管理システム(Rust Cargo ではデフォルトで Git)に基づく大規模な共同開発に特に適しています。Rust は 9 年の発展を経て、比較的新しい言語であるにもかかわらず、非常に多くの認知を得ています。その中には名だたる企業や著名なオープンソース開発者(例えば、Linux カーネル開発者の Linus Torvalds は、カーネルに Rust を追加して C の一部を徐々に置き換える準備を進めています)も含まれています。これらの用語が理解できないかもしれませんが、安心してください。この段落の要点は、Rust は間違いなく良い言語であるということです。

「でも Rust は難しいです。ネットで勧められているように、まず C を学んでから Rust を学ぶべきではないですか?」確かに、もし C 言語や C++ に触れたことがあるなら、Rust を学ぶ際にはずっと楽になるでしょうし、この小冊子の第一章(「コンピュータを理解する」)は飛ばしても問題ありません。しかし、C/C++ を学ぶことで Rust の学習を助けるという考えがあるのは、Rust の多くの特性が C/C++ や他のいくつかのコンパイラ型の、やや低レベルな言語の欠点を解決するために提案されたからです。そして Rust が難しいと言われるのもそのためです —— もし低レベルプログラミングに触れたことがない人が Rust を学ぶと、多くの特性が完全に不必要で無意味に感じられるでしょう —— 実際、プログラミングに触れたことがない、あるいは高レベルのプログラミング(JavaScript、Python、さらには Scratch)だけに触れた人にとっては、コンピュータの理解が完全に不十分だからです。この小冊子は、読者に「Hello World」をどうやって印刷するかを教えることを最初から拒否し(実際、読者は後で「Hello World」を書く必要がないことを知るでしょう。なぜなら Rust の新しいプロジェクトのデフォルトテンプレートは「Hello World」だからです)、約 1000 字の図文を交えた形式で、コンピュータの動作原理の最も重要な部分を簡潔に伝えます。また、後の章でも常に原理からアプローチすることに注意を払います。こうすることで、他のプログラミング言語を学んだことがなくても、コンピュータについての理解を深めることで、Rust の卓越した設計を体感し、より良い学習効果を得ることができます。

「なぜ私が聞いたこともないこの言語を学ぶ必要があるのか?」という疑問もあるかもしれません。確かに、Rust は難易度が高く、適用シーンが比較的狭いため、多くの初心者が避けがちで、Python や JavaScript のような言語で十分日常のニーズを満たせると考えています。彼らの言い分は間違っていませんが、JavaScript はワールドワイドウェブ向けのプログラミング言語であり、その最大の特徴は非常に学びやすいことです。もし Rust を学び終えたら、JavaScript はほとんど学ぶ必要がありません。ここで、これらのスクリプト言語を貶める意図はありませんが、事実として、これらのより高級な(先ほど言った高級と低級はハードウェアとの距離に関するものです)言語は誰でも学べ、誰でも習得でき、また高度に新しい技術に依存し、フレームワークに依存しています。彼らが提供できる雇用市場やオープンソースの世界での地位の幅と高さは非常に限られています。また、現代のコンピュータの動作原理を理解していないと、ビジネスロジック(JavaScript の焦点)を処理するだけでは、底層の問題が発生したときに自分でトラブルシューティングすることができず、他の人に依存することになります。底層の事象は、言語が高級だからといって存在しないわけではありません。逆に、底層のビジネスは必ず誰かが処理しなければならず、それがインタプリタやインタプリタ開発者の仕事です。彼らこそが業界の中心となるのです。ポインタのような底層の特性は、インタプリタがまるで保姆のようにそれらを封装し、管理しているだけです。効率や柔軟性において、実際に人間が手を動かすのには到底及びません。もし Rust を学ぶことで、コンピュータについてより理性的で正確な理解を得ることができれば、生活や生産の中で遭遇する多くの問題を明晰な頭脳で解決できるようになり、他の言語を学ぶこともより容易になるでしょう。そして、もしかしたら底層のビジネスを処理する達人となり、業界のリーダーになるかもしれません。

さらに、Rust は多くの人が言うように「ドライバやオペレーティングシステムを書くためのもの」ではありません。逆に、現在多くの企業が Rust を生産環境に適用し、ネットワークサーバーや他のデジタルインフラを運用しています。なぜなら、Rust には二つの重要な特性があるからです:ゼロコスト抽象による高性能、現代的なメモリと並行管理による実行安全性。しかし、コンピュータの基本原理を理解していない場合、また前述のようにスクリプト言語のインタプリタを保姆のように扱っていると、これらのコンピュータ時代の安定性に関わる要素を永遠に理解することはできません。

コンピュータを理解する#

この章に必要な前提知識:基本的な生活経験。もし理解できない用語に出会った場合、文中に説明がない場合は直接スキップしてください。これらの用語はこの章やこの小冊子の理解には(当面)役立たないからです。

現代のコンピュータは非常に複雑な装置に見えます;もちろん、実際にそうです。普通のノートパソコンの構造は、人類がこれまでに製造した中で最も集積度の高い構造でしょう。しかし、いずれにせよ、コンピュータは機械であり、完全に人間が設計したものです。科学者たちは、コンピュータを人間の脳と同じくらい複雑に設計し、人間の脳と同じくらい複雑で巧妙な機能を実現しようと考えたことはありません。20 世紀中頃には、すでに一群の科学者が試みましたが、当時の(そして現在の)生理学の理解の限界により、人間の脳の最も概括的な原理図さえも明確にすることが非常に難しかったのです。そこで、フォン・ノイマンをはじめとする一群の科学者は、超シンプルな計算体系アーキテクチャを設計する道を選びました。結局、汎用コンピュータを作る目的を達成できればよく、人間の脳のような複雑さを追求する必要はありませんでした。こうして、「超シンプル」なフォン・ノイマンアーキテクチャが誕生しました。

Mermaid Loading...

まあ、実際には「それほど簡単」ではないかもしれません。しかし、概要は非常に明確です。フォン・ノイマンアーキテクチャは、過去、現在、そして未来のすべての汎用コンピュータの基本アーキテクチャを定義しています:演算器(CPU)、入出力(I/O Bridge)、メモリ(Memory)。簡単に言えば、演算器は計算の部分、入出力は文字通りの意味、そして(メモリ)は物を保存する場所です。絶対に間違えないでください、メモリは RAM であり、一般的に言われる「メモリモジュール」です。よく混同されるのはハードディスクです;ハードディスクは入出力デバイスの一種です!メモリは揮発性ストレージまたは RAM とも呼ばれ、** 電源が切れると内部のすべてのものが消去されます(そうでなければ、なぜ揮発性ストレージと呼ばれるのでしょうか)** が、読み書きの速度は非常に速く、サイズは一般的に非常に小さく、通常(ほとんどの場合)ファイルを保存するためには使用されません。ハードディスクは、上記の図の「Bus」(一般的に言われるバス)に接続されている入出力デバイスの一つで、入出力データを保存するためのものです。メモリとハードディスクの両方に物を保存することができますが、最大の違いは、ハードディスクは CPU とメモリという「工場」の出力結果を受け入れ、入力材料を提供するためのデバイスであり、工場の倉庫のようなものです;メモリはこの工場内の机や椅子で、作業者やさまざまなツールに一時的な保管スペースを提供し、加工待ちの材料に加工のための台を提供します。混乱を避けるために、この小冊子ではすべての「メモリ」を「主記憶装置」と表現し、同時に「実行データ」という用語を揮発性ストレージ内に存在するすべてのデータと命令を指すために使用しますので、読者は注意してください。また、工場の比喩はこの小冊子全体にわたって使用されますので、後でその理由がわかります。

CPU 内部にもストレージ機能を持つコンポーネントがあります。全宇宙に適用される機械原理は、ストレージデバイスの一つの特性を決定します:容量が小さいほど、速度が速い(技術原理の違いを無視した文脈で)。したがって、CPU 内部にあるこれらのストレージコンポーネントの容量は非常に小さく、最大でも数 MB を超えることはありません(もちろん、このサイズは現代の CPU が提供するものです;いくつかの古い教科書では、CPU 内のストレージコンポーネントのサイズは数バイトしかないと言われることがあります)。工場の比喩を使うと、主記憶装置が加工台で、加工待ちの材料を置く場所であるなら、これらの CPU 内部のストレージコンポーネントは工具箱のようなもので、非常に短い時間内に小さな部品を保存でき、非常に「使いやすい」場所に置かれています。加工台に物を置く(主記憶装置から読み書きする)のに必要な時間は、工具箱から部品を取り出す(CPU 内部ストレージから読み書きする)のに必要な時間よりも数十倍長くなりますが、前者はすでに半ミリ秒未満です。

これらの CPU 内部のストレージコンポーネントには、それぞれの名前があります。一部は「キャッシュ」(cache)と呼ばれ、一部は「レジスタ」(register)と呼ばれますが、読者はそれらを理解する必要はありません。いくつかの教科書では、プログラミング中にプログラムがさまざまなデータをキャッシュ、レジスタ、または主記憶装置に保存するよう要求できると言われるかもしれませんが —— そのような要求は信じたり実践したりしないでください。現代のプログラミング言語と現代のオペレーティングシステムは、安全性と安定性の観点から、プログラムのこのような要求を無視します。Rust では、コンパイル時にプログラムに実行時データの保存場所を選択する権利を与えません。したがって、CPU 内部のストレージコンポーネントについてはこれ以上紹介したり理解したりしません;読者はそれが存在することを知っていれば十分です。プログラムにとって、彼らが見ることができる部分は、単純に計算を提供する CPU、単純に実行データを保存する主記憶装置、そして他の I/O デバイス(ハードディスク、プリンター、カメラ、マイク、スピーカーなど)だけです。工場のマネージャー(オペレーティングシステム)が作業者に各物をどこに置くべきかを指示するように、彼らは自由に置くことはできません。

CPU が計算を提供する原理は非常に複雑です。しかし、皆さんは基本的な四則演算や他の一連の高度な関数を実行できることを知っておくべきです;これらは数学やデジタル回路設計の範疇であり、私たちはハードウェアに近づく必要がありますが、そこまで近づく必要はありません。また、著者の能力には限界があるため、この部分についてはこれ以上詳しく述べません。

I/O ブリッジ、この記事では入出力または I/O ブリッジと呼ばれ、I/O バスと CPU および主記憶装置を接続します。これは工場の材料の入力口と製品の出力口のようなものです。I/O ブリッジがなければ、この工場の存在も無意味です。I/O バスは少し奇妙に聞こえるかもしれませんが、その英語名はすべてをうまく説明しています。「Bus」、バスです。確かに、I/O バスはバスのようにデータをその場所(さまざまな可能性があります。他の工場の出力である可能性もあれば、特定のデバイスである可能性もあります)から工場に運びます;またはその逆です。I/O という名前は非常に広く使われることもあります。結局のところ、input /output の意味です(入力 / 出力)。各工場には進料口と出力口があります;したがって、各機械(プログラム)にも進料口と出力口があります。したがって、プログラミング中に I/O がユーザーの入力や画面に表示されることを表すために使用される場合、驚く必要はありません。

これで、私たちのコンピュータシステムの旅は終わります。この部分の内容を詳しく説明すると、一冊の大作を書くことができます(「コンピュータシステムを深く理解する」をお勧めします。コンピュータシステムを深く理解したい場合は)。しかし、プログラムを対象とした学習にとっては、これで十分です。

P.S. なぜコンピュータを工場に、プログラムを機械に例える比喩がこれほど一般的であり、この記事でも使用されるのか?それは、現代のコンピュータの正式名称が実際には汎用コンピュータだからです。言い換えれば、孫悟空のように七十二変化できる(しかも同時に変化できる)さまざまな専用目的の機械に変わることができる —— 実際には汎用コンピュータが誕生する前や特定の分野で使用される前に存在していた専用コンピュータ(一般的に専用デバイス、IC(集積回路)などと呼ばれます)。例えば、スイッチは典型的な専用コンピュータであり、プログラム可能ではなく、他の用途に使用することはできません。しかし、パーソナルコンピュータは汎用コンピュータであり、プログラミングや既存のプログラムをインストールすることで電話、電子メールの送受信機、スイッチ、ルーター、サーバーなどに変えることができます…… 汎用コンピュータ技術の成熟と、専用コンピュータのように毎回特別な集積回路を設計する必要がなくなったため、さらに多くの機能を簡単に実現するために、ますます多くの専用コンピュータデバイスが汎用コンピュータに置き換えられています。例えば、IoT デバイスであるネットワーク接続された給湯器は、単一の回路基板の汎用コンピュータ(マイコン)によって制御されています;ある意味では、このようなデバイスはパーソナルコンピュータと本質的に同じです!このような比喩が合理的に成立するのは、ある意味で汎用コンピュータが誕生する前の世界を描写しているからです —— それは大多数の人々が知っていて、本能的に受け入れることができる世界でもあります。

次の章では、Rust で Hello World を書くことを学びます。(しかし、実際には簡単な文字列検索の小プログラムを書くことになります —— 心配しないでください、これは簡単にできます。)

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。