1 of 40

Rust を知ろう 2022 第7回

hsjoihs

2 of 40

プログラミング

3 of 40

プログラミング

  • 意識しないと一人で書くことになりがち

4 of 40

プログラミング

  • 意識しないと一人で書くことになりがち
  • 「複数人でコードを書き、コミュニケーションを図るとはどういうことか」

5 of 40

モブプログラミング

6 of 40

やり方

  • 4~5人のグループ
  • 「計る人」
    • 毎回何らかの手段で 5 分を計り、5 分が経ったらターンを終了させる役割�
  • 「喋る人」
    • 書くべきコードを口頭で伝える
    • カンニングペーパー(hsjoihs の手により用意済み)を見ながら喋る
    • 相手の理解度に応じて、説明の仕方を臨機応変に変える力が必要�
  • 「書く人」
    • 「喋る人」の言うことを聞き、コードを書いていく
    • 「書けと言われたこれってどういう意味?」と質問しましょう

7 of 40

5分

5分

5分

8 of 40

今回やる内容

「カッコも処理できる電卓」

  • (3+5)*7
  • 8-5*4+3
  • 9-(7-2)*7+(3*(5+2)-3)*2

9 of 40

難しそう~

10 of 40

手間を省くための手抜き

  • 入力は一桁の数字および + と - と * 、そしてカッコからなる
    • 25 とか 42 とかには対応しない
  • -3 とかには対応しない。0-3と書いてもらうことにする

11 of 40

それでも�難しそう~

12 of 40

なんと!�4ステップでできる

13 of 40

Step 1.

  • 「文字列を部分的に食いちぎる」関数を作る
  • まずは「先頭から数字を一個食いちぎる」だけの関数を作る
  • eat_primary と名付けよう
  • こうなってほしい ↓

14 of 40

Step 2.

  • 次は「数字*数字*数字」とかを先頭から食いちぎる関数を作る
  • eat_multiplicative と名付けよう
  • こうなってほしい ↓

15 of 40

Step 3.

  • そうしたら、今度は「multi+multi-multi」とかを先頭から食いちぎりたい
  • eat_expression と名付けよう
  • こうなってほしい ↓

16 of 40

結局なにをやったのか

17 of 40

結局なにをやったのか

3 * 5 + 7 * 4 - 2 * 3 * 5

primary

18 of 40

結局なにをやったのか

3 * 5 + 7 * 4 - 2 * 3 * 5

��multiplicative

primary

19 of 40

結局なにをやったのか

3 * 5 + 7 * 4 - 2 * 3 * 5

���expression

��multiplicative

primary

20 of 40

まだ完了ではない

  • カッコの処理をまだできていない
  • しかし、実はもう一工夫するだけで完了する

21 of 40

3 * 5 + 7 * 4

���expression

��multiplicative

primary

primary になっている�この 7 の中に……

22 of 40

3 * 5 + (9-2) * 4

���expression

��multiplicative

primary

(9-2) を入れてやればいい

23 of 40

3 * 5 + (9-2) * 4

���expression

��multiplicative

primary

expression をカッコで囲ったものも、primary として認めれば良い

24 of 40

Step 4.

  • eat_primary を改修
  • 「開きカッコを食い、expressionを食い、閉じカッコを食う」という動作を eat_primary に追加せよ
  • これをやるだけで、任意の深さのカッコに対応できる

25 of 40

26 of 40

� *�multiplicative

()

primary

� +�expression

� *�multiplicative

()

primary

�� +�expression

� *�multiplicative

primary

27 of 40

28 of 40

今回の実装のすごいところ

  • 入力データの複製を一切していない
    • 長大な入力が来ても安心
  • 所有権システムのおかげで、普通に書いただけなのに速いプログラムが完成

29 of 40

str

サイズ不定

&

String

let s = String::from("hello world");

let world = &s[6..11];

String の所有する別荘

「先頭を食いちぎる」と表現してきたが、単に「どこを先頭にして何文字眺める?」という情報を編集しているだけであり、入力データが全複製されたりはしていない

30 of 40

長大な入力が来ても安心!

  • ほんとうに?
  • 試してみよう

31 of 40

長大な入力を作る

32 of 40

33 of 40

2GBのテキストファイル

34 of 40

2GBが16秒!

デバイス名 LAPTOP-BKHPSENK

プロセッサ Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz 1.61 GHz

実装 RAM 16.0 GB (15.8 GB 使用可能)

デバイス ID 769FF632-9117-48E2-8F37-56A30DA7D528

プロダクト ID 00325-81798-74771-AAOEM

システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ

ペンとタッチ このディスプレイでは、ペン入力とタッチ入力は利用できません

35 of 40

Rust とは?

(実行速度が)速い!

(メモリやスレッドに関して)安全!

(エラーメッセージやツールが)親切!

36 of 40

Rust とは?

  • とにかく実行速度が速い。
  • モダンな文法が一通り入っている。
  • OSからWebアプリケーションまで幅広く実装できる。
  • ツール群がとても充実している。
  • 「安全性」が強力に担保されている。
  • エディションという考え方によって互換性を担保している。

「実践Rustプログラミング入門」p.2 より引用

便利

37 of 40

「知ろう」は今回で完結とします

  • Rust という言語の面白さを知ってもらう、という目的が一段落ついた

38 of 40

「知ろう」は今回で完結とします

  • Rust という言語の面白さを知ってもらう、という目的が一段落ついた
  • ここからは「具体的にこういうのをやりたい」の質疑とかが増えるであろう

39 of 40

ということで

来週以降は tamaron さんにバトンタッチし、

    • rustcをざっくり解説
    • Rustonomiconから適当な話題を拾って、rustcを動かして実験したりする
    • clippy, rustc AST
    • Rustで書かれたプロジェクトのソースコードリーディング
    • OSSコントリビューションの話
    • Rustの型システム

といった少々コアな話をやります

40 of 40