[itbase2021]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
Keyword(s):
References:[[itbase2021]惑星学実験実習の基礎II]