[1.1]Fortran プログラムの実行
ここでは,Fortran というプログラミング言語を使います.Fortran は最も歴史が長い高級プログラミング言語であり,科学技術分野では現在でも広く用いられています. Fortran プログラムを実行するためには,プログラム本体とコンパイラを用意し,プログラムをコンパイルして実行ファイルを作る必要があります.今回の実習では,GNU で開発が続けられている GFortran という Fortran コンパイラを使い,Fortran による数値計算を体験してもらいます.
[1.1.1] Gfortran のインストール
apt コマンドを用いて,GFortran をインストールします.
$ sudo apt update $ sudo apt upgrade $ sudo apt install gfortran
終わったら,GFortran が正常にインストールされているかを確かめるために GFortran のバージョンを見てみましょう.
$ gfortran --version
以下のような表示が返ってくれば OK です.
GNU Fortran (Debian 10.2.1-6) 10.2.1 20210110 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[1.1.2] サンプルプログラムの取得
サンプルプログラム hello.f90 をダウンロードします.
$ wget www.ep.sci.hokudai.ac.jp/~inex/y2023/0707/practical/prog/hello.f90
hello.f90 は "Hello World!" という文字列と,1 から 1000 までの整数の和, 及び 1 から 1000 までの整数の和が奇数か偶数かを表示するプログラムです.
hello.f90 の中身を見てみましょう.hello.f90 は文字コードを UTF-8 にすることで閲覧できます.(X window systemを立ち上げるか, ターミナル用の日本語フォントを導入しないと文字化けを起こします.)
$ export LC_ALL=ja_JP.UTF-8 $ startx $ less hello.f90
1 program hello 2 implicit none 3 4 integer :: Sum = 0 5 integer :: n 6 7 do n=1, 1000 8 Sum = Sum+n 9 end do 10 11 print "(a)", "Hello World!" 12 print "('1から1000までの整数の和は ',i0)", Sum 13 14 if (mod(Sum, 2) == 0) then 15 print "('1から1000までの整数の和は偶数')" 16 else 17 print "('1から1000までの整数の和は奇数')" 18 end if 19 20 end program hello
先頭の行番号は説明を分かりやすくするためにつけているだけで,実際には表示されません.プログラムの大まかな意味を以下に記します:
- 4, 5 行目では,Sum と n という変数を定義し,その変数の型が整数 (integer) であることを宣言しています.特に 4 行目では,Sum を定義した後に 0 を代入していることがわかります.
- 変数には型というものが存在しています.型というのはその変数の扱う値がどのようなモノであるかを説明するものです. 整数を扱う変数は整数型といい, integerという宣言を行います. 次ページで出てくるdouble precision という型宣言は実数を扱うことを宣言しています(正確には倍精度実数という実数型です). そのほかにも複素数や文字を扱える型もあるのですが, 今回は省略します.
- 7 ~ 9 行目は,do 構文と呼ばれる繰り返し構造です.ここでは,1 ~ 1000 までの整数の和を求めるために,変数 n を 1 から 1000 まで変化させ,変数 Sum へ次々と加算していきます.この do 構文は,シェルスクリプトの for 文とよく似た働きをします.また,計算には,+ (加法),- (減法),* (乗法), / (除法),** (累乗) を利用できます.
- 11, 12 行目は,print 文と呼ばれるものです.print 文は,画面への出力を担います.ここでは,"Hello World!"という文字列と整数の総和を求めた計算結果 (変数 Sum の最終的な値) を表示させています.print 文は, print 書式, 出力したいもの という文法で表します.書式についての詳細は,例えば nag ウェブページ などを参照してみてください.
- 14 ~ 18 行目は, if 文と呼ばれる制御構造です. この if 文は, シェルスクリプトの if と同様に条件にしたがって行う処理を変化させることが出来ます. ここでは 14 行目のifに続く()の中の条件式に従い, その条件が真ならばthenに続く処理(15行目)が実行され, 偽の時にはelseに続く処理(17行目)が実行されます. 今回のプログラムに置ける条件式は'mod(Sum, 2) == 0'であり, 変数Sumの値を2で割ったあまりが0であれば真, 0で無ければ偽を返します.
- 条件式を詳しく説明します. 式内で用いている関数はmod関数という関数です. mod関数は'mod(A, B)'というように()の中に二つの引数を取り, 第一引数Aを第二引数Bで割ったあまりを返します. また, 条件式で用いられている '==' という演算子は '==' の前後の値が一致しているかどうかを判定する演算子です. 一致している場合は真を, 一致していない場合は偽を返します. 今回の式では'Sum'を'2'で割った余りが'0'と一致する(偶数である)場合に真を, '0' と一致しない場合(奇数)である場合に偽を返します.
- 例えば, 'mod(3, 2)'という関数は 3 を 2 で割った余りが 1 である為, 1を返します. そのため, 'mod(3, 2) == 0' は '==' の前が 1 , 後が 0 の値となり, 一致しないため, 偽を返します.
[1.1.3] GFortran によるコンパイルとプログラムの実行
それでは,このプログラムを GFortran でコンパイルしてみましょう.
$ gfortran hello.f90
すると,実行ファイル (a.out) が新たに生成されます.
$ ls a.out hello.f90
この a.out の実行によって,プログラムが実行が成されます.
$ ./a.out Hello World! 1から1000までの整数の和は 500500 1から1000までの整数の和は偶数
>> 次ページへ