2つの形式編集

古いバージョンのFORTRANでは、プログラムの形式に厳しいガイドラインがありました。Fortran 90ではこの制限が撤廃され、歴史的な「固定形式」のコードだけでなく、「自由形式」のコードも受け入れられるようになりました。

固定形式の場合編集

Fortran 90より前のソースコードは、明確に定義された「固定形式」に従っていました。コメントは1列目に'C'で示され、2~5列目は任意の数値文ラベルのために確保され、6列目の空白でない文字は現在の行が前の行からの続きであることを示し、7~72列目はプログラム文のために利用可能でした。73から80列目は無視され、しばしば行のシーケンス番号が含まれていました。空白行は許されません。このような厳格な形式は、Fortranがバッチ計算とパンチカード入力の時代に開発された結果です。パンチカードをカードリーダーにセットし、73~80列目でソートすれば、プログラムの順序を回復することができます。コンパイラベンダーは、この形式の拡張機能を提供していたが、移植性はほとんどなかった(例えば、タブ文字を6個のスペースと解釈するなど)。

列の位置は重要ですが、ホワイトスペースは重要ではありません。次のプログラムは、固定形式のFortranにおけるホワイトスペースの合法的な使用方法を示しています。

C2345678901234567890
      PROGRAM Z
      GOTO11
   11 CONTINUE
      GO TO 780
 780  CONTINUE
      G OTO3 60
 360  CONTINUE
      STOP
      END

このコードは技術的には合法ですが、読みやすさを維持するために、キーワード、ラベル、データを区切るためにホワイトスペースを使用することが強く推奨されます。

FortranはASCII文字セットが標準化される前に開発され、伝統的にFORTRANコードは全て大文字で書かれてきました。変数名は6文字までとされていましたが、コンパイラベンダーによって拡張されることが多かったようです。

自由形式編集

Fortran90以降のソースコードでは、固定列の形式を必要としません。この場合、コマンドはどの列からでも自由に開始できます。また、72カラムの制限も解除されました。これにより、インデントのためのスペースが大幅に増えました。

program test
    implicit none
    integer four
    four = 4
    write (*,*) four
end program

大文字小文字の区別編集

Fortranは大文字と小文字を区別しません。Fortranは通常、大文字のみをサポートするシステムで使用されていました。実際、この言語自体がFORTRAN(大文字)と呼ばれていました。完全に不要ではありますが、今でもFortranのコマンドをすべて大文字で入力する習慣があります。これは、モノクロのディスプレイや印刷で表示されるソースコードのキーワードを区別するのに便利です。最近では、シンタックスハイライトでこれを置き換えることができます。しかし、古いFORTRANコードと最新のソースコードを視覚的に区別するためには有効です。

空白文字について編集

空白や空行は、Fortran 90以降では通常問題になりません。例えば、programfunctionsubroutineのように、ステートメントキーワードとプログラムユニット識別子の間にホワイトスペースを必要とするステートメントもあります。

しかし、C、C++、Javaなどの他の多くの言語とは異なり、行区切り文字「;」は任意であるため、コードの各行はそれぞれの行にとどまることができます。ただし、コマンド区切り文字「;」の使用は推奨されません。

構造編集

プログラム・ユニット編集

Fortranのプログラムはプログラム単位で構成されています。1つのソースコード・ファイルに複数のプログラム・ユニットを含めることができますが、各プログラム・ユニットを個別のソースコード・ファイルに入れるのが一般的です。最も基本的なプログラムユニットは一連のFortran文で構成され、最後にend文で締めくくられます。

メインプログラム編集

実行可能なプログラムには、必ずメイン・プログラム・ユニットが必要です。例えば、以下は完全なコンパイルおよび実行可能なプログラムです。

write (*,*) "Hello, world"
end

しかし、メインのプログラムユニットであることを示すために、programステートメントを使用する方がはるかに明確です。

program main
    write (*,*) "Hello, world!"
end program main

メインプログラムはセクションに分かれています。最初のセクションは、モジュールのuse文で構成されます。続いて、宣言されていない変数が暗黙的に型付けされるかどうかを制御するimplicit / implicit none文が続きます。続いて、変数、型、インターフェース、プロシージャを宣言する宣言セクションがあります。次にメインプログラムの実行文が来る。最後のセクションは、containsステートメントによって開始される内部サブプログラムです。

program main
    ! Use statements section
    use module_name
    ! Implicit none statement section
    implicit none
    ! Declarations section
    integer :: a
    real :: b
    
    ! Executable section
    write (*,*) "Blah, blah, blah..."
end program main

サブプログラム編集

プログラムユニットはサブプログラムである場合もあります。プロシージャ(関数やサブルーチン)、ブロックデータ、モジュール、サブモジュールなどがあります。

外部サブプログラム編集

次のコードは、メインプログラムと関数を示しています。インクリメント関数はメインプログラムの外部にあるため、メインプログラムの4行目に宣言が必要です。

program main
    implicit none
    integer :: a
    integer, external :: increment

    a = increment(34)
    write (*,*) a
end program main

function increment(input) result (output)
    implicit none
    integer :: output
    integer :: input

    output = input + 1
end function increment

とはいえ、関数のインターフェイスは暗黙的なままです。外部プロシージャを明示的に宣言するには、外部プロシージャの入力と出力をすべて宣言するインターフェイスを使用することができます。この場合、メインプログラムは次のようになります。

program main
    implicit none
    integer :: a
    interface
        integer function increment(input)
            integer :: input
        end function
    end interface

    a = increment(34)
    write (*,*) a
end program main
内部サブプログラム編集

内部サブプログラムは、親プログラムユニットの一部であるため、明示的なインタフェースや宣言を必要としません。サブプログラムがプログラムユニットのcontainsセクションに含まれている場合、そのサブプログラムは内部的なものとなります。

program main
    implicit none
    integer :: a

    a = increment(34)
    write (*,*) a
    
contains

    function increment(input) result (output)
        integer :: output
        integer :: input

        output = input + 1
    end function increment

end program main

関数編集

サブルーチン編集

ブロックデータ編集

モジュール編集

サブモジュール編集