(Photo by:@sage_solar)
はじめに
新しいプログラミング言語は好きですか?それなら、Rust(ラスト)を使ってみましょう。Stack Overflowのアンケートによると、Rustは2015年、2016年と2年連続で、最も愛されているプログラミング言語に選ばれています。
今、最も注目されている言語だといえるでしょう。いったい、なにがここまでエンジニアを惹きつけるのでしょうか?
この記事では、新しい言語を学びたい方のために、Rustの概要と特徴をお伝えします。ぜひご一読して、Rustがどんな言語か理解しておきましょう。
Rustの概要
公式サイトURL:https://www.rust-lang.org/
レポジトリURL:https://github.com/rust-lang/rust
Rustは、オープンソースのシステムプログラミング言語です。2006年にグレイドン・ホアレによって開発が開始され、2009年にはFirefoxで有名なMozillaが開発に参入しました。その後、着々とリリースを重ねていき、2015年5月16日に待望のバージョン1.0に到達しました。以降も、活発に開発が続けられており、2016年5月現在の最新バージョンは1.9です。
関数型プログラミング、並列アクターモデル、オブジェクト指向プログラミング、手続き型プログラミングをサポートするマルチパラダイム言語ですが、主に関数型に重点を置いています。システムプログラミング言語として、安全性、速度、並行性の3つを実現することがRustのゴールです。現在のところ、Windows、Mac、Linux向けのコンパイラが公式サイトからダウンロード可能です。
Rustの最大の特徴
ここでは、Rustの最大の特徴である、所有権システムについて説明します。他の言語にはない、この独特の機能がエンジニアを惹きつけているのではないでしょうか?
補足:
「所有権という考え方はC++に既にあるのでは」というご意見をいただき弊社でも再調査いたしました。
Rust のドキュメントでは Ownership is Rust’s most unique feature だと書かれています。
Understanding Ownership – Understanding Ownership – The Rust Programming Language
また、このドキュメントの issue に Ownership the most unique feature? · Issue #674 · rust-lang/book というのが上がっていて、同じように「C++ には移動セマンティクスがある」というようなことで most unique ではないのでは?とのコメントがありました。
しかし most unique feature という文言は別のものに修正されず、そのまま close されています。
ただ「most unique」= 「only one」としてしまったことは語弊がありましたので「only one」としていた画像の方は削除いたしました。ご指摘ありがとうございました。
C++のメモリ管理の問題点
C++では、しばしば解放済みのメモリにアクセスしたり、未割り当てのメモリにアクセスしたりしてしまいます。これは、メモリの管理が開発者に委ねられているためです。メモリの安全性が脅かされると、システム全体を危険にさらしてしまうことにもなりかねません。そのため、Rustでは、メモリの安全性を保証するために、所有権システムを導入しました。
所有権システムとは?
Rustでは、変数へ値を割り当てることを”変数束縛”といいます。値Xを変数Aに束縛すると、その値Xは変数Aによって「所有」されます。その後で、変数Aが所有している値Xを別の変数Bに束縛した場合、自動的に「所有権」が譲渡され、変数Aから値Xを参照することはできなくなります。これは、「ムーブセマンティクス」と呼ばれるRustのデフォルトの動作です。なぜこうなっているかというと、同時に存在する参照をひとつのみに制限することにより、メモリの競合を避け、メモリの安全性を保証するためです。
プリミティブ(基本)型は例外
上述した通り、ムーブセマンティクスにより、変数束縛時にはデフォルトで所有権が譲渡されるとお伝えしました。しかし、プリミティブ型ではデフォルトの動作が異なります。例えば、数値リテラルでは新しい変数に束縛しようとすると、デフォルトでは値そのものがコピーされます。これは、JavaやC#などの値型の動作と同じなので違和感はないですね。なお、この動作はトレイトと呼ばれる、他の言語でいうインターフェイスのようなもので実現されています。
所有権を借りる
デフォルトで所有権が譲渡されることは、非常に強力な機能です。しかし、これは関数に引数を渡す際にも起こります。つまり、そのまま引数に渡すと所有権が引数に譲渡され、呼び出し元には所有権がなくなってしまうのです。これでは、いちいちメソッドから再び所有権を返してもらわなければなりません。
この問題を解決するために、「借用」という機能が役立ちます。簡単に言うと、参照渡しのようなものです。しかし、Rustではいくつかの制限があります。まず、デフォルトで参照渡しされた引数は変更できません(イミュータブル)。ミュータブル(変更可能)な参照として渡すこともできますが、ひとつの値に対して、ミュータブルな参照とイミュータブルな参照を同時に持つことはできません。
なぜこうなっているかというと、変更可能な値に対して、ふたつ以上の参照が存在するとデータ競合が発生する可能性があるからです。これは、並列プログラミングをサポートするRustでは非常に重要なことです。所有権システムによって、安全に並列性を得ることができます。
参照のライフタイム
所有権システムには、もうひとつ重要な概念があります。それは、「ライフタイム」です。すべての参照はライフタイムを持っています。つまるところ、変数のスコープのようなもので、ライフタイムが終了した参照は使用できなくなります(コンパイルエラーになる)。ライフタイムには、推論がサポートされているため、すべてのライフタイムを明示的に記述する必要はありません。推論できない場合にのみ記述すればよいでしょう。
まとめ
Rustは、今も成長を続ける非常にモダンで先進的な言語です。今すぐにとはいきませんが、将来CやC++を置き換える言語に成長していくかもしれません。仕様自体も、バージョン1.0を経て、かなり安定してきています。あなたもそろそろRustを始めてみてはいかがでしょうか?
本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
No Comments