Translate

2017年4月6日木曜日

Rust のすゝめ

最近Rustという言語にハマっているので簡単に紹介したいと思います。

Rustとは

公式サイトにかかれている通り、Rustは
  • Safety
  • Speed
  •  Concurrency
に焦点をあてたプログラミング言語です。CやC++のように低レベル処理を行うことができます。
ちなみに実行速度は爆速です。コンパイル時にLLVMを使って最適化されるため、Cと同程度の速度が出ます。

しかし、ただ速いだけではありません。Rustで書かれたプログラムはCやC++と異なり安全です。この安全性が Rustの1番の強みといっても良いでしょう。Rustは「所有権(Ownership)」という概念を取り入れ、安全性を担保しています。

所有権(Ownership)

まず所有権について話す前に下のような簡単なコードを見てみましょう。Rustを知らなくてもノリで読めると思います。

このコードはちゃんと動きます。ではさらにもう一回関数fを呼んでみましょう。

今回はエラーを吐かれてしまいました。
use of moved value: `a`
というエラーです。このエラー、実は所有権に違反したために生じたものです。 お気づきかもしれませんが、2つ目のプログラムにはバグが含まれています。1回目のfで引数のaはフリーされているため、もうaは何もデータを持っていません。なのでもう一回fにaを渡すことはできないのです。Rustは「所有権」という概念を用いることで、このようなメモリーに関するバグをコンパイル時に見つけることができます。これはセキュリティ上非常に重要なことです。

では2つ目のプログラムがなぜいけないのかを所有権という立場で説明します。4行目でaはデータの所有権を手に入れます。次に5行目でaが関数の引数xに代入されますが、このときデータの所有権はaからxに移ります。よってこの時点でaはmoveされます。なので6行目でもう一度aを使おうとするとコンパイラに
use of moved value: `a` 
と怒られるのです。

ただ所有権を手放すのではなく、使い終わったらデータの所有権を返してもらいたい時もあります。Rustはこのようなときのために借用(Borrow)という仕組みも用意しています。(詳しい説明はググッてください)

実は、この所有権という仕組みは単に安全性を保証するだけではなく、データ競合など並行性に関する問題も解決してくれるのです。1コアあたりの処理能力が頭打ちになりマルチコア化が進む今、並行性は非常に重要です。

その他便利な文法

安全性を付加したという時点ですでにRustの存在意義は十分なのですが、Rustの良い点はこれだけにとどまりません。生まれて間もない言語なので、最近流行っている文法をふんだんに取り入れています。全部挙げるときりがないので、お気に入りのものをいくつか紹介します。

enumとmatch

RustのenumはCのそれと少し違います。集合論的に言うと、structが型の直積であるのに対し、型の直和にあたるものがRustのenumです。
matchはCのswich-caseの拡張版で、enumとの相性が抜群です。サンプルコードを載せておきます。

このenumとmatchは、Rustのエラー処理でも使われています。エラーが起こるかもしれない関数の返り値を、「正常値の型」と「異常値の型」のenumとすることで、プログラマはmatchを使ってそれぞれの返り値に応じて動作を変えることができるのです。

IteratorとClosure

イテレーターはPythonとかでお馴染みのあれです。クロージャーはラムダ式のことです(正確には嘘)。サンプルコードとして「正の奇数のうち3で割ったあまりが1のものを小さいものから順に10個足し合わせた和」 を求めるコードを載せておきます。

最後に

本当はもっと書きたいことはあるけど、めんどくさいので書くとしてもまた後日。

0 件のコメント:

コメントを投稿