100px|right|Fortranに関連するロゴ
Fortranは、1957年にIBMのJohn Backusを中心としたチームによって作られました。当初、名前はすべて大文字で書かれていたが、現在の標準や実装では最初の文字だけを大文字にします。
''Fortran'' という名前は、''FORmula TRANslation'' の略です。当初は科学計算に特化していたため、文字列の扱いが非常に限定的であり汎用プログラミング言語として重要な他の機能が欠けていたが、成功裏にデビューした後の大規模な開発によって後に達成されることになる。Fortranは、C言語が普及するまでは、異なるコンピュータシステム間で適度な移植性を持つ数少ない高級言語の一つでした。いくつかのウェブサイトによると、Fortranの開発は1954年に開始され、1957年に商業的にリリースされたようです。小さなFORTRANプログラムのコンパイルに初めて成功したのは、1954年9月20日のことだと考えられています。
Fortranにはいくつかのバージョンがあります。FORTRAN I、II、III、IVは時代遅れであり、多くの機械依存機能が含まれていました。FORTRAN 66は最初の標準化されたバージョンで、1966年にリリースされました。それ以降のすべてのFortranのバージョンは、標準規格がリリースされた年にちなんで番号が付けられています。最も一般的に使用されているFortranのバージョンは、FORTRAN 77、Fortran 90以降です。
FORTRAN I (1957)
最初のFORTRANバージョン。IBM 704コンピュータ向けに開発されました。
プログラムの構文は固定形式で、80列幅のカードを使用。
FORTRAN II (1958):
FORTRAN Iの拡張版で、新しい機能が追加されました。
FORTRAN IIでは、IF文は次のような形式でした。IF (''numeric_expression'') ''label_if_negative''、''label_if_zero''、''label_if_positive''という形式でした。また、ホレリスリテラルと呼ばれる奇妙なタイプの文字列リテラルもありました（キーパンチの発明者とIBMにちなんで）。現在では「hello」とコード化されているところを、FORTRAN IIでは「5Hhello」としていた。しかし、文字列変数型はありませんでした。
FORTRAN III (1958):FORTRAN IIの改良版で、より多くの機能が導入されました。
FORTRAN IV (1961)
FORTRAN IVでは、IF/THENの概念、論理式の概念が追加され、演算子.AND.や.OR.、.EQ.、.NE.などが追加された。また、基本型として複素数が追加された。
FORTRAN 66:
1966年に制定された最初の標準化規格。
形式的な言語仕様が初めて導入され、整形式のカード仕様が規定されました。
FORTRAN 77 (1978):
1978年に制定された標準。大幅な言語の変更と機能の追加が行われました。
文法が拡張され、ブロックIF文やDOループの構文が改良されました。
文字列を別の型として追加しました。
Fortran 90 (1991):
Fortran 90 は、様々な種類のスレッドと直接配列処理を追加しました。
フリーフォーム形式、モジュール、動的メモリ割り当て、新しいデータ型（例: 派生型）などが導入されました。
Fortran 95 (1997):Fortran 90の修正と追加が行われたもの。Fortran 90との後方互換性が維持されています。
Fortran 2003
Fortran 2003 では、オブジェクト指向機能、派生型、C 言語との相互運用性、データ操作、多くの I/O 機能が追加されました。また、再帰サポートが向上しました。
Fortran 2008
Fortran 2003の拡張として、さらに新しい機能が追加されました。例えば、共有メモリのサポートなど。また、コアレイ、並列処理、サブモジュールが追加されました。
Fortran 2018: C 言語との相互運用性や並列処理機能がさらに強化されています。
Fortranは早くから標準化された言語でしたが、多くの企業が独自の拡張を行っていました。不思議なことに、IBMとDECはほとんど同じ拡張機能を持っていました。
thumb|初期のバージョンのFortranはパンチカードと一緒に使われることが多かった。Fortran 90以降の現在のFortranバージョンは、古いフォーマットを気にすることはありません
FORTRAN 66のコメントは1列目にCという文字で示されますが、FORTRAN 77のコメントは1列目に*を使うこともできます。また、Fortran 90 では ! 文字の使用も可能です。
FORTRAN 77 のシンボル名は 6 文字に制限されていますが、Fortran 90 では 31 文字までの名前を使用できます。
FORTRAN 77 のソースファイルは単語が始まる前に 6 つのスペースが必要ですが、Fortran 90 はそうではありません (自由形式のコードスタイルを採用しているため)。
大文字のFORTRANは、FORTRAN66、FORTRAN77と呼ばれる1950年代から開発され使われてきたクラシックな数値計算言語です。新規にプログラムを開発するには、上記の小文字のFortranが推奨されます。
Fortran95になって、FORTRANのいくつかの機能が削除されました。
削除された機能の一例
ホレリス型文字定数（H型定数）
  606 FORMAT ( 9H1GOODBYE. )
