SSブログ

Rustのしんどそうなところを見ていくつもり2 [プログラミング]

Rustはコンパイルを通すにもやっとだという話から、シンドいなぁと思っているわけですが、やっぱ初期の学習コストが大きい言語というのはちょっとしんどいですよね。


 

cargo newでプロジェクトを作るとCargo.tomlが出てきて

edition = "2018"


と出てきて、今は2020年じゃ、気持ち悪いな、と思って調べました。

https://qiita.com/garkimasera/items/1bc973eae60fe0c10210

2018年版のRustということね。ここを2015に変えると前のバージョンのRustの文法に対応したものに戻せると。実行側(コンパイラ側)の環境をいちいちバージョンごとに用意しないといけないのはシンドいので、こういうのは嬉しいというか、まだ言語的に固まっていないRustとしては必須の機能なのかもしれません。破壊的変更とか言い方はかっこいいけど、まだ作り途中ってことでしょ?w




そういやTwitterで見たのでエラー処理のデフォルトがまだまともにないという話。

https://qiita.com/legokichi/items/d4819f7d464c0d2ce2b8

標準のが死んで乱立中らしい。そもそものメモリの扱いが災いして、エラー処理もしにくくなっているのかもしれないね。細かいことはわからないけど。本格的に使う頃になったら、標準的なエラー処理が確立されているといいなぁ。現状、何も使えないようなもんだけど、元々あんまりエラー処理使わないからなぁw。まだどっちでもいい。




RustはCargoだと強制的ハロワーなので、毎回雛形を作る度できる。雛形と言うほどには作ってはくれないんだけどコンパイルする側としては一応。

https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/guessing-game.html

日本語はエディタによっては使えないと書いているけれども、たぶんUTF-8を使っていれば大丈夫。WindowsでShift-JISとかならまだしょうがないけど、基本みんなUTF-8に移行しちゃったしねぇ。大体、空のファイルを作ろうとしたら、UTF-8にはなる。だから多分日本語を使っても基本大丈夫なはず。というか、今時UTF-8にも対応していない言語は死んだも同然だろう。




ムーブセマンティクスについて、またわかってないながらも書こうと思ったんだけど、最初のサンプルコードだけを見て、変数を見たまんまのことを書くと

・何にも指定しないで変数を書こうとすると、変更が効かない定数になる。
・一般的な変更可能の変数にするならlet mutで宣言して、&mutをつけて渡す(mutateのmutだと思われ)。宣言するときも使うときも変更可能だって言わないといけない。めんどう。
・変数を渡したら、渡し元では参照できなくなって、参照しようとするとコンパイル時点でエラーになる。うっとうしい。





まだ色々突っ込む点はあるのですが、ここで変数の扱いのパラダイムについて言及。

プログラミング言語での変数の扱いのパラダイムが違うなと思ったりする。

まずはグローバル変数ばかりでスコープもない状態。COBOLなんかがそうだったらしいんですが、ローカル変数ってものがなくてグローバル変数しかなかったって話。
 http://www.nurs.or.jp/~ogochan/essay/archives/5398
ここによるとそうでもなさそうですが、
 http://sin20xx.hatenablog.com/entry/2019/02/05/155131
グローバルが基本であることには違いがなく、変数のスコープが一つのファイル内にあまり分けられず、現在の一般的な言語として使い方を考えるとおかしいってだけの話であって、言語全体からすればその使い方からそこまで害になっていないということだったようです。


まぁ元々帳票を扱う勘定系の言語なので、それをC言語系の汎用言語と比べてしまうのもなんだと思いますが、コンピューター言語という括りでの話なのでそれはそれとして。
そういうグローバル変数の世界から、スコープがある自由変数の世界が広まったわけでしょう。ファイルスコープや関数スコープなど、変数の生き死にが割ときちんと規定されているのに、書くときにはそれほど意識しなくて良いという今では普通に使われる言語に多くあるものです。

ただヒープにメモリを確保したり削除したりする時には、自由変数ほどに良きに計らってくれてはいなくて、関数などで作ったり消したりを自分でしないといけなかったのがC言語のレベルでした。スクリプト言語などのLL(軽量言語)では、割と昔からGC(ガーベッジコレクション)があって、その所は割と良きに計らってくれてはいましたが、そこそこ力のいる処理ではあるので、プアな環境ではキツいものではあったのでした。


それが昨今、GCが要らないコンパイル言語が出てきました。Rustはそうですが、AppleのARCを使ったSwiftやObjective-Cなんかもそうですね。実行時にGCもなく、コンパイル時にメモリ操作を静的に決定してしまうというやり方。Rustはかなり無理強いして、言語の根本から考えを変えさせてコーディングさせることにしたようですが、それはそれで今までのパラダイムが変わってきたのと同じことなんじゃないかと思うんですよね。

・グローバル変数
・自由変数+手動のヒープ解決
・自由変数+GCで実行時ヒープ解決
・コンパイル時にヒープの解決

というふうに変遷していっているってことなんでしょうね。その解決方法の中にムーブセマンティクスやら所有権やらがあるんだろう。まぁそうなんだろうなという印象しかないわけだけど…。

パラダイムが違うんだから使い勝手が違うというのは避けられない話なわけで。しかも、GCとかと違って書く方に負担を強いるタイプなので、あまりお気軽にやろうと思う人は少ないんじゃなかろうかと思うんだよね。




文句みたいなことを言ったけど、もう少し勉強してから自分なりに消化してまた書こうと思います。なんにしてもまだ全然言語の概要すら見えてない。確かに初期コストが大きい言語だ。誰にでもお勧めってわけじゃないなこりゃ。


タグ:RUST
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0