[itbase2019]Fortran 実習 コンパイルと実行

Fortran とは

Fortran は, 科学技術計算で良く使われるコンピュータ高級言語のひとつです. 惑星学実験実習の基礎 II では, Fortran を使ってプログラミングを体験・実習 します.

準備

gnuplot の実習の時と同じように, 実習のまえに準備をしましょう. ターミナルを開いて Fortran というディレクトリを作り, そこに移動 しましょう. このサブディレクトリの中で Fortran の練習をすることにします.

istc c-012:~ 0123456s$ mkdir Fortran
istc c-012:~ 0123456s$ cd Fortran

こうしておけば, 練習でつくった Fortran 関係のファイルが ディレクトリにまとめられるのでファイルの整理整頓になります.

とりあえずプログラムを書いて実行しよう

エディタ (例えば, emacs) を使って, 下のプログラムを hello.f90 という ファイル名で作成しましょう.

! Hello world
program helloworld

  print *,  'Hello world'

end program helloworld

ここでは, プログラムの内容の詳細は説明しませんが, ひとまず コンパイルして実行してみましょう. 本実習では, Fortran コンパイラとして gfortran を用います.

コンパイルのためには下のようにします.

$ gfortran hello.f90

もしプログラムに間違いがなければ, a.out という実行ファイルが 生成されます. ls でファイルができていることを確認してみましょう.

$ ls
Document  ... a.out ...

もしプログラムに間違いがあれば, エラーメッセージが表示される でしょう. もしエラーメッセージが表示されたら, プログラムを 見直してみましょう. 作成された実行ファイルは, 下のようにして実行します.

$ ./a.out                  <- プログラムを実行
Hello world                <- 実行結果

なお, a.out は, Unix 上でのプログラムの実行ファイルのデフォルト名です. しかし, 実行ファイル名は, コンパイラに o オプションを付けることで 変更することができます. 例えば, 実行ファイル名を hello とするときには下のようにします.

$ gfortran -o hello hello.f90

このとき, プログラムを実行するためには下のようにします.

$ ./hello                 <- プログラムを実行
Hello world               <- 実行結果

パーミッションの確認

ファイルのモード・パーミッションの説明で, ファイルの属性に 実行の権限 (パーミッション) があることを説明しました. コンパイルして作成された実行ファイルのパーミッションを確認してみましょう.

$ ls -l

としてみましょう. a.out そして hello に実行権限がありましたか?

練習問題

モードを変更して, 実行ファイルを実行できないようにしてみましょう. どのようにすればよかったでしょうか?

実行できないようにしたら, 実行できないことを確認してみましょう.

$ ./a.out

または,

$ ./hello

です.

実行できないことを確認できましたか?

終わったら, 再び実行できるようにしてみましょう.

プログラム最低限解説

先に作ったプログラムについて最低限の説明をしておきます.

コメント文

! で書かれた行

! Hello world

は, コメント文です. この文は Fortran での処理には使われません. 正確には, ! の文字から行末までがコメントとして扱われます.

program 文

先に示したプログラムの

program helloworld                  <- 「program 文」

から

end program helloworld              <- 「end program 文」

までが「主プログラム」と呼ばれる, 各 Fortran プログラムに一つだけ 必要な部分です. (実際には, 最後の end 文のみが必須であり, 最初の program 文が なくてもプログラムはコンパイルでき, 実行ファイルは動きます. しかし, プログラムの読みやすさ・わかりやすさのために, program 文を 書いておくことを勧めます.) program 文と end program 文には名前を付けることができ, 上の例では helloworld という名前を付けています.

print 文

print *, 'Hello world'

は, 画面 (ターミナル) への出力の命令です. また出力形式が * で指定されており, 「適当に」出力されます.

なお, ! から行末までがコメントですから,

print *, 'Hello world' ! Output hello world

と書いても, print 文は影響を受けず, 動作は変わりません.

空行, 空白の扱い

先に示したプログラム,

! Hello world
program helloworld

  print *, 'Hello world'

end program helloworld

では,

program helloworld

print *, 'Hello world'

の間, および,

print *, 'Hello world'

end program helloworld

の間に空行が 1 行ずつありますが, 何行空けても構いません.

