YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

Rust入門した感想

f:id:yuji-tanaak:20191104194233j:plain

はじめに

夏頃から部内メンバの発案に乗っからせてもらい*1実践Rust入門でRustとHello Worldしました。最近はFizzBuzzを実装して遊んでいます。入門はできたと思うので、ここまでの感想をまとめます。

ja.wikipedia.org

やったこと

  1. 実践Rust入門 1部読了
  2. パーセプトロンの実装
  3. FizzBuzz実装
  4. Rust.Tokyo2019聴講

1.実践Rust入門 1部読了

Rustの特徴から始まり、環境構築、クイックツアー、型、基本構文、所有権システム、トレイトという流れです。終始図表と丁寧な説明をしてくれております。TRPLと併用しながら読み進めました。Rustの特徴的な機能である所有権システム及びトレイトはまだまだ理解不十分で、実践を通して修得を目指します。

特徴(これが全てではない)

  • 起源はMozillaのHoare氏の個人プロジェクト(2006~)で、Firefoxの再構築をすることが目的からスタート
  • 2015年にver1.0がリリース
  • トップクラスのパフォーマンス、これはマシンコードへコンパイル、静的型付け、ゼロコスト抽象化、GC無しにより実現
  • 安全なシステムプログラミング言語
  • 未定義動作をせず型安全!
  • 不正なメモリ操作をせずメモリ安全!
  • マルチスレッドプログラミングでデータ競合しないことを保証!
  • コンパイル時に様々なバグを検知してくれる

  • スライス型でpythonみたいに配列アクセス可能
  • イテレータも便利*2
  • Result型、Option型でエラーハンドリング
  • 列挙型はバリアントに値をもてる
  • 型変換時はシャドウイングが便利

所有権システム(所有権、借用、ライフタイム)

  • 所有権システムにより、GC不要、メモリ安全性保証、リソース自動開放を実現
  • 値ごとに所有権が1つだけあり、その状態によってリソース開放か判断される
  • 借用によって所有権を渡さずに値を貸し出す

トレイト

  • トレイトはRustでアドホックポリモーフィズムを実現する手段
  • トレイトは型に対して実装すべきメソッドを定義したもの
  • トレイトはある型が提供しなければならない機能をRustコンパイラに伝える言語機能

2部

まだ読んでません。少し手を動かしたら戻ってきたいと思ってます。特に最後のFFI(Foreign Function Interface)が気になってます。

2.パーセプトロンの実装

ゼロから作るDeep Learningのpython実装をRustで実装してます。Rustで行列を扱う方式はいくつかあり、今回は rusty-machineを利用しました。ndarrayも良いみたいです。3章以降もRustで実装してみたいなと思いつつ止まってます。
Rust 製の汎用機械学習ライブラリ rusty-machine - にっき
[Rust] ndarray で行列を定義する方法一覧 - Qiita
RustでDeepLearning入門 - Qiita

3.FizzBuzz実装

手頃な課題として、FizzBuzz実装もしてみました。ベタ書きから始まって、関数化、トレイトの利用などいろいろ試せます。テストとかパフォーマンス周りもここで体験したいなと。
FizzBuzzから始めるコードの再利用性を高めるトレーニング - Qiita
[Rust] RustでFizzBuzz書いてみる - Qiita

4.Rust.Tokyo聴講

2019年10月26日にRust.Tokyo2019が開催され、参加してきました。どれもハイレベルな講演でついていけたりいけなかったり。Rustコミュニティの状況、エコシステム、事例紹介などRust現場を肌で感じました。そこにいる方たちはRustを愛しており、私もRustを学び楽しんでいきたいと感じました。
また最終講演(Contributing to Rust)で、Rustコミュニティの方たちは0からのプロジェクトに興味があったとのことで、なるほどなぁと思いました。*3
企画、運営、登壇者、参加者の皆様素敵な時間をありがとうございました!
medium.com
rust.tokyo

展望

Rustはこれまでのプログラミング経験の総復習から始まり、そこからRust特有の機能を学んでいっていると感じます。ただ、私は関数型プログラミングの経験が無く、そこがもったいなかったなと思ってます。Rust入門の前に、C言語→Java/C++→関数型言語→Python/Rubyみたいな流れがあるとスムーズに進む気がしています。Rustを考えるとき、他の言語との比較で言語化したほうが理解しやすいためです。
展望としては、RustでFizzBuzzや○XゲームをRustの記法、機能を意識しながらプログラミングしていきます。これまでもプログラミングしてきましたが、Rustを通していかに自分が適当に何も考えず場当たり的に実装していかを痛感しました。この機会になんとかします。そして、DeepLearningの実装やFFIを用いた既存コードのRust置き換えなどに繋げていきたいです。
今週末はRust-Kansaiがあるのでそれに行ってきます。

*1:一緒に勉強させてもらっているメンバは皆ハイレベルで楽しい。皆様ありがとうございます。特に発案者のTさん。

*2:らしい。私はまだ恩恵を体験できていません。

*3:既存の何かがあるとそれをベースに進められるから資産を活かせるというメリットの反対に負債を考慮しないといけないというデメリットもある。