多くの人々は、Fortranを古風で "死んだ "プログラミング言語だと認識している。しかし、ほとんどの科学技術コードはFortranで書かれている。そのため、F77やF90でのプログラミングは、ほとんどの技術プログラマーにとって必要なスキルであり続けている。さらに、最新のFortran標準(2003年、2008年、2015年)により、プログラマーは、OOP(オブジェクト指向プログラミング)などの最新の言語機能をすべて利用しながら、最小限の労力で非常に効率的なコードを書くことができる。
FORTRANは "FORMULA TRANslation "の頭文字をとったもので、グラフィックやデータベースアプリケーションよりも、むしろ数学や数値計算アプリケーションに最適である。 ほとんどのFORTRANコードは、メニューやGUIインターフェースからではなく、ファイルやコマンドラインからテキスト入力を受けます。
知っておくべきこと
- テキストエディタを開き、言語コードとして "fortran "を使ってHello Worldプログラムを作成する。
- 整数や複素数、文字などのデータ型を使って、より多様な結果を作成する。
- ループや配列を使って、違ったものを作りましょう。
簡単なプログラムを書いてコンパイルする
-
Hello World」プログラムを書く。これは通常、どの言語でも最初に書くプログラムで、画面に「Hello world」と表示するだけである。以下のコードをテキストエディタで書き、helloworld.fという名前で保存する。program helloworld implicit none character*13 hello_string hello_string = "Hello, world!" write (*,*) hello_string end program helloworld
ヒント:空白はFORTRAN 77までのFortranでのみ必要です。これより新しいバージョンを使っている場合は、空白を削除することができる。新しいバージョンのプログラムはf77ではなくf95でコンパイルし、ファイル拡張子は.fではなく.f95を使う。
-
プログラムをコンパイルする。これを行うには、コマンドラインにf77 helloworld.fとタイプする。これでエラーが出る場合は、gfortranのようなFortranコンパイラがまだインストールされていない可能性があります。
-
プログラムを実行してください。コンパイラはa.outというファイルを生成します。./a.outと入力してこのファイルを実行してください。
-
今書いた内容を理解してください。
- program helloworldはプログラム "helloworld "の開始を示す。同様に、end program helloworldはその終わりを示す。
- デフォルトでは、変数型を宣言しない場合、Fortranはiからnまでの文字で始まる名前の変数を整数として扱い、それ以外はすべて実数として扱う。そのような動作が必要ない場合は、暗黙の none を使うことを推奨する。
- character*13 hello_string は、hello_string と呼ばれる文字の配列を宣言している。
- hello_string = "Hello, world!" は、宣言された配列に "Hello, world!" という値を代入する。Cのような他の言語と違って、これは配列の宣言と同じ行ではできない。
- write (*,*) hello_string は、hello_string の値を標準出力に出力する。最初の * は、ファイルではなく標準出力に書き込むことを意味する。番目の * は、特別な書式を使用しないことを意味する。
-
コメントを追加する。このような単純なプログラムでは必要ないが、もっと複雑なものを書くときには役に立つので、コメントの付け方を知っておくべきである。コメントを追加するには2つの方法がある。
- それだけで1行を持つコメントを追加するには、6つのスペースを入れずに、新しい行に直接cを書きます。その後にコメントを書きます。読みやすくするために、cとコメントの間にスペースを空けた方が良いですが、これは必須ではありません。Fortran 95以降では、cの代わりに!
- コメントをコードと同じ行に追加するには、コメントを始めたい場所に「!ここでもスペースは必須ではありませんが、可読性が向上します。
入力とif構文を使う
-
異なるデータ型を理解する。
- INTEGERは1、3、-3のような整数に使われます。
- REALは、2.5のような整数でない数値を格納することもできる。
- COMPLEXは複素数を格納するために使用します。最初の数値は実数部、2番目の数値は虚数部である。
- CHARACTERは、文字や句読点などの文字に使用します。
- LOGICALは、trueかfalseのどちらかです。これは他のプログラミング言語におけるブーリアン型のようなものである。
-
ユーザーの入力を得る。前に書いた「Hello world」プログラムでは、ユーザーの入力を得ても意味がない。そこで、新しいファイルを開いてcompnum.fと名付けます。これが完成したら、入力された数字が正か負か、あるいはゼロに等しいかをユーザーに知らせます。
- program compnumとend program compnumという行を入力する。
- 次に、REAL型の変数を宣言する。宣言がプログラムの最初と最後の間にあることを確認してください。
- ユーザーに何をすればよいかを説明しなさい。write関数でテキストを書く。
- ユーザーの入力をread関数で宣言した変数に読み込みます。
プログラム compnum real r write (*,*) "Enter a real number:" read (*,*) r プログラム終了 -
ユーザーの入力をif構文で処理する。read (*,*) rと終了プログラムの間に入れる。
- 比較は、.gt. (より大きい)、.lt.(より小さい)、.eq. (等しい)を使って行われる。
- Fortranはif、else if、elseをサポートしています。
- Fortranのif構文は常にif終了で終わります。
if (r .gt. 0) then write (*,*) "その数値は正です。" else if (r .lt. 0) then write (*,*) "その数値は負です。" else write (*,*) "その数値は0です。" end ifヒント:if構文内のコードを空白でインデントする必要はありませんが、可読性が向上します。
-
プログラムをコンパイルして実行する。いくつかの数字を入力してテストしてください。文字を入力するとエラーが出ますが、プログラムは入力が文字か数字か、あるいはそれ以外の何かかをチェックしないので大丈夫です。
ループと配列を使う
-
新しいファイルを開く。考え方が違うので、また新しいプログラムを書かなければならない。ファイル名をaddmany.fとし、対応するprogram文とend文、暗黙のnoneを挿入する。終了すると、このプログラムは10個の数値を読み取り、その和を表示する。
-
長さ10の配列を宣言する。ここに数値を格納する。おそらく実数の和を求めるので、配列は実数として宣言する。そのような配列を実数(50)(と宣言する(numbersは配列の名前であり、式ではない)。
-
いくつかの変数を宣言する。numSum を実数として宣言する。後で合計を格納するのに使うが、sumはすでにFortranの式で取られているので、numSumのような名前を使わなければならない。iを整数として宣言し、まだ値を代入しない。それはdoループの中で行う。
-
doループを作る。他のプログラミング言語ではforループに相当する。
- doループは必ずdoで始まる。
- doと同じ行に、スペースで区切って、プログラムが終了したときに移動するラベルを書く。ラベルは後で設定する。
- その後に、やはりスペースで区切って、次のように入力する。 i = 1,10.これは、ループの前に宣言した変数iを、1から10まで1ずつ進むようにする。i = 1,10,1
- ループの中にコードを入れてください(読みやすくするためにスペースでインデントしてください)。このプログラムでは、配列numbersのi番目の要素で変数numSumを増やす必要がある。これは次の式で行う。 numSum = numSum + number(i)
- ラベルを持つcontinue文でループを終了する。空白を4つだけ入力する。これが、doループが終了した後に進むように指示したラベルである。その後、スペースを1つ入力してcontinue。continue式は何もしないが、ラベルを置くのに良い場所を提供し、doループが終了したことを示す。
do 1 i = 1, 10 numSum = numSum + numbers(i) 1 continueヒント:Fortran 95以降では、ラベルを使う必要はない。ただ、do文の中にラベルを入れず、ループの最後を "continue "ではなく "end do "とすればよい。
-
numSumを表示する。また、例えば "The sum of your numbers is: "のように、文脈を示すことも意味がある。どちらもwrite関数を使う。コード全体は次のようになるはずだ:program addmany implicit none real numbers(10) real numSum integer i numSum = 0 write (*,*) "Enter 10 numbers:" read (*,*) numbers do 1 i = 1, 10 numSum = numSum + numbers(i) 1 continue write (*,*) "Their sum is:" write (*,*) numSum end program addmany
-
コードをコンパイルして実行する。テストを忘れないでください。数字を入力するたびに ↵ Enter キーを押すか、同じ行にたくさんの数字を入力してスペースで区切ってもよい。
高度な概念を理解する
-
プログラムが何をするのかをよく考えてください。どのようなデータが入力として必要なのか、どのように出力を構成するのか、計算の進捗状況を監視できるように中間出力を含めるのか、などを考えてください。これは、計算が長時間実行されたり、複数の複雑なステップを伴ったりすることがわかっている場合に、非常に役に立ちます。
-
良いFortranのリファレンスを見つけよう。Fortranにはこの記事で説明した以外にも多くの関数があり、あなたが書きたいプログラムに役立つかもしれません。リファレンスは、プログラミング言語が持つすべての関数をリストアップしたもので、Fortran 77用のものとFortran 90/95用のものがあります。
-
サブルーチンと関数について学ぶ。
-
ファイルを読み書きする方法を学びます。また、入出力のフォーマットについても学びます。
-
Fortran 90/95以降の新機能について学びます。Fortran 77のコードしか書かない/保守しないことがわかっている場合は、このステップを飛ばしてください。
- Fortran 90では「フリーフォーム」ソースコードが導入され、空白や72文字の制限なしにコードを書くことができるようになったことを覚えておいてください。
-
科学的プログラミングに関する本を読んだり、調べたりしてください。例えば、"Numerical Recipes in Fortran "という本は、科学的プログラミングのアルゴリズムに関する良いテキストであると同時に、コードのまとめ方に関する良い入門書でもある。最近の版では、混合言語環境でのプログラミングや並列プログラミングの方法についての章もある。もう一つの例は、Arjen Markus著の "Modern Fortran in Practice "である。この本は、最新のFortran標準に従って21世紀のスタイルでFortranプログラムを書く方法についての洞察を与えてくれる。
-
複数のファイルにまたがるプログラムをコンパイルする方法を学びましょう。あなたのFortranプログラムがmain.fとmorestuff.fというファイルにまたがっていて、その結果のバイナリをallstuffという名前にしたいとします。その場合、コマンドラインに以下のコマンドを書く必要がある:f77 -c morestuff.f f77 -c main.f f77 -c morestuff.f f77 -o allstuff main.o morestuff.f
ヒント:これは新しいバージョンのFortranでも同じように使える。.fを正しい拡張子に、f77を正しいコンパイラ・バージョンに置き換えるだけです。
-
コンパイラが提供する最適化を使用する。 ほとんどのコンパイラーには、コードの効率を向上させる最適化アルゴリズムが含まれています。 これらは通常、コンパイル時に-O、-O2、-O3フラグを付けることで有効になります(これもFortranのバージョンに依存します)。
- 一般的には、最も低いレベルの-Oまたは-O2レベルが最適です。 より積極的な最適化オプションを使用すると、複雑なコードでエラーが発生したり、動作が遅くなったりする可能性があることに注意してください!コードをテストしてください。
コメント
最新を表示する
NG表示方式
NGID一覧