1. はじめに
この演習では非常に短い期間でFortranによるプログラミングの基礎を学ぶことになる.ここで学ぶ内容は今後の演習に必須のものとなるので,心して取り組んで頂きたい.
とは言っても,プログラミング言語を用いて自分のやりたいことを思うがままに実現できるようになるのはそれほど簡単なことでは無く,この演習だけでは不十分であると思われる.プログラミング言語の文法自体は英語や日本語などの自然言語に比べたら格段に簡単だが,それでもそれを使いこなすのにはある程度の訓練が必要なのである.特にプログラミング初心者の人がこの演習の内容を全て理解するのは難しいので,分からない内容があっても落ち込むことは無い.(興味を持ってやっていればそのうちに自然と身に付くものである.) 最低限の目標は,Fortranというプログラミング言語の基礎を覚え,自分で簡単なプログラムの作成および実行が出来るようになること(=この後の演習の内容についていけるようになること)である.各節のタイトルに「†」がついている項目がいくつかあるが,この内容は演習の課題をこなすためには必ずしも知らなくて良い内容である.ただし,知っておくと色々と便利なことが多いので余裕があればこの内容もマスターしておくと良い.
なお演習時には言語仕様を事細かに解説するようなことはしない.そんなことをしていては時間が足りないし,何より退屈なだけである.また言語仕様の詳細を理解したからと言ってプログラムを書けるようになるわけではなく,全く実用的では無い.その代わりに,各事項を理解する助けになるようサンプルプログラムを多数用意してある.大事なのは自分でサンプルプログラムを修正,実行し,その動作を自分の目で確認することである.また毎日の課題に取り組むことで,「習うより慣れよ」の精神で実践的に基礎を身につけて行って欲しい.この文書についても教科書的なものでは無く,サンプルプログラムの解説といった位置付けである.また,各章の最後に用意してある演習課題には各自で取り組んで欲しい.
最初に断っておくと,この文書は 未完成 である.用語が統一されていなかったり,間違いなどを含んでいる可能性も大いにあるので,その点については注意して欲しい.内容としてはどちらかと言うと教科書には書いていないようなことを随時盛り込んでいく予定である(あくまで予定である).基本的にはこのhtmlのWebページを正式版とするが,オフラインで勉強したい場合には以下からPDFをダウンロードすることも出来るので適宜活用して欲しい.(ただしPDF版は機械的に変換したもので,サンプルファイルへのリンクなどが上手く動作しないので注意して欲しい.)
この演習では説明しないような内容(細かい文法事項など)については必要であれば以下を適宜参考にすると良い [1] .高木(2009)は非常に良くまとまっているので,これがあれば困ることは少ないであろう.紙の本が良いという人は富田・齋藤(2011)がよくまとまっている.少し古いバージョンがWebで参照でき,多くの人にはこれで十分である.牛島(2007)は少し初心者には分かりづらいかもしれないが,モジュールに関する記述が実践的である.数値計算についても少し触れられているが,本格的に取り組む場合は専門の文献も併せて参考にした方が良い.
高木征弘 (2009) 『地球物理学演習テキスト Fortran90/95入門』
富田博之,齋藤泰洋 (2011) 『Fortran90/95プログラミング』 (培風館)
牛島省 (2007) 『数値計算のためのFortran 90/95 プログラミング入門』 (森北出版)
1.1. 演習環境の準備
この演習で用意されているサンプルプログラムや課題(の一部)は,リダイレクトなど,Unix-likeな環境のコマンドラインでの実行を仮定している.したがって,個人のマシンで自習をするには,Unix-likeなFortranの開発環境を構築する必要がある.ある程度の知識がある人であれば,WindowsならWSL2(Windows Subsystem for Linux),MacならHomebrewまたはMacPortsなどをインストールすることで使えるようになるだろう.VMWareやVirtualBoxなどを使って,仮想マシンとしてLinuxなどのOSをインストールして使うことも出来る.
パソコン初心者で,これらの敷居が高いと感じる人は
を使うこともできる.これはブラウザ上で動作する(Linux環境の)VS Codeで,Githubのアカウントさえあれば誰でも使うことができる.この環境にはFortranのコンパイラもインストールされているし,以下のサンプルや課題の解答のリポジトリもダウンロードされているので,とりえあずこの演習に取り組むには最適である.
サンプルや解答は各章のリンクからダウンロードすることが出来るようになっている.また,それぞれGithub上の サンプル および 解答 のリポジトリにまとめてあるので,これらを参照してもよい. git
コマンドが使える環境であればコマンドラインで
1$ git clone https://github.com/amanotk/fortran-resume-sample.git sample
2$ git clone https://github.com/amanotk/fortran-resume-answer.git answer
などと実行すればサンプルと解答が一括でダウンロードができる.(この場合はサンプルが sample
というディレクトリに,解答が answer
というディレクトリに格納される.)
1.2. プログラミングを学ぶ意義
いま
なる非線形方程式の解を知りたいとしよう.残念ながら解析的には解は得られない.しかし逐次近似など,繰り返し計算で近似解を求める方法は色々と知られている.だからと言って紙と鉛筆で計算するのは大変なので計算機に任せよう,というのが基本的な考え方である.とは言っても計算機は自分で考えることはできない.どのような処理を行うかを逐一丁寧に教えてやらなければならない.これがプログラミングというものである.計算機を使って処理の自動化をする際の作法と言ってもよい.
もちろん,上の方程式の解を求めるだけなら何もプログラミングを学ぶ必要は無い.そのようなことをやってくれるソフトウェアは探せばいくらでも見つかるだろう.ところが汎用のソフトウェアは決められた計算をするには十分であるが,ちょっとでも違うことをやろうと思うと途端に困ってしまう.誰もやったことのないような最先端の仕事をするには結局のところ必要なものは自分で作らなければいけない.そのためにもここでプログラミングを学んでおくことは非常に重要である(と思う).
さて,自分のやりたいことを計算機で実現するにはどのような手続を処理させるかをまず整理しなければならない.この手続のことをアルゴリズムと言う.例えば上の例で言えば,非線形方程式を数値的に解くための手法のことである.アルゴリズムが決まればそれをプログラミング言語で記述し,計算機に実行させることができる.本演習ではFortranというプログラミング言語の使い方を覚えることが主たる目的であるので,アルゴリズムについては詳しく説明しない.しかし,プログラミング言語の文法は世の中に数多ある言語で様々であるが,アルゴリズムは言語が何であろうと変わらないので,実際にはアルゴリズムの理解の方が重要であることを十分に認識しておいて欲しい.
1.3. プログラミング言語について
これから学ぶのは正確にはFortran 90/95と呼ばれる規格の言語である.90とか95というのは1990年とか1995年に規格が定められたという意味である.Fortran 90とFortran 95ではあまり違いが無いのでこのように記述することが多い.2000年前後まではFortran 77という規格が幅を効かせていたのだが,最近ではopen sourceのコンパイラ(後述)が普及したこともあって,今から勉強するならFortran 90/95が良い選択肢である.(より新しい規格としてFortran 2003や2008,さらには2018も存在し,その主な違いはオブジェクト指向プログラミングのサポートである.これは明らかに本演習の範囲を超えているので扱わないことにする.偏見ではあるがオブジェクト指向プログラミングをしたい人はそもそもFortranは選ばないだろう.) ただし太古の昔から脈々と受け継がれてきたプログラムなどは今でも古めかしいFortran 77のままで現役で使われている.そのようなプログラムに出会ってしまった時には諦めてFortran 77も勉強しよう.(実はそういうことは結構あるのだが,いくつかの違いさえ理解してしまえば,それほど難しいことでは無い.) 本演習では単にFortranと言った場合にはFortran 90/95を指している.
ちなみにプログラミング言語というのは星の数ほどあり,よく知られたものだけでも C/C++,C#,Java,Javascript,Perl,Python,Ruby,Lispなどがある.正直に言えば今更Fortranを学ぶのは時代遅れである.多くの言語の文法がC言語に近くできているのに対してFortranは仲間外れの部類である.また,C言語を習得した人がFortranを習得するのは比較的容易いが,その逆は必ずしも真ではない.しかし一応フォローしておくとFortranにもメリットはあって,分野にも依るが時代遅れと言われながらもしぶとく今でも現役で使われ続けている言語であり,この傾向はまだしばらく続くであろう.また,Fortranは細かいことを考える必要があまり無い比較的簡単な言語でもあるので,初心者にはとっつきやすいと同時にプログラミングの専門家では無い科学者向きの言語であるとも言える.
ただし基本的な考え方は他の言語でもあまり変わらないので,興味のある人はぜひ他の言語にも挑戦してもらいたい.おすすめは(少しとっつきにくいところはあるものの)比較的簡単な言語でありながら応用範囲の広いPythonである [2] .Pythonは Python演習 で扱うが,これはFortran(に限らずプログラミング言語一般)の知識をある程度習得している人向けである.またC言語は教養として知っておくと非常に役に立つ.
注釈
この文書を書き始めたのはおそらく2013年頃であったかと思うが,それから約10年が経過した2024年現在でも,Fortranは依然としていわゆるHigh-Performance Computing(HPC)では現役で用いられている言語であり続け,Fortranが駆逐される時代はまだしばらく訪れないように思われる.
しかし,もし筆者が独断と偏見で学生に教育する言語を選択するのであればFortranは選ばないであろう.各研究分野の都合にも大きく依存するであろうが,私見ではレガシーコードの維持という観点以外では,学生にFortranを教える積極な理由が見いだせてないためである.実際に新規開発される欧米のHPCコードやライブラリではC++,特にいわゆるModern C++を採用している例が多く見受けられるようになっている(その理由を考え始めると長くなるのでここでは述べない).しかし,最近のC++はFortranに比べると非常に難しく,一般の研究者向きの言語とは呼べないシロモノになってしまったのが悩ましいところである.ただし,多くの研究者にとってはPythonが使えるようになっていれば,他の言語が必要になっても比較的容易に対処ができるのではないだろうか(ちなみに最近のC++はPythonに近い書き方ができるようになってきている).