Fortran/形式と構造
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以降では、空白と空行は通常無視されます。一部の文には空白が必要です。例えば、program
、function
、subroutine
文では、文キーワードとプログラムユニット識別子の間に空白が必要です。
ただし、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