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はほとんど同じ拡張機能を持っていました。
バージョン間の相違点
[編集]- FORTRAN 66のコメントは1列目に
C
という文字で示されますが、FORTRAN 77のコメントは1列目に*
を使うこともできます。また、Fortran 90 では!
文字の使用も可能です。 - FORTRAN 77 のシンボル名は 6 文字に制限されていますが、Fortran 90 では 31 文字までの名前を使用できます。
- FORTRAN 77 のソースファイルは単語が始まる前に 6 つのスペースが必要ですが、Fortran 90 はそうではありません (自由形式のコードスタイルを採用しているため)。
大文字のFORTRAN
[編集]大文字の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カラム。
- コメント行は1カラム目にCと記入する。
- 継続行は、6カラム目になんらかの文字を記入する。
- 小文字のFortranでは、自由欄形式が使えるようになりました。またコメントには '!' から行末まで。
- 英大文字での記述。
- ただし、Fortranでも英大文字と小文字は区別されません.
FORTRAN 77 から Fortran 90 への移行について注意点
[編集]FORTRAN 77からFortran 90への移行において考慮すべき注意点をいくつかの具体的なコード例で示します。
- free-form形式のコード:
- 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 90では、
これらの例は、FORTRAN 77からFortran 90への移行においてよく見られる変更点です。ただし、具体的なコードによってはさらなる変更が必要となります。移行の際には、コード全体の構造や変数のスコープ、メモリ管理などを注意深く検討することが重要です。
Fortran 90 から Fortran 95 への移行について注意点
[編集]Fortran 90からFortran 95への移行は、比較的小規模な変更が含まれています。Fortran 95は主にFortran 90の機能を拡張し、いくつかの新しい機能を追加しています。以下に注意点や具体的なコード例を挙げてみます。
- 注意点
- DOループのEND DO:
- 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では、DOループの終了は
- ALLOCATABLE配列の初期化:
- Fortran 95では、
ALLOCATABLE
な配列を宣言した後、明示的にALLOCATE
ステートメントを使用してメモリを割り当てることが推奨されます。Fortran 90では初期化が省略されている場合、配列は自動的に初期化されますが、Fortran 95では初期化が期待通りに動作しないことがあります。
! Fortran 90 REAL, ALLOCATABLE :: myArray(:) ! Fortran 95 REAL, ALLOCATABLE :: myArray(:) ALLOCATE(myArray(10)) ! メモリの割り当て
- Fortran 95では、
- ALLOCATABLE配列のディメンジョン変更:
- 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 95では、
ASSOCIATE
ブロックを使用して変数の関連性を示すことができます。これはFortran 90では導入されていなかった機能です。
! Fortran 95 REAL :: A(5), B(5) ASSOCIATE (X => A, Y => B) ! XとYの使用 END ASSOCIATE
- Fortran 95では、
- コード例
- 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 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では、より柔軟な動的メモリ割り当ての方法が導入されました。
- 共通ブロックの代替:
- Fortran 2003では、共通ブロックの代わりに
BLOCK DATA
とMODULE
を使用することが推奨されます。これにより、モジュール変数やモジュール手続きを使用してデータの共有が行えます。
! Fortran 2003 MODULE SharedData REAL :: sharedVariable END MODULE SharedData PROGRAM MainProgram USE SharedData ! sharedVariableの使用 END PROGRAM MainProgram
- Fortran 2003では、共通ブロックの代わりに
- コード例
- 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 2003からFortran 2008への移行は、いくつかの重要な新機能や改良が導入されたものです。以下に注意点と具体的なコード例を挙げてみます。
- 注意点
- Coarraysと並列プログラミング:
- 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 2008からFortran 2018への移行では、言語仕様の拡張や新機能の追加が主な変更点となります。以下に、注意点と具体的なコード例を挙げてみます。
- 注意点
- Asynchronous Input/Output:
- 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
- 協調配列処理 (Coarray Features Enhancement):
- 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 2018からFortran 2023への移行について、提供されたコード例を踏まえて注意点を述べます。
- 注意点
- 新しい三角関数機能の導入:
- Fortran 2023では、従来型の弧度ベースの三角関数に加えて、角度ベースの三角関数が組み込み関数として導入されました。これにより、角度に対する三角関数を直接使用できるようになりました。
- do concurrentのreduction演算の利用:
- Fortran 2023では、
do concurrent
構文にreduce
指定子を使用してreduction演算を行うことができるようになりました。これにより、配列の次元を減少させる演算を同時に並行して実行できます。
- Fortran 2023では、