BOOK

「みんなのFortran―基礎から発展まで―」を紹介

Fortranを基礎から学び、配列計算や数値計算を実際のプログラムへつなげたい人に向けて、本書の特徴と学び方を紹介します。

「みんなのFortran―基礎から発展まで―」は、科学技術計算や数値シミュレーションで長く使われてきたFortranを、基本から発展的な内容まで学びたい人に向いた書籍です。Fortranは古い言語という印象を持たれがちですが、現在のFortranには配列演算、モジュール、派生型、C言語との連携など、現代的な機能も用意されています。

Fortranの学習では、一般的なプログラミング言語の文法だけでなく、浮動小数点数、配列、行列、ファイル入出力、計算精度といった数値計算特有の考え方も重要になります。本書は、文法を覚えて終わりにせず、計算を行うプログラムへ進みたい人の道筋を作りやすい点が魅力です。

Fortranを学ぶ目的が見えやすい

PythonやC言語からFortranへ移る場合、最初に「なぜ今Fortranなのか」と感じるかもしれません。Fortranは、科学技術計算で扱う大量の数値データや配列演算を、読みやすい形で記述しやすい言語です。気象、流体、構造解析、物理、化学、地球科学など、長年使われてきた既存コードを読み解く場面でも役立ちます。

本書をおすすめしたい人
  • 大学や研究室でFortranのコードを読む必要がある人
  • 数値計算やシミュレーションの基礎を学びたい人
  • 配列を中心にした計算プログラムを書きたい人
  • 古いFortranコードを現代的な書き方へ整理したい人

単に文法を広く浅く覚えるだけでなく、計算結果を確認しながら少しずつプログラムを大きくしたい人に向いています。

最初の一歩から発展まで段階的に進める

Fortranは、プログラムの形が比較的はっきりしています。programで始まり、処理を書き、end programで終わる構造から学べるため、初学者もコードの範囲を見失いにくい言語です。

最初に動かすFortranFORTRAN
program hello
    implicit none

    print *, 'Hello, Fortran!'
end program hello
実行例COMMAND / OUTPUT
gfortran -std=f2018 -Wall -Wextra hello.f90 -o hello
./hello
 Hello, Fortran!

implicit noneを最初から書くのも大切です。宣言していない変数を暗黙に作る古いFortranの挙動を止め、タイプミスをコンパイラーに見つけてもらえるからです。本書を読むときも、サンプルを眺めるだけでなく、ファイルへ入力してコンパイルすることをおすすめします。

数値型と計算の違いを理解できる

Fortranでは、整数、単精度実数、倍精度実数、複素数、論理型、文字列などを宣言します。特に数値計算では、整数の割り算と実数の割り算の違い、精度、丸め誤差を意識する必要があります。

整数と実数の割り算FORTRAN
program division_example
    implicit none
    integer :: whole
    real :: decimal

    whole = 7 / 2
    decimal = 7.0 / 2.0
    print *, whole
    print *, decimal
end program division_example
実行結果の例OUTPUT
           3
   3.50000000

整数同士の7 / 2は整数の3になり、実数同士の7.0 / 2.0は3.5になります。数字の見た目だけでなく、変数の型とリテラルの型を確認する習慣が身につく構成です。

Fortranの中心である配列を学べる

Fortranの大きな特徴は、配列を単なるデータの入れ物としてではなく、計算の単位として扱えることです。配列全体への代入、要素ごとの演算、組み込み関数による合計や最大値の取得を、ループを減らして表現できます。

配列をまとめて計算するFORTRAN
program array_example
    implicit none
    real :: scores(3) = [70.0, 85.0, 92.0]
    real :: adjusted(3)

    adjusted = scores + 5.0
    print *, adjusted
    print *, 'average =', sum(adjusted) / size(adjusted)
end program array_example
実行結果の例OUTPUT
   75.0000000       90.0000000       97.0000000
 average =   87.3333359

本書を読むときは、配列の添字が標準では1から始まること、shapeやsizeで形状や要素数を調べること、配列全体の演算と要素を指定した演算を区別することを意識すると理解が深まります。

条件分岐と繰り返しを計算処理につなげる

if、select case、doは他の言語にもある構文ですが、Fortranでは計算の前処理や結果の分類によく使います。入力値を検証してから計算し、条件に応じたメッセージを表示する小さなプログラムから始めるとよいでしょう。

点数を判定するFORTRAN
program grade
    implicit none
    integer :: score

    print *, '点数を入力してください:'
    read *, score
    if (score >= 80) then
        print *, 'great'
    else if (score >= 60) then
        print *, 'pass'
    else
        print *, 'retry'
    end if
end program grade
実行例COMMAND / OUTPUT
 点数を入力してください:
72
 pass

Fortranの入力では、read *が標準入力から値を読み取ります。入力値が正しいとは限らない場合は、次の段階でiostatやiomsgを使ったエラー処理へ進みます。

関数とサブルーチンで処理を分ける

