コンテンツにスキップ

Fortran/形式と構造

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

2つの形式

[編集]

古いバージョンのFORTRANでは、プログラムの形式に厳格なガイドラインがありました。Fortran 90では、この制限が緩和され、「自由形式」のコードと従来の「固定形式」のコードの両方が受け入れられるようになりました。

固定形式の場合

[編集]

Fortran 90より前には、ソースコードは明確に定義された「固定形式」に従っていました。コメントは最初の列に '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文字に制限されていましたが、これはコンパイラのベンダーによってしばしば拡張されていました。

自由形式

[編集]

Fortran 90以降、ソースコードには固定列形式は不要です。この場合、コマンドは任意の列で開始できます。72列の制限も解除されました。これにより、インデントのための余裕が大幅に増えます。

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

大文字小文字の区別

[編集]

Fortranは大文字と小文字を区別しません。Fortranは通常、大文字のみをサポートするシステムで使用されていました。実際、言語自体がFORTRAN(大文字)と呼ばれていました。これは、モノクロームディスプレイや印刷物で表示されるソースコードでキーワードを区別するために便利です。今日では、これを置き換えるために構文の強調表示(Syntax highlight)が利用可能です。しかし、古いFORTRANコードと現代のソースコードを視覚的に区別するために、Fortranコマンドをすべて大文字で入力するのは有用です。

空白文字について

[編集]

Fortran 90以降では、空白と空行は通常無視されます。一部の文には空白が必要です。例えば、programfunctionsubroutine文では、文キーワードとプログラムユニット識別子の間に空白が必要です。

ただし、C、C++、Javaなどの他の言語とは異なり、行区切り文字 ';' はオプションです。したがって、各コード行を独自の行に保つことができます。ただし、コマンドセパレータ文字 ';' の使用は非推奨です。

構造

[編集]

プログラム・ユニット

[編集]

Fortranプログラムはプログラムユニットで構成されています。単一のソースコードファイルには複数のプログラムユニットを含めることができますが、各プログラムユニットを個々の独立したソースコードファイルに配置するのが一般的です。プログラムユニットは、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

サブプログラム

[編集]

プログラムユニットは、手続き(関数とサブルーチン)、ブロックデータ、モジュール、またはサブモジュールになることがあります。

外部サブプログラム
[編集]

次のコードは、メインプログラムと関数を示しています。increment 関数は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

関数

[編集]

サブルーチン

[編集]

ブロックデータ

[編集]

モジュール

[編集]

サブモジュール

[編集]