🤝

ElixirからRustが使い易くなった話

2022/03/20に公開

先日ElixirコミュニティでRustler Precompiledというパッケージがリリースされました。

以下では、このRustler Precompiledの嬉しいところやElixirコミュニティにとっての意味について書いてみたいと思います。

誰がどう嬉しいものなのか

まず、Rustler Precompiledがあると誰がどう嬉しいか。

Hexパッケージ利用者が、

  • Rustが使われているかを意識せず
  • 短いコンパイル時間で

Rustが使われたパッケージを使えるようになります。

解決している課題

これまで、ElixirからRustを使う場合には主にRustlerが使われていました。これは、Erlangが提供してくれているNative Implemented Functions(NIFs)を利用して、RustのプログラムをElixirにやさしい形で利用できるようにするライブラリです。

ただし、Rustlerを使って作成されたパッケージを使う場合、その利用者もElixirプログラムのコンパイル時にRustコンパイラを用意・コンパイルする必要がありました。これに対して、利用者がRustコンパイラを用意せずに済むよう、Rustlerの上に規約を定めたものがRustler Precompiledです。

どう実現しているか

Rustler Precompiledが定めている規約は以下のようになります。

  • パッケージ作者が事前にRustのコードをクロスコンパイルする
    • 成果物のバイナリを特定のURLで公開する(GitHubのRleasesなど)
    • hexには、チェックサムをふくめて公開する
  • パッケージ利用時Rustler Precompiledにより以下が行われる
    • 上記のURLから環境にあったバイナリをダウンロード
    • チェックサムの検証
    • バイナリを利用

パッケージ作者にとっては、追加の作業が発生してしまいます。しかし、利用者はRustコンパイラも不要になりますし、Rustのコンパイルがない分コンパイル時間が短くなります。

どんな意味があるか

Rustlerのおかげで、今までも一部のコードをRustで書いたり、Rustコミュニティの力を借りることはできたわけですが、それが利用者にやさしい形でできるようになります。なので、Rustを利用したHexパッケージの開発や利用がより盛んになることが期待されます。

実際にRustler Precompiledが利用されているものとしては、

などがあります。特に、CPU-intensiveな処理や、実装が重いものだったりすると価値が大きそうです。

気になる点としては、チェックサムが正しいとしても、それはビルド時から改変されていないというだけで、パッケージ作者に悪意があれば悪意のあるバイナリの可能性もあるところです。それも、コードよりも分かりにくい形で入る可能性があります。コードの場合でも同じではありますが、パッケージを使う際には開発の状況を調べたり、リスクを認識しながら使う必要があると思います。

mjmlにPRをだしてみた

HTMLメールのつらい部分を隠蔽してくれるmjmlというテンプレート言語があります。Elixirコミュニティにも、Rust実装を利用したadoptoposs/mjml_nifがあります。私も利用を考えていたところだったので、こちらにRustler Precompiledを使うように変更するPRを出してみました。Rustler Precompiledの導入はパッケージ作者にとっては手間ではあるので、貢献できることがあるのではないかなと考えました。結果、快く受け入れていただけて、よかったです。

おわりに

以上です。Rustler Precompiledのおかげで、ElixirからRustを利用するのがパッケージ利用者にとって簡単になりました。Rustコミュニティと共に、Elixirコミュニティも面白い形で発展していくといいですね!

Discussion