計算処理が大きくなったら、すべてをprogramの中へ書かず、関数やサブルーチンへ分けます。値を返す計算にはfunction、複数の値を変更したり手続きとして処理したりする場合にはsubroutineが向いています。

関数で平均を求めるFORTRAN
program average_main
    implicit none
    real :: values(4) = [10.0, 20.0, 30.0, 40.0]

    print *, 'average =', average(values)

contains
    real function average(values)
        real, intent(in) :: values(:)
        average = sum(values) / real(size(values))
    end function average
end program average_main
実行結果OUTPUT
 average =   25.0000000

intent(in)は「この手続きで値を変更しない」という意図を宣言します。引数の役割を明示すると、意図しない書き換えを減らせます。配列の(:)は要素数が固定されていない配列を受け取る書き方です。

モジュールで再利用できるコードを作る

複数のプログラムから使う型や関数は、モジュールへまとめます。モジュールを使う側ではuseで読み込みます。大きな数値計算プログラムでは、定数、データ型、計算手続きを分けることが保守性につながります。

math_utils.f90FORTRAN
module math_utils
    implicit none
contains
    real function square(x)
        real, intent(in) :: x
        square = x * x
    end function square
end module math_utils
main.f90FORTRAN
program use_module
    use math_utils, only: square
    implicit none

    print *, square(3.0)
end program use_module
コンパイルと実行COMMAND / OUTPUT
gfortran -std=f2018 -Wall -Wextra math_utils.f90 main.f90 -o use_module
./use_module
   9.00000000

onlyで利用する名前を限定すると、どの機能に依存しているかが明確になります。本書の発展的な内容へ進むときも、まずモジュール単位でコードを整理すると、コンパイルやテストを行いやすくなります。

ファイル入出力を使ってデータを処理する

数値計算では、入力データをファイルから読み込み、結果を別のファイルへ保存する処理が頻繁に登場します。Fortranでは、open、read、write、closeを使います。失敗する可能性がある処理にはiostatを付けます。

データを読み込んで合計するFORTRAN
program read_numbers
    implicit none
    integer :: unit, ios, value, total

    total = 0
    open(newunit=unit, file='numbers.txt', status='old', &
         action='read', iostat=ios)
    if (ios /= 0) stop 'ファイルを開けません'

    do
        read(unit, *, iostat=ios) value
        if (ios /= 0) exit
        total = total + value
    end do
    close(unit)
    print *, 'total =', total
end program read_numbers
numbers.txtと実行結果TEXT / OUTPUT
10
20
35

 total =          65

newunitを使うと、利用可能な装置番号をコンパイラーに選ばせられます。読み込み終了や読み込みエラーをiostatで判断し、最後に必ずcloseする流れを習慣にします。

コンパイラーの警告を味方にする

Fortranは、古いコードとの互換性を保ちながら現代的な書き方へ移行できる言語です。学習時には、暗黙の型宣言や未初期化変数を放置せず、implicit noneと警告オプションを使います。

推奨するコンパイルCOMMAND
gfortran -std=f2018 -Wall -Wextra -fcheck=all -g program.f90 -o program
  • -std=f2018:Fortran 2018として規格に沿って確認する
  • -Wall -Wextra:多くの警告を表示する
  • -fcheck=all:実行時の配列範囲などを検査する
  • -g:デバッガで追跡しやすい情報を付ける

本書のサンプルを動かすときも、エラーや警告を消すことだけを目的にせず、なぜ指摘されたのかを確認してください。特に配列範囲、型の違い、ファイルの状態は、計算結果を静かに壊す原因になります。

この本を使った学び方

  1. 短いサンプルを自分で入力し、コンパイル結果と実行結果を確認する
  2. 数値や配列の大きさを変え、結果がどう変わるか試す
  3. 関数、サブルーチン、モジュールへ処理を分割する
  4. ファイル入力とエラー処理を加えて、小さな集計プログラムにする
  5. 自分の分野のデータへ置き換え、計算結果を検算する

Fortranは、コードを読んでいるだけでは配列の形や数値の精度を実感しにくい言語です。1ページ読んだら1つは変更して実行し、出力を予想してから結果を確認する進め方が効果的です。

Fortranをさらに学ぶときの資料

本書で全体像をつかんだ後は、Fortran-langの学習ページで現代的なFortranの例を読み、コンパイラーの詳細はGNU Fortran公式マニュアルで確認するとよいでしょう。言語仕様の細部や規格への対応状況を調べたい場合は、GNU Fortranの標準規格対応表も役立ちます。

まとめ

「みんなのFortran―基礎から発展まで―」は、基本構文だけでなく、Fortranらしい配列計算や数値処理へ進みたい人に向いた一冊です。Fortranを使う目的が研究、授業、既存コードの保守のいずれであっても、サンプルを実行しながら基礎を積み上げる入口になります。

Amazonで「みんなのFortran―基礎から発展まで―」を見る