Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

NGS界隈におけるプログラミング言語の競争について – 極めて主観的な見地から(1/30・31追記)

タイトルはこの有名な記事からもらいました。
自分の学生時代に講義で学んだプログラミング言語はCとPerl(とjavaPostgreSQL)でしたが、状況はずいぶんと変わってきました。じゃあどういう時代になったの?というのを、自分が今いるNGS解析のフィールドから見える景色として記録しておきます。 自分自身がこの分野の最先端にいるという気はしないので見当違いもあるかと思いますが、酒の肴と思ってご笑覧ください。 なお、これは論文として発表されるオープンソースツールについての記述が主で、商用ツールに関しては触る機会がほとんどないのでよくわかりません。

(1/31追記)こういうエントリを書くと世の中の他の言語が気になりだしますね。。これからも増える可能性があるので、その他の新言語については下記に順次追加するようにします。

C

新しく論文で発表された解析ツールがゴリゴリのCで書かれているなんてことは流石になくなってきた。 とはいえ、高速化・省メモリ化の点では最強なので、ソースは巨大にならないが入力データが巨大であるような分野では選ばれるかもしれない。流れとしてはC++に移行しているんだけど、C++よりCのが速いよね??昔から存在するCで書かれた解析ツール(bedtoolsとか)は最近CとC++のハイブリッド的な感じで更新しているようだ。
個人的にはCを書いている時が一番楽しい。既存ツールをコンパイルする時にgccが動いていると心があたたまる。

C++

Bowtie, Hisat, Salmon, STARなど、高速性が何よりも重要であるゲノムマッピングの分野ではメインになっている。Cよりも柔軟にソースが書けるのでコードがすっきりする。ライブラリもCより充実してて嬉しい。コーディング的な意味で独創的なアイデアを詰め込みやすい。俺が学生の時のC++は単なるオブジェクト指向Cだったんだけど、テンプレートプログラミングが登場してからは言語そのものがクラスチェンジした感あり。抽象的な構造になるため、エレガントなプログラムソースはもはや知恵の輪のような、綺麗だけど読めねー的な要素を醸しだす。C++で書いた解析ツールを発表するのはプログラミング能力に自信がある人達という印象。コンパイルでもCMakeを使いこなす。 C++17, C++20とどんどん進化していっているんだけど、そういう最先端のC++で書くようなツールは今後出てくるのだろうか?ちなみにDROMPAはCですがそのうちC++にクラスチェンジします。

R

統計処理で最も威力を発揮するので、複雑な確率モデルを必要とするRNA-seqの発現解析でよく利用されている。モデリングや検定をコマンド一行でできるのずるい。中身理解してなくても複雑なモデリングできちゃうじゃん。Bioconductorが非常に発展していて、ガラパゴス化しがちだったツール同士の統合がすごく楽になった。今のBioinformaticsの発展を支える一助になっていると思う。一方やたら低速高メモリ消費なのででかい行列とかを食わせるとハングする。(それなのに全ゲノムのHI-Cマトリクスを食わせるツールとか正気じゃないぜ。)マルチスレッディングも苦手。という訳で遅い。大規模解析にはあまり向いてない。ChIP-seqのようにノイズがまじりやすいデータにもあまり向いてないと思う(場合によるけど)。CやPythonで書かれたツールを全部ラップしてRツールにしてしまう癖がある。Rでディープラーニングができます!って銘打ったツールを使ってみたら内部でKerasを起動してるだけでワロタ。

Perl

Perlは死んだとか言われてるけど、死んでねーし。 流石に今からプログラミング学びたいって人に薦める気はないけど、既にPerlで書かれてうまく動いているプログラムをPythonに書き直す必要はないでしょ?awkより高機能なパーサだと思えば便利。ワンライナーも書けるし、文字列のハッシュも便利。NGS解析ツールの分野でもPerlで書かれた現役ツールはけっこうあったりする。HOMERが最たる例。.plの拡張子消してバイナリファイルっぽくしてるけどこっそりPerlってツールはけっこうある、RSEMとか。マイナーどころではSISSRとか。でも正直、新規ツールの論文見てソース参照したらPerlスクリプトだったりすると、残念な印象を受けることは否めない。 そういえばBioPerlってのが昔あったんだけど、あれを実際に自分の研究に利用してた/してる人ってどのくらいいたんだろう。。。

