高速でメモリーセーフなプログラミング言語、Rustの特徴を紹介
メモリーセーフな低レベルプログラミング言語Rustを数回に分けて紹介してきたが、今回はRustのコアチームの一員であるCarol Nichols氏による解説動画を紹介したい。これまでCloudFlaireのエンジニアSteve Klabnik氏によるWebAssemblyとRustに関するセッション、DropboxがPythonからRustに書き換えた事例、Microsoftが開発したKubernetes上でWebAssemblyのコードを実行するKrustletの記事、IBMが社内システムをNode.jsからRustで書き換えた事例などによってRustがモメンタムを獲得しつつある大きな流れを紹介してきた。
今回紹介するセッションは、RustのコアチームのエンジニアでInteger 32というRustに特化したコンサルティング会社を経営するCarol Nichols氏によるもので、2019年4月にフィラデルフィアで開催されたPhilly ETE 2019(正式名称はEmerging Technology for Enterprise 2019)というカンファレンスで行われたものだ。
動画:Rust: A Language for the Next 40 Years - Carol Nichols
このセッションで使われたさまざまなデータは、以下のGitLabのリンクから参照することができる。
メモリーアンセーフなC言語
冒頭からアメリカにおける鉄道を例に挙げ、「いかに危険な仕事をなくしてきたのか?」を解説するNichols氏。ポイントは、当初アメリカの鉄道は、ブレーキのシステムを備えておらず、専任の技師がその都度、列車の屋根に登ってブレーキを掛けていたという点だ。そのため多くの技師が転落して怪我をしたり、命を落としたりしていたという。鉄道用のエアブレーキを開発したのは、エジソンと直流/交流の電流戦争を繰り広げた発明家George Westinghouseである。鉄道のエアブレーキが開発され、法制度としてすべての鉄道に装備されるまでに約30年が必要だったというのが、このパートでのメッセージだ。これはメモリーセーフではないプログラミング言語から、Rustのようなメモリーセーフなプログラミング言語が当たり前になるまでに一体何年かかるのか? というセッション最後の部分の問い掛けの伏線となる。
約11分後辺りから実際にRustに関する解説が始まるので、動画を視聴する際はそこから開始しても構わないだろう。ここからは比較対象となるC言語について解説が始まる。
C言語はメモリーアンセーフ、つまりメモリーセーフではないということが最初に強調されたが、具体的にはメモリーの解放、メモリーリーク、バッファーオーバーフロー、ヌルポインター、データレースなどの問題点が発生することを指摘した。
そしてここでもMicrosoftが行った調査、これまで開発したすべてのソフトウェアにおける脆弱性の約70%がメモリー関連であるという調査結果を引用している。このスライドで引用されている記事は、以下のZDnetの記事だ。
参考:Microsoft: 70 percent of all security bugs are memory safety issues
C言語でもメモリーセーフなコードを書くことは可能だが、それは常にコードを書いた後にチェックを行い、それを直すというものである。本質的にメモリーセーフなコードを書くという目的にC言語はまったく該当しないというのが、この部分のキーメッセージだ。
メモリーセーフなRust
次にRustの解説に移ったNichols氏は、ここまで解説してきた最大の問題点、メモリーセーフをどうやってRustが解決したのかを説明する。
ここではメモリーセーフにすることがRustの最大の目的であるとして、コンセプトとしての「オーナーシップとボローイング(所有権と借用)」を解説する。オーナーシップは文字通り、「変数がどこに属しているか?」を厳密に定義することで、メモリーセーフを実現するものだ。そしてボローイングとは、所属を変えずに借りる(Borrow)ことで変数へのアクセスを可能にするというものだ。
例として挙げられたソースコードではmainの中で使われたxという変数に格納されたhiという値は、その関数(ここではmain)の実行が終わると同時に解放されることを示している。
また次の例ではxをyに代入することでオーナーシップが移ってしまうために、その後で参照しようとしてもエラーになるということを示している。
エラーメッセージが実に細かいのもRustの仕様と言っていいだろう。
また次の例では「&x」という書き方で外部の変数からxへの参照を行う記述が示されている。
ここではxがスコープから抜けた瞬間に変数自体がクリアされており、それ以後の利用はできない。この辺りの所有権と借用についてはRustのメモリーセーフの根幹に関わるコンセプトである。より深く知るためには以下のドキュメントを参照されたい。
もう一度、Rustのメモリーセーフティーについてスライドでまとめているが、変数に対する不変/可変の扱いやnullがないこと、所有権と借用などの概念が他の言語と比べてユニークであるために、理解するための学習時間が必要であることは理解できる。
システム記述言語としてのRust
そして2番目に挙げたRustの特徴として「システムを記述する言語としてのRust」という側面だ。
ここではメモリーセーフティーであること以外にパフォーマンスが高いことが挙げられている。これは実行時に型チェックやガーベージコレクションなどが発生せずに、すべてがコンパイル時に行われることでデベロッパーが書いたコード以外のオーバーヘッドがないことに由来している。
ただ、弱点としてシンプルでないことを挙げている。これは前にも言及した所有権と借用のコンセプトを理解した上で、Rustに向いた書き方をしなければいけないという部分にも関わってくるポイントだ。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- WebAssemblyとRustが作るサーバーレスの未来
- データ処理ライブラリーの並列化/高速化をRustによって実装したWeld
- GoogleがAndroidの開発にRustを使った事例を解説するRust Dayを開催
- RustConfで見えてきたRustプロジェクトが最も大事にする価値とは?
- Rustと非同期ライブラリーTokioで作成した簡易版Redisを紹介
- Microsoftの年次イベントBuild 2020でメモリーセーフなプログラミング言語Rustを紹介
- IBMがRustを使ってNode.jsのプロジェクトを書き換え。その背景とは?
- RustNL 2024から、マシン間コミュニケーションをRustで実装したpostcardのセッションを紹介
- RustNLからマルチプラットフォームのアプリ開発のためのツールRobiusのセッションを紹介
- ISRGが推進するメモリーセーフなソフトウェアを増やすための地道なプログラムProssimoを紹介