るいもの戯れ言

「プログラミング言語Rust公式ガイド」を大分前に送って戴いていたのを、ようやく読んだ。

Rustは、個人的にかなり気に入った言語で、早く組込み開発で普通に使えるようにならないかなと思っている。Rustの公式のガイドがとても良く出来ており、おそらく多くの人がここをとっかかりに始めているのではないかと思う。本書は、このガイドを読んだ人、読んでいない人のどちらにも勧められる良書だ。ただ中盤以降の翻訳は一部こなれていない箇所もあり、意味が良く分からない時のために原書もあると良いと思う。

2章 Shadowing。Rustでは同じ名前の変数を複数回宣言できて、それにより前の変数はShadowされる(見えなくなる)。他の言語では、ほとんどが二重宣言のエラーになるところだ。便利かもしれないが個人的にはRustの言語仕様の中で、ほぼ唯一疑問を感じるところ。まぁ関数のサイズが小さければ問題ないのかもしれない。

2章 Result型。他の多くの言語が例外を使うのに対し、Rustは正常時と異常時との2つの型を持てるいわゆるEither型を使用する。ユーザのコードがResult型の結果を受けて何もしていないとコンパイラが警告を出してエラー処理を忘れていないかと忠告してくれる。

3章 Rustのセミコロンの扱いは、他の言語(行末のセミコロンを省略しても良いという仕様)から来た人をとまどわせることが多いと思う。値を返したい場合にはセミコロンを書いてはいけないし、文の間は基本はセミコロンで区切らないといけない。

4章 Rustで特徴的なのが所有権の管理。

let s1 = String::from("Hello");
let s2 = s1;

最後の文でs1からs2に文字列の所有権が移転されて、この後はs1が使用できなくなってしまう。これにより二重解放のバグが回避される。

4章 そしてもう1つ象徴的なのが参照の管理。例えばJavaとかScalaでは型によりImmutableかどうかが決定される(Javaはまぁ、Collections.unmodifiableXXX()みたいな型だけじゃ判別できない辛いやつもあるけど)。String型ならImmutableだし、StringBuilderならMutableだ。Rustはここの考え方が根本的に異なり、最初に見た時は衝撃を受けた。コードのあらゆるポイントで以下が満たされていることをコンパイラがチェックしてくれる。

  1. Immutableな参照(&)だけであれば、同時に幾つでも生成できる。
  2. 1つでもMmutablな参照(&mut)があれば、これ以外に別のMutableな参照もImmutableな参照も同時に存在できない。

この条件を満たしさえすれば、何もImmutableなデータのみに拘泥してロジック組まなくてもいいよね、という考え方なのだ。そしてスレッド安全性もコンパイラがチェックできてしまう。

8章 Rustはデフォルトはmoveセマンティクスなので、コレクションにデータを格納すると、所有権が移転されてコレクション側に移る。このあたりも他の言語から来た人を、かなり驚かせる点だろうと思う。

10章 そしてライフタイム。Rustでは、ライフタイム(そのデータがどこまで有効であるか)を指定するのにジェネリクスの記法を用いる。おそらくRustで最初につまずくポイントがここだろう。

13章 Rustではクロージャを利用できる。ただクロージャは環境にアクセスできるので、その環境からキャプチャした変数の扱いにも所有権が絡んでくる。そのためクロージャにも3つの型があり、FnOnceは環境から所有権を奪い、FnMutは可変借用をし、Fnは不変借用をする。

17章 代表的なGoFデザインパターンをRustで実装してみる試みがおもしろい。

19章 関連型。Iteratorは要素の型を型パラメータではなく、関連型で指定する。

pub trait Iterator {
  type Item;
}

Scalaでも抽象型宣言という同じ機能があるのだが、型パラメータを使うのと比べて何が違うのかが良く分からなかった。本書は関連型を使うと何が嬉しいのかが具体的に解説されている。本書の良い点は随所でこのように「なぜそうなっているのか、何が嬉しいのか」かがきちんと説明されている点だ。

以上、個人的に特に面白いなと感じた点を、つまみ食い的に紹介してきたが、本書の内容は網羅的であり、これ1冊理解すればRustの大部分を理解できると思う。

Rustの魅力は、上にも書いたように低レベルの処理をマルチ・スレッド処理も含めて安全に書けることに加え、しがらみが無いため単純で美しい点、エラーメッセージが懇切丁寧である点、また単体テストやビルドツールが標準で用意されている点などが挙げられると思う。最近は採用されるケースも良く聞くようになってきたので、今後ますますの普及に期待したい。

