IT pass HikiWiki - [itbase2021]Fortran 実習 コンパイルと実行 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
{{toc}}
= 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
= 参考資料
= 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
= 参考資料