Fortran
プログラム単位とファイルレイアウト
サーチ…
Fortranプログラム
完全なFortranプログラムは、いくつかの異なるプログラム単位で構成されています。プログラム単位は:
- メインプログラム
- 関数またはサブルーチンサブプログラム
- モジュールまたはサブモジュール
- ブロックデータプログラムユニット
メインプログラムといくつかのプロシージャ(ファンクションまたはサブルーチン)サブプログラムは、Fortran以外の言語で提供される場合があります。例えば、Cのメインプログラムは、Fortranの関数サブプログラムによって定義された関数を呼び出すことができます。あるいは、Fortranのメインプログラムは、Cで定義されたプロシージャを呼び出すことができます。
これらのFortranプログラム単位は、別個のファイルであるか、または単一のファイル内で与えられてもよい。
たとえば、次の2つのファイルが表示されます。
prog.f90
program main
use mod
end program main
mod.f90
module mod
end module mod
コンパイラ(正しく呼び出された)はメインプログラムをモジュールに関連付けることができます。
1つのファイルには多くのプログラム単位
すべて.f90
module mod
end module mod
program prog
use mod
end program prog
function f()
end function f()
しかし、この場合、関数f
は主プログラムとモジュールに関する限り、依然として外部関数であることに注意する必要があります。ただし、メインプログラムからモジュールにアクセスできます。
入力範囲の規則は、個々のプログラム単位に適用され、それらが含まれているファイルには適用されません。たとえば、各スコープ単位に暗黙の型定義を持たせたくない場合、上記のファイルは次のように記述する必要があります。
module mod
implicit none
end module mod
program prog
use mod
implicit none
end program prog
function f()
implicit none
<type> f
end function f
モジュールとサブモジュール
モジュールは他の場所で文書化されています 。
コンパイラは多くの場合、いわゆるモジュールファイルを生成します 。
module my_module
end module
コンパイラによってmy_module.mod
ような名前のファイルがmy_module.mod
されます。そのような場合、モジュールがプログラム単位によってアクセス可能であるためには、このモジュールファイルは、この後者のプログラム単位が処理される前に可視でなければならない。
外部手続き
外部プロシージャーは、別のプログラム単位の外に定義されたもの、またはFortran以外の手段によって定義されたものです。
のようなファイルに含まれる関数
integer function f()
implicit none
end function f
外部機能です。
外部プロシージャの場合、それらの存在は、インタフェースブロック(明示的なインタフェースが与えられている)を使用して宣言することができます。
program prog
implicit none
interface
integer function f()
end interface
end program prog
暗黙的なインタフェースを与えるための宣言文
program prog
implicit none
integer, external :: f
end program prog
あるいは
program prog
implicit none
integer f
external f
end program prog
external
属性は必要ありません。
program prog
implicit none
integer i
integer f
i = f() ! f is now an external function
end program prog
ブロックデータプログラム単位
ブロックデータプログラム単位は、共通ブロック内のオブジェクトの初期値を提供するプログラム単位です。これらはここでは文書化されていませんので、歴史的なFortranの機能のドキュメントに記載されています。
内部サブプログラム
他のプログラム単位を含有することができる内部サブプログラムではないプログラム部は、 内部サブプログラムと呼ばれます。
program prog
implicit none
contains
function f()
end function f
subroutine g()
end subroutine g
end program
このような内部サブプログラムには、多くの機能があります。
- サブプログラム内のエンティティと外部プログラムの間にホストアソシエーションが存在する
- 暗黙の型定義ルールは継承されます(
implicit none
は上記のf
で有効です) - 内部サブプログラムは、ホストで使用可能な明示的なインタフェースを持っています。
モジュール・サブプログラムおよび外部サブプログラムには、内部サブプログラムが含まれる場合があります。
module mod
implicit none
contains
function f()
contains
subroutine s()
end subroutine s
end function f
end module mod
ソースコードファイル
ソースコードファイルは、コンパイラによって処理される(一般的に)プレーンテキストファイルです。ソースコードファイルには、最大1つのメインプログラムと任意の数のモジュールと外部サブプログラムを含めることができます。たとえば、ソースコードファイルには次のものが含まれます
module mod1
end module mod1
module mod2
end module mod2
function func1() ! An external function
end function func1
subroutine sub1() ! An external subroutine
end subroutine sub1
program prog ! The main program starts here...
end program prog ! ... and ends here
function func2() ! An external function
end function func2
外部サブプログラムがモジュールとメインプログラムと同じファイルに与えられているにもかかわらず、外部サブプログラムは他のコンポーネントによって明示的に知られていないことに注意してください。
あるいは、個々のコンポーネントを複数のファイルに分散し、異なる時間にコンパイルすることさえできます。複数のファイルを1つのプログラムにまとめる方法については、コンパイラのドキュメントを参照してください。
単一のソースコードファイルには、 固定形式または自由形式のソースコードが含まれていてもかまいません。複数のファイルをコンパイル時に組み合わせても、異なるスタイルを持つこともあります。
ソース形式をコンパイラに示すには、一般的に2つのオプションがあります。
- ファイル名接尾辞の選択
- コンパイラフラグの使用
固定または自由形式のソースを示すコンパイル時フラグは、コンパイラーのドキュメントにあります。
重要なファイル名の接尾辞はコンパイラのドキュメントにも記載されていますが、原則としてfile.f90
という名前のファイルは自由形式のソースを含んでいますが、 file.f
は固定形式のソースを含むものです。
フリーフォームソース(Fortran 90標準で導入されたもの)を示すために.f90
サフィックスを使用すると、プログラマはサフィックスを使用して、ソースコードが準拠している言語標準を示すことをしばしば誘惑します。たとえば、 .f03
または.f08
接尾辞を持つファイルが表示されることがあります。 Fortran 2003のほとんどのソースは、Fortran 77、Fortran 90/5、Fortran 2008にも準拠しています。さらに、多くのコンパイラはこのような接尾辞を自動的には考慮しません。
コンパイラには、(通常、cppに基づいた)組み込みのコードプリプロセッサも用意されています。ここでも、コンパイル前にプリプロセッサを実行すべきであることを示すためにコンパイル時フラグを使用することができるが、ソースコードファイルの接尾辞はそのような前処理要件を示すこともある。
大文字と小文字を区別するファイルシステムの場合、 file.F
ファイルは前処理する固定形式のソースファイルとし、 file.F90
前処理する自由形式のソースファイルとすることがよくあります。これまでのように、このようなフラグとファイルの接尾辞については、コンパイラーのドキュメントを参照する必要があります。