PAUSE文
      PAUSE
ASSIGN型GOTO文
100   . . .
      ASSIGN 100 TO H
      . . .
      GO TO H . . .
実数型制御変数のDO文
      DO X = 1.1, 0.1, -0.1
実行文を記述できる範囲は73～80カラム。
コメント行は１カラム目にCと記入する。
継続行は、6カラム目になんらかの文字を記入する。
小文字のFortranでは、自由欄形式が使えるようになりました。またコメントには '!' から行末まで。
英大文字での記述。
FORTRAN 77からFortran 90への移行において考慮すべき注意点をいくつかの具体的なコード例で示します。
FORTRAN 77では、固定形式が一般的でしたが、Fortran 90ではfree-form形式が導入されました。行の先頭で数字を使わない自由な形式のコードです。
C FORTRAN 77
      PROGRAM EXAMPLE
      INTEGER I
      DO 10 I = 1, 5
        PRINT *, I
   10 CONTINUE
      END
! Fortran 90
PROGRAM EXAMPLE
  INTEGER :: I
  DO I = 1, 5
    PRINT *, I
  END DO
END PROGRAM EXAMPLE
Fortran 90では、モジュールを使用して変数や手続きをグループ化できます。
C FORTRAN 77
      PROGRAM EXAMPLE
      INTEGER X, Y
      REAL A, B
      COMMON /BLOCK1/ X, Y
      COMMON /BLOCK2/ A, B
      END
! Fortran 90
MODULE mymodule
  INTEGER :: X, Y
  REAL :: A, B
END MODULE mymodule
PROGRAM EXAMPLE
  USE mymodule
  ! ここでX、Y、A、Bにアクセス可能
END PROGRAM EXAMPLE
Fortran 90では、ALLOCATABLEを使った動的メモリ割り当てが可能です。
C FORTRAN 77
      PROGRAM EXAMPLE
      INTEGER, DIMENSION(:) :: ARRAY
      PARAMETER (N=100)
      ALLOCATE(ARRAY(N))
      END
! Fortran 90
PROGRAM EXAMPLE
  INTEGER, ALLOCATABLE :: ARRAY(:)
  INTEGER :: N
  N = 100
  ALLOCATE(ARRAY(N))
END PROGRAM EXAMPLE
これらの例は、FORTRAN 77からFortran 90への移行においてよく見られる変更点です。ただし、具体的なコードによってはさらなる変更が必要となります。移行の際には、コード全体の構造や変数のスコープ、メモリ管理などを注意深く検討することが重要です。
Fortran 90からFortran 95への移行は、比較的小規模な変更が含まれています。Fortran 95は主にFortran 90の機能を拡張し、いくつかの新しい機能を追加しています。以下に注意点や具体的なコード例を挙げてみます。
注意点
Fortran 95では、DOループの終了はEND DOステートメントを使用することが推奨されます。Fortran 90ではEND DOなしでも動作しますが、Fortran 95ではEND DOが必要です。
! Fortran 90
DO I = 1, 10
  ! ループ処理
END
! Fortran 95
DO I = 1, 10
  ! ループ処理
END DO
Fortran 95では、ALLOCATABLEな配列を宣言した後、明示的にALLOCATEステートメントを使用してメモリを割り当てることが推奨されます。Fortran 90では初期化が省略されている場合、配列は自動的に初期化されますが、Fortran 95では初期化が期待通りに動作しないことがあります。
! Fortran 90
REAL, ALLOCATABLE :: myArray(:)
! Fortran 95
REAL, ALLOCATABLE :: myArray(:)
ALLOCATE(myArray(10)) ! メモリの割り当て
Fortran 95では、ALLOCATABLEな配列のディメンジョンを変更する場合、ALLOCATEステートメントを再度使用してメモリを再割り当てすることが必要です。
! Fortran 90
REAL, ALLOCATABLE :: myArray(:)
ALLOCATE(myArray(10)) ! メモリの割り当て
! ディメンジョンの変更がFortran 95では推奨されない
myArray = [1.0, 2.0, ..., 10.0]
! Fortran 95
ALLOCATE(myArray(20)) ! メモリの再割り当て
Fortran 95では、ASSOCIATEブロックを使用して変数の関連性を示すことができます。これはFortran 90では導入されていなかった機能です。
! Fortran 95
REAL :: A(5), B(5)
ASSOCIATE (X => A, Y => B)
  ! XとYの使用