コメントを書き込む
#935
2019/06/12 11:45

羽田空港でちょっと遊ぶ。

テレビ塔。

大通り公園が一望できる。

空港近くの支笏湖へ。

小径を登っていくと...

小さな展望台。

支笏湖は、山手線と同じ面積があるのだそう。スケールが違う...

コメントを書き込む
#934
2019/05/26 07:15

某ゲームのイベントで武蔵嵐山に行ってきた。

ラベンダーにはちょっと早かった。

コメントを書き込む

最終楽章は長大なフーガ。最初に長い序奏が付いている。

フーガは調性が薄く、力強く進んでいく。

印象的なカンタービレが置かれている。弱音器の指定があるだけで、強弱の指定が一切無く演奏者に任されている。最後は消えいるように終わってフーガに戻る。

最後はffの力強い和音で終わる。

楽譜引用はヘンレ版から。

Apple Musicの方はこちら。

コメントを書き込む

第3楽章は長大な緩徐楽章。最初のテーマは非常に長く、苦難に満ちた独白のようだ。

天から一筋の光が降りてくるかのようなテーマ。

長い階段を登っていくかのよう。

永遠に続く美しいもの、幸福、しかし手は届かない。

出口の見えない霞の中、あるいは深海のよう。

抗い続けるが、

不気味な影が近づく。

苦難が続く。

どれほど抗っても救われない。

あきらめのテーマが曲の終わりを告げる。

最後は長調ながらも、あきらめを感じさせるpppで終わる。

楽譜引用はヘンレ版から。

Apple Musicの方はこちら。

コメントを書き込む

第29番は4楽章構成で、第2楽章にはスケルツォが配されている。

2つ目のテーマは、メロディなのかどうか分からないあやふやなもの。

突如Prestoになって流れが中断される。

最初のテーマが帰ってくる。

そして最後にもPrestoで流れが中断され、なんともスケルツォらしい。

楽譜引用はヘンレ版から。

Apple Musicの方はこちら。

コメントを書き込む

新しい音域の広くなったピアノを手に入れて意気込んで作曲したと言われている。

ピアノ・ソナタとしては破格の規模の大きさ。第1楽章は壮大な高くそびえる和音で始まる。

続くテーマは対照的に優しく滑らかなもの。

初期のソナタに似ていて、次々と新しいテーマが登場する。

提示部最後のテーマ。

展開部は、提示部最後のテーマで始まる。

その後は、最初のテーマがカノン風に展開される。

再現部。

最後は最初のテーマが繰り返されながらpppになった後に、ffの和音で終わる。

楽譜引用はヘンレ版から。

Apple Musicの方はこちら。

コメントを書き込む

第3楽章は序奏の後に第一楽章のテーマが再度奏された後に多声が多用される充実のソナタが続く。

序奏は夕暮れを思わせるかのようなおだやかなテーマで始まる。

最初のテーマに変化が与えられる。

第一楽章のテーマが再度奏される。

トリルをはさんで、1つ目のテーマ。

もう1つのテーマ。

1つ目のテーマの変形。

2つ目のテーマの変形。

2つ目のテーマの変形。

ここで一息。

展開部に入るまでにも既にテーマが様々に展開されてきているが、展開部に入ってからは更に多声を駆使した充実ぶり。

最初のテーマがカノン風に展開される。

再現部。

最後はトリルの上に2つ目のテーマが静かに奏される。

最後はなかば唐突な和音がffで奏されて終わる。

楽譜に引用はヘンレ版から。

Apple Musicの方はこちら。

コメントを書き込む

後期ソナタの特徴の1つが第2楽章だ。緩徐楽章は姿を消し、力強い楽章が配置されている。

符点のリズムが特徴的。

印象的なカノンが配置されている。

推移部を伴って最初に戻る。

楽譜の引用はヘンレ版

Apple Musicの方はこちら。

コメントを書き込む

第28番は落ち着いたテーマで構成される小さなソナタ。

この曲では、特徴的なスラーのかかった音型が登場する。

展開部は小規模で、再現部も分かりにくく、幻想的な雰囲気に包まれる。

楽譜引用はヘンレ版から。

Apple Musicの方はこちら。

コメントを書き込む
1 / 18