PR

高速でメモリーセーフなプログラミング言語、Rustの特徴を紹介

2020年6月3日(水)
松下 康之 - Yasuyuki Matsushita
2019年4月に行われたカンファレンスから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 next 40 years

Rust, a language for next 40 years

動画:Rust: A Language for the Next 40 Years - Carol Nichols

このセッションで使われたさまざまなデータは、以下のGitLabのリンクから参照することができる。

参考:rust-next-40-years

メモリーアンセーフなC言語

冒頭からアメリカにおける鉄道を例に挙げ、「いかに危険な仕事をなくしてきたのか?」を解説するNichols氏。ポイントは、当初アメリカの鉄道は、ブレーキのシステムを備えておらず、専任の技師がその都度、列車の屋根に登ってブレーキを掛けていたという点だ。そのため多くの技師が転落して怪我をしたり、命を落としたりしていたという。鉄道用のエアブレーキを開発したのは、エジソンと直流/交流の電流戦争を繰り広げた発明家George Westinghouseである。鉄道のエアブレーキが開発され、法制度としてすべての鉄道に装備されるまでに約30年が必要だったというのが、このパートでのメッセージだ。これはメモリーセーフではないプログラミング言語から、Rustのようなメモリーセーフなプログラミング言語が当たり前になるまでに一体何年かかるのか? というセッション最後の部分の問い掛けの伏線となる。

C言語について解説

C言語について解説

約11分後辺りから実際にRustに関する解説が始まるので、動画を視聴する際はそこから開始しても構わないだろう。ここからは比較対象となるC言語について解説が始まる。

メモリーに対して安全でないのがC言語

メモリーに対して安全でないのがC言語

C言語はメモリーアンセーフ、つまりメモリーセーフではないということが最初に強調されたが、具体的にはメモリーの解放、メモリーリーク、バッファーオーバーフロー、ヌルポインター、データレースなどの問題点が発生することを指摘した。

メモリーに対して安全ではないということで起こり得る問題点を列挙

メモリーに対して安全ではないということで起こり得る問題点を列挙

そしてここでもMicrosoftが行った調査、これまで開発したすべてのソフトウェアにおける脆弱性の約70%がメモリー関連であるという調査結果を引用している。このスライドで引用されている記事は、以下のZDnetの記事だ。

Microsoftのリサーチャーによる70%のバグはメモリー関連

Microsoftのリサーチャーによる70%のバグはメモリー関連

参考:Microsoft: 70 percent of all security bugs are memory safety issues

C言語は書いてからメモリーセーフにするやり方

C言語は書いてからメモリーセーフにするやり方

C言語でもメモリーセーフなコードを書くことは可能だが、それは常にコードを書いた後にチェックを行い、それを直すというものである。本質的にメモリーセーフなコードを書くという目的にC言語はまったく該当しないというのが、この部分のキーメッセージだ。

メモリーセーフなRust

次にRustの解説に移ったNichols氏は、ここまで解説してきた最大の問題点、メモリーセーフをどうやってRustが解決したのかを説明する。

メモリーセーフを実現するのがRustの最大の目的

メモリーセーフを実現するのがRustの最大の目的

ここではメモリーセーフにすることがRustの最大の目的であるとして、コンセプトとしての「オーナーシップとボローイング(所有権と借用)」を解説する。オーナーシップは文字通り、「変数がどこに属しているか?」を厳密に定義することで、メモリーセーフを実現するものだ。そしてボローイングとは、所属を変えずに借りる(Borrow)ことで変数へのアクセスを可能にするというものだ。

オーナーシップとボローイングを説明

オーナーシップとボローイングを説明

例として挙げられたソースコードではmainの中で使われたxという変数に格納されたhiという値は、その関数(ここではmain)の実行が終わると同時に解放されることを示している。

簡単なRustのコードで解説

簡単なRustのコードで解説

また次の例ではxをyに代入することでオーナーシップが移ってしまうために、その後で参照しようとしてもエラーになるということを示している。

let y = x; はオーナーシップの移動。

let y = x; はオーナーシップの移動。

エラーメッセージが実に細かいのもRustの仕様と言っていいだろう。

エラーメッセージにオーナーシップとボローイング(所有権と借用)が明示される

エラーメッセージにオーナーシップとボローイング(所有権と借用)が明示される

また次の例では「&x」という書き方で外部の変数からxへの参照を行う記述が示されている。

別の例で所有権と借用を説明

別の例で所有権と借用を説明

ここではxがスコープから抜けた瞬間に変数自体がクリアされており、それ以後の利用はできない。この辺りの所有権と借用についてはRustのメモリーセーフの根幹に関わるコンセプトである。より深く知るためには以下のドキュメントを参照されたい。

参考:プログラミング言語Rust

もう一度、Rustのメモリーセーフティーについてスライドでまとめているが、変数に対する不変/可変の扱いやnullがないこと、所有権と借用などの概念が他の言語と比べてユニークであるために、理解するための学習時間が必要であることは理解できる。

Rustのメモリーセーフティーのまとめ

Rustのメモリーセーフティーのまとめ

システム記述言語としてのRust

そして2番目に挙げたRustの特徴として「システムを記述する言語としてのRust」という側面だ。

Rustの特徴の2番目はシステム記述用言語としての側面

Rustの特徴の2番目はシステム記述用言語としての側面

ここではメモリーセーフティーであること以外にパフォーマンスが高いことが挙げられている。これは実行時に型チェックやガーベージコレクションなどが発生せずに、すべてがコンパイル時に行われることでデベロッパーが書いたコード以外のオーバーヘッドがないことに由来している。

高いパフォーマンスを誇るRust

高いパフォーマンスを誇るRust

ただ、弱点としてシンプルでないことを挙げている。これは前にも言及した所有権と借用のコンセプトを理解した上で、Rustに向いた書き方をしなければいけないという部分にも関わってくるポイントだ。

欠点はシンプルに見えないこと。だがコンセプトを理解すれば分かりやすいとも言える

欠点はシンプルに見えないこと。だがコンセプトを理解すれば分かりやすいとも言える

  • 1
著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています