開発現場で生まれた戦うプログラミング言語

Rustは研究開発レベルのプロジェクトではなく、最初からC++コンポーネントの書き換えに使える実用的なプログラミング言語として設計され つまり、の開発と実際のソフトウェア開発とを繰り返しながら『現実的に』進歩してきた。理念や設定思想は優れていても実際には使いにくいプログラミング言語ではなく、最初から現場で使うことを目的として開発されてきたという強みのあるプログラミング言語だ。これこそが、今後シェアを増やしそうな理由の1つである。

Rustを使っているソフトウェアはいくつかあるのだが、特に生みの親ととも言えるMozillaと、ソフトウェアベンダーの巨人であるMicrosoftの取り組みに注目しておきたい。この2つの組織が取り組んでいる内容は、Rustが今後シェアを増やしそうな大きな根拠に成り得るものだ。

Firefoxのブラウザエンジン「Servo」

RustはMozillaで生まれた。それは、Rustが必要だったからだ。Firefoxを進化させる上で、Rustは必須だった。

Internet Explorerを抑え、長期にわたって人気ナンバー1を維持してきたWebブラウザ「Firefox」は、Google Chromeの登場でその地位が危うくなってきた。最初から複数のプロセスで動作するというマルチプロセスアーキテクチャを採用していたGoogle Chromeは、マルチコアプロセッサで高い性能を発揮できるという特徴があった。これに比べ、シングルコア時代に設計されたコードがベースになっているFirefoxは、うまくマルチプロセス化を進めることができないでいた。

かといって、Mozillaが何もしなかったわけではない。Firefoxをマルチプロセス化するプロジェクトを立ち上げ取り組みを続けた。しかし、その取り組みは成功しなかった。Firefoxがマルチプロセス化に手こずっている間、高速化の実現とエクステンションが豊富にそろっていくGoogle Chromeはシェアの拡大を続け、現在ではデスクトップでもモバイルでもChromeがナンバー1のWebブラウザである。

既存のコンポーネントを並列化するのは簡単なことではない。例えば、Mozillaは2017年まで、CSSルールをページに適用するスタイルコンポーネントを並列化して高速化する開発に取り組んだ。CSSルールの適用は並列計算しやすく、並列処理で高速化を果たす理想的なユースケースだ。こうしたこともあって、C++を使って新しいスタイルコンポーネントの開発が取り組まれたのだが、結局この取り組みは失敗に終わってしまった。2つの取り組みがあったが、いずれも失敗している。

  • Servoブラウザエンジン|Mozilla

    Servoブラウザエンジン|Mozilla

そこで、MozillaはRustという新しいプログラミング言語を使って、Firefoxの主要なコンポーネントを並列化する取り組みを始める。最も大きな成功を収めたのは、新しく開発されたFirefoxのブラウザエンジン「Servo」だ。これは、従来の実装で言えば、GeckoやWebKit、Blink、EdgeHTMLに相当する、いわゆるWebブラウザの心臓部分である。

MozillaはServoの開発を成功させ、高速なブラウザエンジンを手に入れた。先程のスタイルコンポーネントもRustで実装された。こうした新たなエンジンを搭載した最新のFirefoxは、Chromeに匹敵するスピードを実現している。

FirefoxはもともとC++で開発されている。C++でアプリケーションやシステムを開発したことのあるプログラマーであれば、C++を使う時のメモリ管理の難しさや並列処理の難しさは身を持って知っているだろう。ちょっとしたコーディング忘れやミスがバグに繋がり、脆弱性にもなりうる。

RustはこうしたC++の抱える問題を解決し、C++の開発者が取り組みやすくて、メモリ関係のバグが発生しにくく、さらに並列処理が簡単に実現できることを目指して開発が行われた。Servoを開発するためにその機能が必要だったからだ。

Servoブラウザエンジンは決して小さなソフトウェアではない。このソフトウェアの開発を通じて、RustコンパイラやRustそのものの開発も進められた。ServoとRustの開発が相互にエコシステムを構築し、お互いに進歩してきたわけだ。

現在、Firefoxの主要なコンポーネントはRustで開発され、広範囲に及ぶ並列処理が実現している。MozillaはRustを適用する範囲をさらに広げる取り組みを進めており、今後もFirefox開発がRust開発のテストベッドであり続けることになる。常に現場の需要がベースにあるわけで、コンパイラ開発において心強い。

WindowsシステムコンポーネントをRustで再実装

一方、Microsoftは2019年11月17日(米国時間)、「Using Rust in Windows - Microsoft Security Response Center」において、Windowsの低レベルシステムコンポーネントをRustで再実装する取り組みを行っていると発表した。まだ実験段階だが、再実装に取り組んでいるエンジニアの反応は上々だ。最終的にどうなるかはわからないが、Microsoftが将来的にWindows 10のシステムコンポーネント開発をRustへ切り替える可能性もある。

  • Using Rust in Windows - Microsoft Security Response Center

    Using Rust in Windows - Microsoft Security Response Center

Microsoftは発表の中で、RustはC++プログラマーにとって学習しやすく取り組みやすいプログラミング言語だったと評価している。さらに、メモリセーフで、すでにVisual Studio Codeで利用できるエクステンションも存在しており使いやすいともコメントしている。

WindowsのシステムコンポーネントはC++で開発されている。このため、システムコンポーネントをRustで書き換えることは相性がよい。しかも、C++よりもメモリ関連のバグが少なくなり、脆弱性となるケースも減るものと考えられる。

そして、もう1つ押さえておきたいのが「Project Verona」だ。これは、最近Microsoftが公開したプログラミング言語で、Rustが実現したアイディアを検証するようなプログラミング言語となっている。Veronaはあくまでも実験的なプログラミング言語であり、将来的にWindowsのシステムコンポーネントを書き換えるためのものではないと考えられている。MicrosoftがRustのアプローチに強い関心を持っていることを示す論拠と言えるだろう。

Microsoftが、長きにわたって使ってきたC++を置き換える便利なプログラミング言語としてRust、またはRustが実現したアイディアに高い関心を持っていることがわかる。

C++プログラマーはRustに有利

CやC++でソフトウェアを開発したことのあるプログラマであれば、CやC++においてはメモリ管理に注意しないと苦労することを知っているだろう。メモリ範囲の計算を1バイトでも間違えると、深刻なバグが生まれることがある。コンパイラのバージョンやオペレーティングシステムのバージョンが変わると、これまで動作していたものがおかしくなることもよくある。

しかし、CやC++はある程度使えるようになると快適だ。しかも、生成されるバイナリが結構高速に動作する。他のプログラミング言語に移って処理が遅くなるというのは耐え難いものがある。そこで、注目してもらいたいのがRustだ。RustはC++からの移行が比較的簡単と考えられているうえ、生成されるバイナリが速い。並列化も簡単にできる。C/C++プログラマーにとって新天地となる可能性があるわけだ。

当然、Rustはこれまで登場した他のプログラミング言語のように、シェアが低いままかもしれない。しかし、Rustの新たな概念は学習するだけでも価値がある。勉強がてら取り組んで見るだけでも悪くないだろう。