プログラミング言語は何がおすすめか?はよく話題に上がります.
結局のところ,プログラミング言語の良し悪しは,目的により異なるというのが答えです.
この記事では,科学計算(計算科学)や数値シミュレーションを目的とした場合,どのプログラミング言語がおすすめかを議論したいと思います.
「科学技術計算」と「数値シミュレーション」は違う言葉として扱います.この記事では,あくまで「数値シミュレーション」が対象です(科学計算,計算科学,数値シミュレーションはこの記事ではほぼ同義です).「科学技術計算」という言葉の明確な定義は曖昧ですが,この記事ではざっくりと理系全般の計算として扱います.「数値シミュレーション」はその中でも専門的に突出したものとして,計算精度や計算速度が求められる分野とします.そのため,「科学技術計算」ではあまり求められない速度(超高速)などが求められます.
大前提として,科学計算に求められる項目は下記のものであるとします.
- 計算結果の信頼性
- 計算速度
比較する言語は,Fortran, C++, Pythonです.
プログラミング言語の比較
各プログラミング言語のメリット・デメリットをざっくりとまとめてみました.
Fortran
- 学習コストが低い
- 実行速度が速い
- オブジェクト指向ではないため,コードが煩雑になりやすい
- 利用可能なライブラリが少ないため,自作する必要がある
- 開発環境があまり充実していない
- 時代遅れ
C言語
C++はC言語の拡張版という位置づけなので,現在はわざわざC言語を選択する必要性はありません.
C++
- 実行速度が速い
- 利用可能なライブラリが豊富
- 開発環境が充実
- 学習コストが高い
- ポインタの多用などによる人為的バグが多くなる可能性がある
Python
- 学習コストが低い
- 便利なライブラリが多い
- 開発環境が充実
- 実行速度が遅い
各言語の特徴について
Fortran
Fortranはかなり古い言語です.現代のソフトフェア開発ではまず使用されませんが,大学などではいまだに現役で使用されています.なぜ大学で使用されるのかと考えたとき,大学ではあくまで研究の実証もしくは効率化のためにプログラミングを行っているのであり,あくまで手段です.また,新しい言語を学ぶ余裕がないためでしょう.私が研究室に所属していた時はFortranが主流でしたが,その理由は単純にFortranしか書けないからでした.こういった研究室は数多く存在しており,この傾向は日本だけではなく海外でも同様でした.
Fortranは,もともと計算科学系向けプログラミング言語です.BLASやLAPACKなど昔から計算科学向け(行列計算系)のライブラリが存在します.行列計算系にはこのライブラリを使用することは必須であり,非常に高速です.Fotranから離れられない理由のひとつといえます.
また,OpenMPIなどのMPIライブラリが正式にサポートされているため,超大規模の計算などにも利用できます.
ただ,Fortranは科学計算向けプログラミング言語ということもあり,できることが限られています.例えばWeb系アプリケーションの開発などはまずできません(やりません).
できることが多い言語の場合,何から手を付けていけばいいかわからないですが,できることが限られているが故に学習コストが低いと言えます.
近年ではオープンソースソフトウェアが充実してきており,すべてのコードを自分で実装するのは時間の無駄と言えます(車輪の再発明はやめろといわれます).Fortranにおいては,オープンソースソフトウェアがあまり充実していないため,自分でコードを実装する手間が増えてしまいます.
数値計算に限ると”Numerical Recipes“という本があります.これには,数値計算でよく利用されるアルゴリズムのコードが記載されているため,実装コストを下げることが出来ます.
さらに,Fortanは多人数での開発には向いていません.何年かにわたり研究が引き継がれていくとコードが煩雑化し,管理しきれないという問題が多発します.
ソフトフェア業界ではFortranの開発経験はあまり評価されないことが多いです.
その理由は,ソフトウェア業界では,チームで開発するため「オブジェクト指向と呼ばれるプログラミング言語言語」を使用します.
C++
個人的に意見としては,C++を習得すれば他の言語は余裕で理解できるといえるくらい難しい言語です.
C++には,Fotranにはない「ポインタ」の扱いやオブジェクト指向言語としての「クラス」があります.
ポインタに関しては,メモリ空間などを意識するための概念です.コーディングの柔軟性が高く,効率的なコードを書くことが可能になります.しかしながら,このポインタの概念はバグの温床となります.最近のプログラミング言語は,このポインタの概念をできる限り意識させないように設計されています.最近では,ポインタが扱えるということはデメリットかもしれません.
クラスに関しては,オブジェクト指向言語の概念です.詳細は省きますが,多人数の開発が楽になります.研究の引継ぎとともにコードを引き継いでいく場合に有用です.
また,C++は構文の自由度も高いため,コードの書き方ひとつで速度が大きく変わります.
必ずしも「ポインタ」や「クラス」を使用しなければならないわけではありません.FortranやC言語と同等に記述することもできます.
C++コードの書き方による速度比較に関して,いくつか記事を挙げています.
Python
Pythonは学習コストが低く,初心者に適している言語といわれています.Pythonに関する書籍は非常に多いため,独学で十分に習得できます.
実行速度が遅いことを除いて,これといったデメリットがない言語です.
ただ科学計算において,計算速度が遅いということは致命的です.MPIの並列計算が可能となるライブラリも存在するようですが,OpenMPIはC言語,C++,Fortranのみを正式にサポートしています.
Pythonは科学計算以外にも,Excelファイルの作成や編集,グラフの作成など非常に多くのことが容易にできます.科学計算以外の目的として学ぶのも良いでしょう.
Pythonは,機械学習やAIの分野でよく使用されています.
しかし,学習コストが低いということはある意味ではデメリットと言えます.
その理由は,
- 特別なスキルがない人でも簡単に習得できるため,アドバンテージとなりにくい
- 学習コストの高い言語を学ぶ際に,知らない概念が多いため挫折しやすい
おすすめは?
科学計算に適しているプログラミング言語は「C++」です.
学習コストが高いため,初心者には難しいと思いますが,それなりプログラミング経験があれば問題ないと思います.
プログラミング言語が初めての人は...
C++がおすすめと記載しましたが,全くのプログラミング初心者には,FortranやPythonから始めることをお勧めします.
初心者の方の選択基準として,計算コストが高い分野であり将来をスパコンなどを使用する可能性がある人はFortran,それ以外はPythonを選択すると良いでしょう.
Pythonは学習環境が充実しているため,Fortranよりも早く習得可能です.
プログラミング言語とアルゴリズム
プログラミング言語のみならずアルゴリズムの学習もしましょう.
実は,プログラミング言語の選定よりアルゴリズムの方が重要です!
>> 世界で闘うプログラミング力を鍛える本 コーディング面接189問とその解法
>> プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
学習方法
数値シミュレーションは狭い領域のものであり,書籍などは充実しているとはいえません.
さらに技術の習得には,プログラミング言語の学習だけでなく,アルゴリズムの学習も必要になります.
数値シミュレーションに重要な項目は,「精度」と「速度」です.この両者に関しては「アルゴリズム」の知識が必須です.
アルゴリズムには一長一短があり,問題に適したアルゴリズムを選択する能力が必要です.
ベストなアルゴリズムを選ぶことは専門家でないと困難ですが,ベターなアルゴリズムを選ぶことは知識をつけることで専門家でなくとも可能になります.
競技プログラミングなどで遊んでみるのも良いと思います.
競技プログラミング系の書籍には,アルゴリズムの基本的なことが記載されていることが多いのでおすすめです.
まとめ
計算科学向けのプログラミング言語として,FortranとC++,Pythonを比較しました.
個人的な結論としては,C++が学習コストは高いですがおすすめです.
実行速度に関しては,一般論ではなく客観的なデータを示したいですが,それはまた別記事ということで.
プログラミングでは,適切な言語の選定も重要ですが,
言語に関わらず「コードの書き方」や「アルゴリズム(理論)」も同様に重要な要素の一つです.
また,他の人にコードを見られる場合,読みやすいコードというのも重要になります.可読性を意識するとより良いコードを評価されやすいです.