よく分からないものがあると、手を出すクセがあるのですが、突き詰めるとこまでは、絶対にいかない性格です。これもその一つでしょう。Rustは新しい言語です。C、C++と近いようですが、分かってません。その中で気になったのが、Visual Studio Codeでデバッグしていくと、マシン語が出てくる。見てもわからないけど、今まで見たことがないと思います。C、C++ではメモリの管理がユーザー任せだと思います。多少は違うかも?。ガベージコレクタが無いと言うんですが?
いつものように図書館から、参考書を借りてきました。要らなくなれば返せばいいので、手を出しやすい。「実践Rust入門」、初っ端から結構難しい。下がその例です。逆ポーランド記法の計算をする例です。
これが頭に入らない。何やってるの?って感じです。自分なりに考えてみました。基本としては、a b +というものは、aとbを足して、答えとするです。少し変えて、a b c + -だったら、bとcを足したものをaから引いたものが答え、ということでしょう。
あとはプログラムしていきます。式をspace区切りで、配列に入れて、先頭から演算子が出てくるまで探します。見つかったら、2個手前と1個手前の要素を使い計算して、それを新しい計算式の文字列にします。文字列のはじめの部分とあとの部分があるので、それを繋げて、新しい文字列とします。計算は、文字列を配列に、space区切りで入れ直しますが、1個になればそれが答えです。
再帰使えそうですが、どうすれば良いかはわかりません?配列のまま処理は意外と難しいかも、配列の操作が必要になるでしょうし、文字列に戻して、最初からやるのが一番楽かもしれません。
実行画面はVSCodeで、Rustです。上のコードはスクリーンショットなので、fc2WordPressブログにコードを張っておきましたが、シンタックスハイライトは出来てません。どうやらFreeでは無理みたいです。
構文は近い、ですね。
ただし、中身はJavaと比べても別物、って言って良いと思います。
> C、C++ではメモリの管理がユーザー任せだと思います。多少は違うかも?。ガベージコレクタが無いと言うんですが?
そうですね。C/C++はガベージコレクタがなく(そういう外部ライブラリはありますが)、Rustもその路線です。
だからユーザーがメモリ管理しないといけません。
> 「実践Rust入門」、初っ端から結構難しい。
結構ぶっ飛んだ例を挙げてますね(笑)。
まぁ、平たく言うと、RustはC/C++を「置き換えよう」としてる野心的な言語なんで、当然「プログラミング言語を書くプログラミング言語」の位置を狙っています。
逆ポーランド記法はHP(ヒューレットパッカード)の電卓なんかで有名な記述法ですし、
HP電卓:
https://www.hp.com/us-en/calculators.html
AdobeのPostScriptと言うプログラミング言語でも有名な記法です。
GhostScript(Adobe PostScript互換のフリーなプログラミング言語):
https://www.ghostscript.com/
あと、いつぞや紹介した、日本語プログラミング言語「なでしこ」なんかも一種逆ポーランド記法のプログラミング言語です。
なでしこ:
https://www.nadesi.com/top/
んで、平たく言うと、この例は、Rustが狙ってる「プログラミング言語をプログラミング言語で書く」と言うお題を考えた時に割に基礎的な例題ではあるんですよ・・・知らんとビックリするでしょうが。
実はポーランド記法/逆ポーランド記法は「フツーの数式」に比べると構文解析自体はラクなんです。
だからこういう例を挙げてるんでしょうねぇ。
> 基本としては、a b +というものは、aとbを足して、答えとするです。少し変えて、a b c + -だったら、bとcを足したものをaから引いたものが答え、ということでしょう。
うん、その通りです。大丈夫です。
> 再帰使えそうですが、どうすれば良いかはわかりません?配列のまま処理は意外と難しいかも、配列の操作が必要になるでしょうし、文字列に戻して、最初からやるのが一番楽かもしれません。
使えるでしょうね。まぁ、色々とテはあるとは思いますが、ちとここに書くのは難しいかも。
ただ、このコードは基本的にスタックを使ってて、数値がやってくればスタックにプッシュ、演算子がやってきたら計算を行う、と言う全くの「基本路線」を行ってると思います。
多分もっとも簡易な解説はこれなんじゃないですかね?
日曜プログラミングで電卓を作ってみる:
https://knowledge.sakura.ad.jp/220/
まぁ、基本的にはそこで書かれてるモノがスタックと逆ポーランド記法の演算原理で、フツーの言語で書くとチマチマ処理しなきゃならないのが、Rustだと関数型言語っぽくapply2で一気に処理可能ですよ、と言う話ですね。
実際、ハードウェアの「スタックマシン」ってのが、かつて実験されてた事があるようです。
スタックマシン:
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%83%9E%E3%82%B7%E3%83%B3
Javaの仮想マシンとか、プログラミング言語の仮想マシンもソフトウェア・スタックマシンとしてデザインされてる例も多いんじゃないかしらん。