また,

print *, 'Hello world'

print*,'Hello world'

のように, 空白を入れなくても構いません. また, 上の例では, print 文は, program 文から 2 カラムほど 字下げ (インデント) してありますが, Fortran の文法では, この字下げは 必須ではなく, 字下げしなくても良いし, 何文字字下げしても構いません. また, 行頭にどれだけ空白を入れても構いません. 例えば, 下のようなプログラムも動作は同じです.

program helloworld
print*,'Hello world'!Hello world
end program helloworld

または,

program helloworld
        print * ,    'Hello world' ! Hello world
  end program helloworld

も動作は変わりません.

しかし, どこからどこまでがプログラムで, print 文のような命令文が どのプログラムの一部であるのかを分かりやすくするために, 適切に 字下げすることを勧めます. (emacs では, 開いたファイルのファイル名の末尾によって, Fortran プログラムであることを認識し, 自動的に適切な字下げを行ってくれます.)

ただし,

pr int *, 'Hello world'

のように, write 等の単語の中に空白を入れてはいけません.

コンパイルエラーの例

では, 試しに下のような間違ったプログラム (helloerror.f90) を作って コンパイルしてみましょう.

! Hello world
program helloerror

  pr int * ,   'Hello world'

end program helloerror

コンパイルするには,

$ gfortran -o helloerror helloerror.f90

です. エラーメッセージが表示されると思います. また, この時には, 実行ファイルはできていないはずです. ls で確認してみましょう.

$ ls
Document  Movies  ...

この ls の結果の中には, 実行ファイル helloerror は含まれていないはずです.

さて, コンパイル時のエラーメッセージを確認してみましょう. きっと下のようなメッセージが表示されたでしょう.

helloerror.f90:4.2:

  pr int * ,   'Hello world'
  1
Error: Unclassifiable statement at (1)

"Error: Unclassifiable statement at (1)" は, 最初は意味がわからない かもしれません. しかし, "at (1)" と書いてあることからもわかる通り, "1" の記号の付いた箇所, つまり "pr int" に何か問題がありそうであることは推測できるでしょう. もちろんこの例は, "pr int" を "print" と書き直せばコンパイルは成功します.

エラーメッセージは特に最初は意味が分かりにくく, とっつきにくいものですが, それでも注意してみてみるとエラーを見つける手掛かりは得られるものです.

Fortran 77 (固定形式) について

ここまでに説明したように, プログラムを書く際に, 行頭に好きなだけ 空白を入れてよい (入れなくてもよい) のは, Fortran 90 の自由形式で プログラムを書いているためです. Fortran には, Fortran 77 までに使われてきた固定形式の書き方が あります (Fortran 90 は Fortran 77 の機能を包含しているため, Fortran 90 でも固定形式のプログラムが使えます). Fortran は科学技術計算で使われてきた長い歴史があり, 今でも 固定形式で書かれた多数のプログラムが使われていますので, 固定形式について簡単に説明しておきます.

まず, 自由形式のプログラムと固定形式のプログラムは, ファイル名で 区別されて認識されます.

  • 固定形式: プログラムのファイル名の末尾が .f または .F
  • 自由形式: プログラムのファイル名の末尾が .f90 または .F90

そして, 固定形式のプログラムでは, 下の決まりに従ってプログラムを 書かなければなりません.

  • 行頭に 6 カラムの空白を入れなければならない
    • 継続行(*)を除く
    • プログラムの宣言文・実行分は 7 カラム以降に書かなければなりません
  • コメント文は, 1 カラム目に c を書く

(*継続行とは, 前の行から続いている文です. 固定形式で長い文を書く際には, 継続する 2 行目の 6 カラム目に何か文字を書くことで行が 継続していると認識されます. 自由形式では, 継続される行 (1 行目) の最後に & を書くことで 次の行が継続行と認識されます.)

したがって, 先のプログラムを固定形式で書くと下のようになります.

c Hello world
      program helloworld

        print *, 'Hello world'

      end program helloworld
Last modified:2019/10/26 19:06:16
Keyword(s):
References:[[itbase2019]惑星学実験実習の基礎II] [[itbase2020]惑星学実験実習の基礎II]