END ASSOCIATE
コード例
Fortran 90からFortran 95への移行に関する簡単なコード例を以下に示します。
! Fortran 90
PROGRAM Fortran90Example
  INTEGER :: i
  REAL, ALLOCATABLE :: myArray(:)
  DO i = 1, 10
    myArray(i) = i
  END DO
END PROGRAM Fortran90Example
! Fortran 95
PROGRAM Fortran95Example
  INTEGER :: i
  REAL, ALLOCATABLE :: myArray(:)
  ALLOCATE(myArray(20)) ! メモリの再割り当て
  DO i = 1, 20
    myArray(i) = i
  END DO
END PROGRAM Fortran95Example
この例では、ALLOCATABLEな配列の初期化とディメンジョンの変更に関する変更が示されています。注意点に従い、ALLOCATEステートメントを使ってメモリの再割り当てを行っています。
Fortran 95からFortran 2003への移行では、いくつかの新しい機能が導入され、言語の拡張が行われています。以下に注意点と具体的なコード例を挙げてみます。
注意点
Fortran 2003では、オブジェクト指向プログラミングが導入されました。これには新しいキーワードや概念（クラス、オブジェクト、メソッドなど）が含まれます。クラスとメソッドを定義し、オブジェクト指向のプログラム構造を導入することができます。
! Fortran 2003
MODULE Shapes
  TYPE :: Circle
    REAL :: radius
  END TYPE Circle
  CONTAINS
  FUNCTION CalculateArea(obj) RESULT(area)
    CLASS(Circle), INTENT(IN) :: obj
    REAL :: area
    area = 3.14159 * obj%radius**2
  END FUNCTION CalculateArea
END MODULE Shapes
Fortran 2003では、より柔軟な動的メモリ割り当ての方法が導入されました。ALLOCATEステートメントはそのまま利用可能ですが、新しい方法としてDEALLOCATE文も導入されました。
! Fortran 2003
PROGRAM DynamicMemory
  REAL, ALLOCATABLE :: array(:)
  ALLOCATE(array(10))
  ! arrayの使用
  DEALLOCATE(array)
END PROGRAM DynamicMemory
Fortran 2003では、共通ブロックの代わりにBLOCK DATAとMODULEを使用することが推奨されます。これにより、モジュール変数やモジュール手続きを使用してデータの共有が行えます。
! Fortran 2003
MODULE SharedData
  REAL :: sharedVariable
END MODULE SharedData
PROGRAM MainProgram
  USE SharedData
  ! sharedVariableの使用
END PROGRAM MainProgram
コード例
Fortran 95からFortran 2003への移行に関する簡単なコード例を以下に示します。
! Fortran 95
PROGRAM Fortran95Example
  INTEGER :: i
  REAL, ALLOCATABLE :: myArray(:)
  ALLOCATE(myArray(20))
  DO i = 1, 20
    myArray(i) = i
  END DO
  DEALLOCATE(myArray)
END PROGRAM Fortran95Example
! Fortran 2003
MODULE SharedData
  REAL :: sharedVariable
END MODULE SharedData
PROGRAM Fortran2003Example
  USE SharedData
  REAL, ALLOCATABLE :: myArray(:)
  ALLOCATE(myArray(30))
  DO i = 1, 30
    myArray(i) = i
  END DO
  DEALLOCATE(myArray)
