Fortran/形式と構造
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以降では通常問題になりません。例えば、program
、function
、subroutine
のように、ステートメントキーワードとプログラムユニット識別子の間にホワイトスペースを必要とするステートメントもあります。
しかし、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