Python

Pythonの歴史は古いが爆発的に流行りだしたのはPandasが登場したからだと言われている。Pandasはテキストパーサとして非常に便利。流行りのGPUコンピューティングディープラーニングするならPython一択みたいなところがあるので、その界隈の人たちは皆Pythonユーザである。Cythonだから中身はCだけどな。ツールのインストールが初心者にとって最初のつまずきポイントであることは異論が無いだろうが、pip, condaでインストールが楽になったことも流行る一因だろう。あとは可読性が高いから、とかあるんだけど、実際のところどうかな。 プログラミングの知識自体はそこまで無くともコピペ改変でプログラムが書けてしまうので、素人っぽいソースがたくさんある。 なおPython2系は2020年でサポートが切れるのだが、NGS解析ツールはPython2ばかり。大丈夫なのだろうか。 ごくたまにPython3で作られたプログラムも見かける。そういう人たちは実行にSnakemakeを使うんだけど、なんかわかりにくいのでやめて欲しい。なお作図能力ではRに一歩劣る。

Ruby

使ったことなし。Perlっぽい感じ?Railsとして生き残っている?

Java

GUIを持つブラウザなどを除くとあまりJavaツールを見かける機会はないのだが、一方でChromHMM, Juicer, GATKなど、各分野でのキラーアプリに近いツールがJavaを使って実装されているのは注目に値する。理由はよくわからないが、内製のライブラリとかが研究室(大学?)にあるのかな?本来はインタラクティブな可視化ブラウザなどを実装する時に威力を発揮する言語。ちなみにJavaScriptとは別物です。

MATLAB

機械学習アルゴリズムを実装するのにとても便利なのでよく使われるが、有償なので、いずれはPythonとRに取って代わられるだろう。と言われているのだが、おそらくNGSの分野ではずっと現役だと思う。何故ならMATLABで書かれた新規ツールは今でもよく見かけるし、MATLABがメイン言語の研究室はおそらく相当数ある。これまでの資産がMATLABで、新人の教育フローもMATLABでうまく回っている研究室がそう簡単にMATLABを手放すとは思えない。Python2もだけど、研究室のメイン言語を切り替えるのってたぶん世の中の流れより5年は遅い。なので、既存ツールを全部使えるようにしておきたいのならこれからもMATLABは捨てられないことになるけど、うーん、今から新人に学ばせるのもなあ。

Octave

かのNg大先生おすすめの言語だけど、あんまり見ることはない。使ったこともないです。MATLABと同じなのかな?

(1/30追記)Rust

Rust使ってる人っていますか?僕はこの記事書いた時点で、この言語を知りませんでした(名前は見かけていたけど、プログラミング言語だと認識していなかった)。ポインタの苦労から解放されたC++という話を聞きましたが、どうなんでしょう。使ってみましょうかね。DROMPAくらい大きなプログラムには難しいでしょうが、小さいツールならばできそうです。しかし次々新しい言語ってできるもんですね…

その他の言語 (1/31追記)

Julia、lua, Go, Haskell, Nimなど。注目の言語だけど今のところこれらを使って実装されている解析ツールは見たことがない。でもin-houseで使っている人はおそらくいるのだろう。基本的な統計処理、検定などの実装には使えそうだけど、例えばNGSのBAMファイルを処理したりというようなことは難しい(あるいは低速)と思うので、他の言語と併用で使うか、予備実験用に使うなどの用途になるだろう。Juliaはユーザとライブラリが増えればPythonのように伸びる可能性はある。わからんけど。

結論

NGS分野でのプログラミング言語の流行は世の中の流れと微妙に違っていて、かつ混沌としている。例えばBioconductorのプログラムを全部Anacondaに移植しようとしてる猛者なんかもいるんだけど、結局エラーとの闘いになるし、Anacondaも先行き不透明だったりするので、自分の必要な分野の動向を見つつ、適当にいくつか使えるようにしておくというのが良い方法なのだろう。論文出したら後は知らん、というスタンスならどれで書いてもいいんだけど、実際に使ってもらうために何年もメンテナンス・アップデートするつもりであれば、どの言語で書くか(あるいは移植するか)は重要な問題になるだろう。