【Fortran超入門】プログラム全体の流れ・文法の基礎[FORTRAN]

#**はじめに**
Fortranでプログラムを組むにあたっての基本を押させていこうと思います。

#**FORTRANとは**
フォートラントは1954年にIBMのジョン・バッカスによって考案された、コンピューターにおいて広く使われた世界最初の高級言語です。

> FORTRANは科学技術計算に向いた**手続き型プログラミング言語**であり、その長い歴史の間に開発された非常に多くの数学関数やサブルーチンを数値解析ソフトウェアの形で持っている。また、並列計算の並列性を明示的に書くことができ最適化が行いやすく、そのため**他の言語より高速である**等の理由から、数値予報および気候モデル、構造力学における有限要素法、計算流体力学、計算物理学、計算機化学、計量経済学、動物と植物の品種改良などの**大規模な計算を行う分野において**、スーパーコンピュータで使われている。

引用：[FORTRAN from wikipedia](https://ja.wikipedia.org/wiki/FORTRAN)

#**FORTRANの歴史**
- Fortran77より前
  - 初期の頃は、変数名が大文字6文字までで、**動的な記憶領域の確保ができない**など多くの制約があった。
- Fortran77
  - **構造化プログラミング**が導入された。
  - ファイルの拡張子：`.f`or`.for`
- Fortran90
  - **モジュラープログラミング**、**配列演算**と**ユーザー定義総称関数**が導入された。
  - ファイルの拡張子：`.f90`
- Fortran95
  - **High Performance Fortran（HPF）**が導入された。
  - ファイルの拡張子：`.f95`
- Fortran2003
  - **オブジェクト指向**が導入された。
  - ファイルの拡張子：`.f03`
- Fortran2008
  - **コンカレント・コンピューティング（並行計算）**が導入された。
  - ファイルの拡張子：`.f08`

#**全体の流れ**
1. テキストファイルにプログラム（ソースファイル）を書く
2. コンパイラによって実行ファイルを作成する
3. 実行ファイルを実行する

###**1. テキストファイルにプログラム（ソースファイル）を書く**
ファイルを作成してプログラムを記述するわけですが、ここでは拡張子`.f90`のプログラムファイル（例：sample.f90）を作成し、プログラムを組むとします。

```
$ touch sample.f90
```

###**2. コンパイラによって実行ファイルを作成する**
Fortranで書かれたプログラムをコンパイルすることができるコンパイラであれば何でも良いのですが、ここではGfortranソフトウェアを利用するとします。
`gfortran`コマンドでプログラムファイルをコンパイルできます。

`gfortran`コマンドによって作成された実行ファイルはデフォルトでは、`a.out`となりますが、実効ファイル名を変更するためには、`oオプション`を利用します。
`ex) $ gfortran sample.f90 -o sample.out`

ちなみに、**a.outはアセンブラアウトプット（Assembler OUTput）に由来しています。**


```
$ gfortran sample.f90
```

###**3. 実行ファイルを実行する**

**`./a.out`で実行することができます**。


```
$ ./a.out
```

#**プログラム**
###**目的**
サンプルプログラムには
「**キーボードから実数xを入力し、$f(x) = x^2 - 1$を計算し、f(x)の値が正であるか0であるか負であるかを判定し、結果をディスプレイに表示する（処理は5回繰り返す）**」
という処理を記述します。

###**サンプルコード**
プログラムは、メインルーチンのexampleと、f(x)を計算するサブルーチンfuncで構成されています。

```sample.f90
! メインルーチンは、program [プログラム名] という行で始まり、endで終わる
program example
! 中身は二つのブロック（宣言部と実行部）から成る
! 宣言部：記号の定義、実行部：本体

! implicit noneは、バグを発見しやすくするために常に記述
! 書かないと、宣言していない変数が現れてもコンパイラがエラーを検出しないことがある
  implicit none
! 型宣言
  real x, y
  integer i
! 定数は、parameter文で値を宣言しておく
  integer, parameter::IMAX=5

! do 変数 = 初期値, 終値(, 増分)　~ enddo
  do i=1, IMAX
!-- print文でカンマ後の文字列、変数をディスプレイに表示する
    print *, 'x=?'
!-- read文で、キーボオードからの入力待ちとなる（xに入力値が代入される）
    read *, x
!-- call文で、サブルーチンが呼び出されてyにf(x)の値が代入される
    call func(x, y)
    print *, 'f(x)=', y
!-- if(~ endif)文で条件を記述
    if (y > 0) then
      print *, 'f(x) is positive'
    elseif (y == 0) then
      print *, 'f(x) is equal to zero'
    else
      print *, 'f(x) is negative'
    endif
  enddo

! stop文でプログラムは実行を停止する
  stop
end

! サブルーチンではreturn文で処理を終えてメインルーチンに戻る（注：stop文ではない）
subroutine func(t, ft)
  implicit none
  real t, ft
  ft= t**2 - 1
  return
end
```

###**型宣言**

| 表記       |       型 |
|:-----------------|:------------------|
| integer          |              整数型|
| real             |            実数型  |
| double precision | 倍精度実数型（有効桁数が2倍） |
| complex          |           複素数型 |
| character        |             文字型 |

###**比較演算子**

| 意味       |      表記１ |    表記２    |
|:----------------:|:-----------------:|:------------------:|
| $<$            |              < |      .lt.          |
| $\leq$           |           <= |      .le.       |
| $=$            |              == |     .eq.          |
| $\neq$               |         /=|     .ne.         |
| $>$            |             > |       .gt.       |
| $\geq$          |           >= |       .ge.       |

###**論理演算子**

| 意味       |       表記 |
|:----------------:|:-----------------:|
| 否定（以外）            |    .not. |
| 論理積（かつ）          |     .and. |
| 論理和（または）         |   .or. |
| 論理値が等しい         |    .eqv. |
| 論理値が等しくない      |    .neqv. |


#**おわりに**
この記事が役に立ったという方は、いいね、お願いします(^^)