IT pass HikiWiki - [itbase2017]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


= 参考資料