END PROGRAM Fortran2003Example
この例では、オブジェクト指向プログラミング、動的メモリ割り当て、モジュールの使用といったFortran 2003の新機能が利用されています。 Fortran 2003以降のバージョンでは、これらの機能がさらに拡張されています。
Fortran 2003からFortran 2008への移行は、いくつかの重要な新機能や改良が導入されたものです。以下に注意点と具体的なコード例を挙げてみます。
注意点
Fortran 2008では、共有メモリ並列プログラミングのためのCoarraysと呼ばれる機能が導入されました。これにより、簡単に並列化されたコードを記述することができます。ただし、これを活用するには対応したコンパイラが必要です。
! Fortran 2008
PROGRAM ParallelExample
  REAL, DIMENSION(:), ALLOCATABLE :: A[:]
  REAL, DIMENSION(:), ALLOCATABLE :: B[:]
  REAL, DIMENSION(:), ALLOCATABLE :: C[:]
  ALLOCATE(A(10), B(10), C(10))
  ! Coarrayの使用
  A[:] = 1.0
  B[:] = 2.0
  C[:] = A[:] + B[:]
  ! イベント同期
  SYNC ALL
  ! メインスレッドのみがデータを出力
  IF (THIS_IMAGE() == 1) THEN
    PRINT *, C
  END IF
END PROGRAM ParallelExample
Fortran 2008では、サブモジュールと呼ばれる機能が追加され、モジュール内でモジュール手続きを定義できるようになりました。これにより、モジュールの階層構造をより柔軟に構築できます。
! Fortran 2008
MODULE ParentModule
  REAL :: parentVariable
  CONTAINS
  SUBMODULE(SubModule1)
    ! サブモジュール1の定義
  END SUBMODULE
  SUBMODULE(SubModule2)
    ! サブモジュール2の定義
  END SUBMODULE
END MODULE ParentModule
Fortran 2008では、派生型の機能が拡張され、新しいデータ型を作成しやすくなりました。これにより、オブジェクト指向プログラミングの機能が向上しました。
! Fortran 2008
MODULE MyModule
  TYPE :: Point
    REAL :: x, y
  END TYPE Point
  TYPE, EXTENDS(Point) :: Point3D
    REAL :: z
  END TYPE Point3D
END MODULE MyModule
コード例
Fortran 2003からFortran 2008への移行に関する簡単なコード例を以下に示します。
! Fortran 2003
MODULE SharedData
  REAL :: sharedVariable
END MODULE SharedData
PROGRAM Fortran2003Example
  USE SharedData
  REAL, ALLOCATABLE :: myArray(:)
  ALLOCATE(myArray(30))
  DO i = 1, 30
    myArray(i) = i
  END DO
  DEALLOCATE(myArray)
END PROGRAM Fortran2003Example
! Fortran 2008
PROGRAM Fortran2008Example
  REAL, DIMENSION(:), ALLOCATABLE :: A[:]
  REAL, DIMENSION(:), ALLOCATABLE :: B[:]
  REAL, DIMENSION(:), ALLOCATABLE :: C[:]
  ALLOCATE(A(10), B(10), C(10))
  ! Coarrayの使用
  A[:] = 1.0
  B[:] = 2.0
  C[:] = A[:] + B[:]
  ! イベント同期
  SYNC ALL
  ! メインスレッドのみがデータを出力
  IF (THIS_IMAGE() == 1) THEN
    PRINT *, C
  END IF
END PROGRAM Fortran2008Example
この例では、Coarraysやサブモジュールの利用によるFortran 2008の新機能が示されています。Fortran 2008はFortran言語の進化の中で大きな変革をもたらし、並列プログラミングやモジュールの機能強化などが加わりました。
Fortran 2008からFortran 2018への移行では、言語仕様の拡張や新機能の追加が主な変更点となります。以下に、注意点と具体的なコード例を挙げてみます。
注意点
Fortran 2018では非同期入出力（Asynchronous I/O）が導入されました。これにより、ファイルへの非同期書き込みや非同期読み取りがサポートされます。
! Fortran 2018
PROGRAM AsyncIOExample
  INTEGER :: unit
  CHARACTER(LEN=100) :: data
  OPEN(NEWUNIT=unit, FILE='output.txt', STATUS='REPLACE', ACTION='WRITE')
  ! 非同期書き込み
  WRITE(unit, ASYNCHRONOUS) 'Hello, World!'
  FLUSH(unit)
  ! 非同期読み取り
  READ(unit, ASYNCHRONOUS) data
  ! イベント同期
  CALL SYSTEM_CLOCK(COUNT=nstart)
  INQUIRE(unit, IOSTAT=ios)
  DO WHILE (ios /= 0)
    CALL SYSTEM_CLOCK(COUNT=nend)
    IF (nend - nstart > timeout) THEN
      PRINT *, 'Timeout error!'
      EXIT
    END IF
    CALL SYSTEM_CLOCK(COUNT=nstart)
    INQUIRE(unit, IOSTAT=ios)
  END DO
  PRINT *, 'Read:', data
  CLOSE(unit)
