現在プレビュー版として公開されているRust/WinRTは、C++/WinRTなど他の言語プロジェクションと同じように、自然で慣用的な方法によるWindows APIの呼び出しを可能にする、Windowsランタイム用の言語プロジェクション(Language Projection)である。
Rust/WinRTでは、APIを記述したメタデータから直接オンザフライで生成されたコードを使用した、過去、現在、将来にわたる任意のWinRT API呼び出しをRustパッケージに格納することで、それらをRustモジュールであるかのように呼び出すことが可能になる。
Rust/WinRTを使用すれば、Windows用のアプリやコンポーネントだけでなく、NTサービスやWindowsドライバの開発も可能になる、とMicrosoftのプリンシパルソフトウェアエンジニアであるKenny Kerr氏は説明している。XmlDocument
クラスを使ってXMLドキュメントをパースするには、次のようにすればよい。
use windows::data::xml::dom::*;
let doc = XmlDocument::new()?;
doc.load_xml("<html>hello world</html>")?;
let root = doc.document_element()?;
assert!(root.node_name()?== "html");
assert!(root.inner_text()?== "hello world");
Rust/WinRTベースのコードの外見を可能な限り慣用的なRustに近付けようとするMicrosoftの努力は、スネークケースからキャメルケースへの自動変換や、上記コードにもあるようなエラー伝搬を容易にするためのRust null合体演算子"?
"のサポートなどによく現れている。
InfoQが伝えたように、Microsoftはかねてから安全なソフトウェアを記述するためのソリューションとしてRustを検討している。同社エンジニアのRyan Levick氏とSebastian Fernandez氏が前回のBarcelona RustFestで、MicrosoftとしてはRustに対して、パフォーマンスに優れたセキュリティクリティカルなコンポーネントを安全に記述可能になるように期待しているが、RustコミュニティがRustとそのツールチェーンでWindowsをファーストクラスサポートするには、乗り越えなくてはならないハードルがたくさん残っている、という説明をした。
今回の新プロジェクトは、Microsoftが自社の開発において、その意義さえあればどこであっても、Rustの採用を真剣に考えていることを証明するものと思われる。
Microsoftは長い間、私たちの活動を支えるバックボーンとして多くをC++に依存してきましたが、セキュリティに関してはいくつかの課題があります。[...] Rustは面白い言語です。多くの面でC++と似ていますが、コンパイル、ランタイムモデル、型システム、確定的終了処理(deterministic finalization)など、必要なことはすべて行われています。独特の学習曲線を持つ一方で、C++プロジェクトで苦労を重ねてきた最も厄介な問題のいくつかを解決する可能性も持っていますし、メモリ安全性と並列処理の安全性を基本原則として1から設計されています。
Rust/WinRTをプロジェクトで使用するには、Cargo.tomlファイルに依存関係として加えればよい。
[dependencies]
winrt = { git = "https://github.com/microsoft/winrt-rs" }
これにより、任意のWindowsモジュールをインポートできるようになる。
use winrt::*;
import!(
dependencies
os
modules
"windows.data.xml.dom"
"windows.foundation"
"windows.ui"
);
Rust/WinRTはまだ早期プレビュー版だが、すでにRobert Mikhayelyan氏のMinesweeperクローンを実行可能な完成度を持っているので、これを使用方法の入門として使用することも可能だ。