コンテンツにスキップ

プログラミング/Fortran

出典: フリー教科書『ウィキブックス(Wikibooks)』

Fortranの歴史と特徴

[編集]

Fortran(Formula Translation)は、1957年にIBMによって開発された世界最初の高水準プログラミング言語です。科学技術計算、数値解析、シミュレーション、工学分野で今なお重要な役割を果たしています。数値計算の効率性と数学的表現の直感性を特徴とする言語として知られています。

基本的な文法と構造

[編集]

プログラムの基本構造

[編集]

現代のFortran(Fortran 90以降)では、モジュラーでクリーンなプログラム構造が可能になりました:

program scientific_calculation
    implicit none
    real :: x, result
    real, parameter :: PI = 3.14159265359
    
    x = 42.0
    result = calculate_area(x)
    print *, "円の面積: ", result

contains
    function calculate_area(radius) result(area)
        real, intent(in) :: radius
        real :: area
        area = PI * radius * radius
    end function calculate_area
end program scientific_calculation

重要な特徴:

  • implicit none: 暗黙の型宣言を無効にし、変数を明示的に宣言するよう強制
  • intent(in): 引数が関数内で変更されないことを明示
  • contains: サブプログラムを本体プログラム内に定義可能

データ型

[編集]

Fortranは科学計算に適した豊富な数値型を提供します:

program data_types_demo
    implicit none
    integer :: whole_number
    real :: decimal_number
    complex :: complex_value
    double precision :: high_precision_number
    logical :: truth_value

    whole_number = 42
    decimal_number = 3.14159
    complex_value = (1.0, 2.0)
    high_precision_number = 3.141592653589793d0
    truth_value = .true.

    print *, "整数: ", whole_number
    print *, "実数: ", decimal_number
    print *, "複素数: ", complex_value
end program data_types_demo

配列操作

[編集]

Fortranの配列操作は非常に強力で直感的です:

program array_operations
    implicit none
    real, dimension(5) :: vector
    real, dimension(3, 3) :: matrix
    integer :: i, j

    ! ベクトルの初期化
    vector = [1.0, 2.0, 3.0, 4.0, 5.0]

    ! 行列の初期化
    matrix = reshape([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0], [3, 3])

    ! 配列の全要素に対する操作
    vector = vector * 2.0
    matrix = matrix ** 2

    print *, "変更後のベクトル:"
    print *, vector

    print *, "変更後の行列:"
    do i = 1, 3
        print *, (matrix(i, j), j = 1, 3)
    end do
end program array_operations

数値計算と並列処理

[編集]

Fortranは科学計算における並列処理をネイティブにサポートします:

program parallel_computation
    use, intrinsic :: iso_fortran_env, only: real64
    implicit none
    
    integer, parameter :: n = 1000000
    real(real64), allocatable :: large_array(:)
    real(real64) :: sum_result
    integer :: i

    allocate(large_array(n))

    ! 配列の初期化
    !$omp parallel do
    do i = 1, n
        large_array(i) = sin(real(i, real64))
    end do
    !$omp end parallel do

    ! 並列リダクション
    !$omp parallel do reduction(+:sum_result)
    do i = 1, n
        sum_result = sum_result + large_array(i)
    end do
    !$omp end parallel do

    print *, "配列の合計: ", sum_result

    deallocate(large_array)
end program parallel_computation

モジュールとカプセル化

[編集]

Fortranのモジュールは、関連する手続きとデータをカプセル化するための強力な機能です:

module physics_constants
    implicit none
    real, parameter :: GRAVITATIONAL_CONSTANT = 6.67430e-11
    real, parameter :: SPEED_OF_LIGHT = 299792458.0
end module physics_constants

module orbital_mechanics
    use physics_constants
    implicit none

    contains
    function calculate_orbital_period(semi_major_axis, central_mass) result(period)
        real, intent(in) :: semi_major_axis, central_mass
        real :: period

        period = 2 * 3.14159 * sqrt((semi_major_axis**3) / (GRAVITATIONAL_CONSTANT * central_mass))
    end function calculate_orbital_period
end module orbital_mechanics

program space_simulation
    use orbital_mechanics
    implicit none

    real :: earth_period

    earth_period = calculate_orbital_period(1.496e11, 1.989e30)
    print *, "地球の公転周期: ", earth_period, "秒"
end program space_simulation

おわりに

[編集]

Fortranは、その長い歴史にもかかわらず、科学技術計算の分野で今なお重要な役割を果たしています。高性能な数値計算、直感的な配列操作、並列処理のサポートなど、特定の分野において他の言語を凌駕する能力を持っています。

最新の標準(Fortran 2018)では、オブジェクト指向プログラミングのサポートや、より洗練された並列処理機能が追加されており、現代のコンピューティング環境にも十分対応しています。

科学者、数値解析者、エンジニアにとって、Fortranは今でも最も強力なツールの一つなのです。