ensembl API を呼び出す CLI を Rust で書いた/ ツールを Rust で書く意味

バイオインフォマティクスのアドベントカレンダーですが、私はこちらの分野の研究者ではありません。プログラマです。
知り合いからデータベースからデータを引っ張ってくるのに簡単な方法はないかと頼まれ、 [ensembl](http://ensemblgenomes.org/) のデータベースからデータを取得する CLI を作ったお話です。
この CLI を書いた言語 Rust についてと、科学分野での Rust 利用について考えたいと思います。

# 作ったもの
ensembl_api_cliという名前で Github にソースコードと実行ファイルを公開しています。
（すみません、まだライセンスを明示していないです...)
https://github.com/kannapoix/ensembl_api_cli


# 研究者のためのツールをどのような言語で書くべきか
Python は統計/ 計算系のライブラリーが豊富らしく、科学の現場で多く使われているイメージがあります。
ちょっと調べてみると、サーバー側では C++ とかが多いのでしょうか。

## 困ること
ツールを使う際になんと言っても困ることはインストールなどの環境構築ではないでしょうか。
CondaだとかAnacondaだとか Python には2系と3系があるだの、Docker、Singularity などコンテナと呼ばれる技術があるらしいなど...
研究とは全く別のところで悩まないといけない状況だと思います。

## どのようなツールが理想か
いままでみなさんがツールを使われてきた中で、さまざまなことを感じたと思います。

- インストールが簡単
- 使い方が簡単
- 処理速度がはやい
- バグらない

このようなツールがどこかにないものかと...。
今回は主にインストールが簡単なツールをつくることに注目します。

### Web アプリか、CLIか

使いやすさの観点からは Web アプリであることは大きなメリットがあります。
まずインストールが不要です。
また Web アプリは多くの人に馴染み深いです。
ただCLI のツールと比較すると、同じことをする場合作成には時間がかかります。
CLI ツールには Web ベースのツールと比較して次のようなメリットがあります。

- CLI ツール同士は連携しやすい
- 使い方を共有しやすい
- 設定が共有しやすい

たとえば、使い方を誰かに共有する際に、web ベースのアプリの場合スクリーンショットを撮影し、書き込んでといったことをする必要がありますが、CLI は コマンドの文字列を共有するだけで十分です。
設定を共有する場合にも、CLI であれば設定ファイルをコピーして共有すれば済むところを、web の場合は画面で同じように設定し直さないといけないでしょう。(設定のアップロード機能やチームとしてのログイン機能があればよいですが、そのような機能を追加するのは時間がかかります。)
Linuxコマンドの多くは、パイプを経由して実行結果を別のコマンドに渡すことができるため、あるツールで取得した結果を使って別の処理を行うことが容易です。
Web の場合、一度結果をファイルとして出力して別のアプリに再度アップロードしなければいけません。

このようなことから、まず、第一に CLI のツールが存在すべきだと思います。 Web は余裕がでてきてから考えるべきでしょう。

## CLI をどの言語で書くか
ではどの言語でツールを書くべきでしょうか。
ensembl には Perl で書かれた API を呼び出すツールがあるようでした。
しかし、それを実行するには手元に Perl の実行環境が必要です。
Perl, Python, Ruby といったスクリプト言語は、ツールを作成する側にとっては手軽に作成できてよいと思われるかもしれませんが、ツールの配布は簡単ではありません。さまざまな OS/ アーキテクチャに合わせて環境構築手順を用意しなければなりません。そしてそれ通りにやってもうまくいかないことも多々あるでしょう。
このような言語は、ユーザーにとってインストールのハードルをあげてしまっています。

### 配布のアプローチ
ユーザーが実際にツールを使うまでに必要な手順を限りなく減らすために次のようなアプローチが必要です。
#### 実行ファイルの配布
１つ目のよりよい選択肢は、実行ファイルを作成することができる言語を選択することです。
C, C++, Go, Rust といったコンパイルして実行ファイルを作成するタイプの言語を用いることで、Windows, Mac, Linux など主要な実行環境に応じた実行ファイルを作成することができ、ユーザーはファイルをダウンロードして配置するだけでツールを使うことができます。

#### WASI
もう一つは [WASI](https://wasi.dev/) と呼ばれる規格です。
これはかつて Java が目指した 「Write once, run anywhere」（一度書けばどこでも動かせるプログラム)をついに実現できるかもしれない可能性のあるプロジェクトです。
WASIは、一つの実行ファイル([WebAssembly](https://webassembly.org/))があらゆるコンピュータで実行できるようになる規格を目指しています。
実行環境に依存せず、配布する側もユーザーも一つの形式の実行ファイルを扱えばいいので、手間が大幅に削減されます。
[Bringing WebAssembly outside the web with WASI by Lin Clark - YouTube](https://www.youtube.com/watch?v=fh9WXPu0hw8)

WASIはまだ始まったばかりで、本格的に実用できる段階ではありません。

ではこれを実現するのに最適な言語はどの言語でしょうか。
候補になる言語に Rust があります。


# Rust
Qiita にもたくさんと記事がありますので、簡単に~~(雑に)~~紹介すると

- 比較的新しい言語
- 速い
- 安全
- 学習コストが高いとよく言われる

こんな言語です。

## Rust の嬉しいところ
これまで話した配布のしやすさという観点からは、

- 実行ファイルにコンパイルできる
- クロスコンパイルも容易
- WebAssembly/ WASI に積極的で環境が整っている

ことからツール作成に適した言語であると思います。

ユーザーだけでなく、開発側も嬉しいことがあります。
Rustは比較的新しい言語です。
モダンな構文があり、よくできたコンパイラやパッケージマネージャが存在するため、開発者の開発効率もあがります。
またドキュメントの仕組みがよくできており、私の少ない経験の中では、公式のドキュメントを読むだけで使えるライブラリがほとんどでした。
私は各分野の専門ではありませんが、統計系や画像処理、機械学習などのパッケージもそれなりに使いやすいものが揃っているらしいという話をよく聞きます。
このような記事もありました。
[Rust for neuRo-enthUsiaST](https://ushitora.net/archives/1120)

学習コストが高いことや、CLIに Rust はオーバースペックだといった考え方もあるかもしれません。
もちろん内容によりますが、 CLI 作るくらいなら少し学べばかけますし、配布はスクリプト言語より圧倒的に楽です。
私は Rust 初心者ですが、まあなんとか書いています。

このように Rust は

- クロスコンパイルできて配布が簡単
- WASI に積極的で今後さらに便利になる可能性が大いにある
- 言語仕様や開発環境周りがどうやら C++ よりいいらしい
- そして C++ 並に速く、メモリ効率よく動作する

という多くのメリットがあります。

## Bioinfomaticsでの Rust
この分野で Rust を使っていこうというプロジェクトの中には、[Rust-Bio](https://rust-bio.github.io/)というものがあるようです。
個人ブログではありますが、なぜ C++ ではなく Rust なのかついて書かれた記事もありました。
[Why I stopped C++](https://blog.pierre.marijon.fr/why-i-stopped-c/)


もちろん言語は適材適所ですが、なにかツールを書く機会があるかたは、Rust を言語として検討してみてはいかがでしょうか。

# Goはどうなの？
新しく、わりかし速く動作して、型があって、クロスコンパイルできて、というと Go も候補になりうるでしょう。
ここでは比較はしませんが、このような記事がありましたのでぜひご覧になってください。
[なぜGoを研究で使うのか](https://qiita.com/tetsuzawa/items/d279da49dca3d95f05b6)