END PROGRAM AsyncIOExample
Fortran 2018では、IEEE 754-2008標準に基づく数学関数が導入されました。これにより、浮動小数点演算の一貫性が向上しました。
! Fortran 2018
PROGRAM MathFunctionsExample
  REAL(8) :: x, y
  x = 2.0
  y = SQRT(x)
  PRINT *, 'Square root of', x, 'is', y
END PROGRAM MathFunctionsExample
Fortran 2018では、Coarraysの機能が強化されました。新たなライブラリや手法が導入され、共有メモリの柔軟な操作が可能になりました。
! Fortran 2018
PROGRAM CoarrayExample
  REAL, DIMENSION(:), ALLOCATABLE :: A[:]
  INTEGER :: team_size
  ! Coarrayの作成
  ALLOCATE(A(10)[*])
  ! 全てのコレクティブルードイメージでの同期
  SYNC ALL
  ! チームのサイズの取得
  team_size = TEAM_NUMBER()
  ! チームの中でのマスターコード
  IF (team_size > 1 .AND. THIS_IMAGE() == 1) THEN
    ! サブチームの作成
    CALL TEAM(type=4, team_number=my_sub_team)
    ! サブチームでの処理
    ! ...
  END IF
  ! 同期解除
  SYNC NONE
  ! Coarrayの使用
  A(1)[2] = 42.0
  ! イベント同期
  SYNC ALL
  ! 終了
  DEALLOCATE(A)
END PROGRAM CoarrayExample
コード例
Fortran 2008からFortran 2018への移行に関する簡単なコード例を以下に示します。ただし、Fortran 2018の新機能の多くは複雑で、特に非同期入出力や協調配列処理の活用はアプリケーションの性質により異なります。
! Fortran 2008
PROGRAM Fortran2008Example
  REAL, DIMENSION(:), ALLOCATABLE :: A[:]
  REAL, DIMENSION(:), ALLOCATABLE :: B[:]
  REAL, DIMENSION(:), ALLOCATABLE :: C[:]
  ALLOCATE(A(10), B(10), C(10))
  ! Coarrayの使用
  A[:] = 1.0
  B[:] = 2.0
  C[:] = A[:] + B[:]
  ! イベント同期
  SYNC ALL
  ! メインスレッドのみがデータを出力
  IF (THIS_IMAGE() == 1) THEN
    PRINT *, C
  END IF
END PROGRAM Fortran2008Example
! Fortran 2018
PROGRAM Fortran2018Example
  REAL, DIMENSION(:), ALLOCATABLE :: A[:]
  REAL, DIMENSION(:), ALLOCATABLE :: B[:]
  REAL, DIMENSION(:), ALLOCATABLE :: C[:]
  ALLOCATE(A(10), B(10), C(10))
  ! Coarrayの使用
  A[:] = 1.0
  B[:] = 2.0
  C[:] = A[:] + B[:]
  ! 非同期入出力
  OPEN(NEWUNIT=unit, FILE='output.txt', STATUS='REPLACE', ACTION='WRITE')
  WRITE(unit, ASYNCHRONOUS) C
  FLUSH(unit)
  ! イベント同期
  SYNC ALL
  ! メインスレッドのみがデータを出力
  IF (THIS_IMAGE() == 1) THEN
    PRINT *, C
  END IF
  ! 非同期入出力のクローズ
  CLOSE(unit)
END PROGRAM Fortran2018Example
この例では、非同期入出力や協調配列処理の新機能を活用したFortran 2018の機能が示されています。Fortran 2018は高度な並列プログラミングや数学関数の強化など、多くの新機能が含まれています。
Fortran 2018からFortran 2023への移行について、提供されたコード例を踏まえて注意点を述べます。
注意点
Fortran 2023では、従来型の弧度ベースの三角関数に加えて、角度ベースの三角関数が組み込み関数として導入されました。これにより、角度に対する三角関数を直接使用できるようになりました。
Fortran 2023では、do concurrent 構文に reduce 指定子を使用してreduction演算を行うことができるようになりました。これにより、配列の次元を減少させる演算を同時に並行して実行できます。