in silico 創薬のためのC/C++プログラミング環境

ブログ開始

 こんにちは、私はインテージヘルスケアの金井といいます。in silico創薬における受託解析計算などを仕事にしています。今回、私もブログなるものを書くことになりました。何分初めてのことで、in silico創薬関連のどの様な事を書けば良いのか思いつきません。創薬からは少し遠いですが、プログラミング関連の話題を扱っていこうと思います。私が良く使うプログラミング言語は C++で、良く使うOSはLinuxです。というか、プログラミングに関して言えばLinuxしか使っていません。C++は良い言語だと思っていますが、最近は Pythonも意識して使うようにしています。実はPythonが結構苦手です。もしかしたら、Pythonの勉強の成果みたいなこともブログにするかもしれません。

 ブログに慣れてきたら有名なChemoinformaticsのツールキットであるOpenBabelやRDKitを使ったプログラミングの話とかも書いてみようと思います。もちろん私が苦手なPythonは使いませんよ。C++ですよ。Pythonを使ったRDKitの話題はウェブ上に色々あるけど、C++ならあまり見あたらないし、ネタ被りしなそうだから丁度良いかもしれませんね。

プログラミングって

 色々なプログラミング言語についての入門書やウェブサイトが世の中にはたくさんあります。新しい言語を習得しようとするとき、このような書籍などを読んで、サンプルプログラムなど実行してみることでしょう。しかしながら、そのサンプルが正常動作するまでの環境構築が非常に面倒だったりします。特にプログラミング超初心者の方などは環境構築の時点で挫折してしまうのではないでしょうか。というかエディタの使い方の時点で挫折しそうですよね。私もPythonを勉強しているのですが、これがまた環境構築が厄介です。Anacondaを利用すると非常に楽に構築出来るらしいのですが、未だ手を出していません。Pythonは是非とも習得したいので、少しづつでも努力しています。

 ところで、私が普段使っているC++も環境依存の激しい言語です。だってLinux上で作ったプログラムをWindows上でコンパイルすることすら簡単に出来ないのですから。プログラミング環境は人によって千差万別です。そんなわけで、今回は自分がC/C++のプログラミングで使用しているツールやライブラリなど少し紹介します。そもそも何故C/C++ なのかというと、数値計算や科学技術計算で広く利用される言語で、私が大学生時代から良く使っていたからです。(あと、数値計算ではFortran もよく使われます)科学技術計算で良く使われるので、何処のスーパーコンピュータにも専用コンパイラ(C/C++, Fortran)がインストールされています。あと、in silico創薬関連ツールの核心部分は大体C/C++で書かれているのではないかと思います。前述したOpenBabelやRDKitもC++です。このへんが私がC++を愛用する理由ですね。

C/C++プログラミングツール

 私がC/C++プログラミングで使っているツールを思いつくままに列挙してみました。

ツール名説明
Emacsプログラムを書くためのエディタ
Vimこれもエディタだが自分はviewerとして使っている
GCCコンパイラ
Clangコンパイラ
CMakeビルドの自動化ツール
DoxygenMakefileの自動生成ツール
Git, Subversionコードのリビジョン管理ツール
GDBデバッガー

 パッと思いつくだけあって、このリストにあるものはC++プログラミングには全部重要だし、全部使います。むしろ未だ何か見落としていると思います。恐らく初心者が「先ずこれらのツールを全部覚えてくださーい」とか言われたら、ちょっと引くんじゃないでしょうか。もちろん入門書にあるサンプルプログラムを動かす程度であれば、CMakeなど全く必要ありません。しかしながら、結局は勉強することになるのではないかと思います。各ツールに関しての話題は今後のブログのネタに出来ればと思います。

 Linux上でプログラミングする利点の一つとして上記のようなツール初めからインストールされているか、ちょっとしたコマンド一発で簡単にインストールできてしまう点にあります。私は普段の仕事でLinuxばかり利用しますが、プログラミングを勉強してみたいという方にもLinuxはおすすめです。

Chemoinformatics関連でよく使うライブラリ

 プログラミングでは必ず何かしらのライブラリを利用します。Hello Worldのような極めて単純なプログラムでも標準ライブラリを使用しています。C/C++でのプログラミングが面倒な理由の一つは必要なライブラリを揃えるところです。しかもただ揃っていれば良いわけでなく、バージョンも必要とされるものでなければなりません。面倒くさすぎですよね。多分Pythonの人気がある理由として、C/C++よりはライブラリに関する面倒くささが軽減されているからかもしれません。

 私がChemoinformatics関連のC/C++プログラミングで良く使うライブラリは以下の通りです

ライブラリ名説明
Boost便利なC++ライブラリ群
RDKitChemoinformatics用のツールキット
OpenBabelChemoinformatics用のツールキット
Eigen線形代数ライブラリ
BLAS, LAPACK線形代数ライブラリ
FFTW高速フーリエ変換
SQLite軽量データベース
TinyXML2XMLパーサー

 RDKitとOpenBabelの2つのライブラリは我々にとって必須です。これらが無いと全く仕事になりません。どちらも同じようなことが出来るライブラリですが、プログラミングという観点からするとOpenBabelの方が多機能でAPIも使い易いです。ただし、大きな弱点があります。それはスレッドセーフでは無いという点です。これはマルチスレッド化が当たり前になってきている現在では致命的です。一方RDKitはスレッドセーフです。しかも分子を扱うクラスのシリアライズが標準的に出来るのでMPIでの並列化もやりやすい気がします。でもちょっとAPIが使いづらいです。どちらも一長一短ですよね。

 他にも色々ライブラリを利用しています。特に計算屋であればBLASやLAPACKのような線型代数ライブラリは基本中の基本です。C++ではLAPACKよりもEigenが使い易いので、現在の私はこちらを良く使っています。大変オススメです。まあ今後このような話題についてもちょくちょく触れていければ、ブログのネタ切れを回避できるのではないでしょうか。