Sun Studio 12: Fortran ユーザーズガイド

第 4 章 Fortran 95 の機能と相違点

この章では、標準の Fortran 95 と Fortran 95 コンパイラ f95 の機能の主な相違点について説明します。

4.1 ソース言語の機能

Fortran 95 コンパイラは、Fortran 95 標準規則に対して、次のソース言語の機能および拡張機能を提供します。

4.1.1 継続行の制限

f95 では、999 行まで行を継続することができます (開始行が 1 行とそのあとの継続行が 999)。標準の Fortran 95 では、固定形式の場合で 19 行まで、自由形式の場合で 39 行までです。

4.1.2 固定形式のソースの行

固定形式のソースの場合、1 行に 73 文字以上使用できます。 ただし、73 桁目以降はすべて無視されます。標準の Fortran 95 では、行の長さは 72 文字までです。

4.1.3 タブ形式

f95 の固定形式のソーステキストは、次のように定義されています。

f95 のデフォルト最大行の長さは、固定形式で 72 列および自由形式で 132 列です。-e コンパイラオプションを使用すると、固定形式のソースの行を 132 列に拡張できます。

例: 左のタブの形式のソースは、右に表示されます。


!^IUses of tabs
^ICHARACTER *3 A = ’A’
^IINTEGER B = 2
^IREAL C = 3.0
^IWRITE(*,9) A, B, C
9^IFORMAT(1X, A3,
^I1 I3,
^I2 F9.1 )
^IEND
!       Uses of tabs
        CHARACTER *3 A = ’A’
        INTEGER B = 2
        REAL C = 3.0
        WRITE(*,9) A, B, C
9       FORMAT(1X, A3,
       1 I3,
       2 F9.1 )
        END

前述の例で、「^I」はタブ文字を表し、「1」および「2」で始まる行は継続行を表しています。コードはさまざまなタブの状態を示しますが、いずれの形式も推奨しません。

f95 は、タブがあると以降その行の 72 桁目までパディングします。そのため、次の行に継続する文字列にタブが挿入された場合、予想外の結果を招くことがあります。

ソースファイル :


^Iprint *, "Tab on next line
^I1this  continuation line starts with a tab."
^Iend

コードの実行結果 :


Tab on next line                                             this  continuation
 line starts with a tab.

4.1.4 想定するソースの書式

f95 が想定するソースの書式は、オプション、指令、および拡張子によって異なります。

拡張子が .f または .F のファイルは、固定形式とみなされます。拡張子が .f90.f95.F90、または .F95 のファイルは、自由形式とみなされます。

表 4–1 F95 ソース書式のコマンド行のオプション

オプション 

処理 

-fixed

すべてのソースファイルが Fortran の固定形式で記述されていると解釈します。 

-free

すべてのソースファイルが Fortran の自由形式で記述されていると解釈します。 

-free および -fixed オプションは、ファイル名の拡張子よりも優先されます。また、!DIR$ FREE 指令または !DIR$ FIXED 指令は、オプションおよびファイル名の拡張子よりも優先されます。

4.1.4.1 書式の混在

次のように、異なるソースの書式を混在させてもかまいません。

4.1.4.2 大文字・小文字の区別

Sun Fortran 95 では、デフォルトでは大文字と小文字が区別されません。すなわち、AbcDeF という変数は、abcdef と同じ文字列として扱われます。-U オプションを付けてコンパイルすると、コンパイラは大文字と小文字を区別します。

4.1.5 制限とデフォルト

4.2 データ型

ここでは、Fortran 95 データ型の特徴と拡張機能について説明します。

4.2.1 ブール (Boolean) 型

f95 では、ブール型の定数と式をサポートしています。ただし、ブール型の変数、配列、文はサポートしていません。

4.2.1.1 ブール型に関する規則

4.2.1.2 ブール型定数の代替書式

f95 では、ブール型定数 (8 進、16 進、ホレリス) を、次のような書式 (2 進ではありません) で使用することができます。ただし変数はブール型として宣言できません。標準の Fortran では、このような書式は許されていません。

8 進

書式は ddddddB です。d は任意の 8 進数です。

入出力の書式指定では、B という文字は 2 進数であることを示しますが、それ以外の場合は 8 進数であることを表します。

16 進

d が任意の 16 進の数字である X’ddd または X"ddd" の書式です。

ホレリス

ホレリスデータには、次の書式を使用できます。

nH

’H

""H

nL

’L

""L

nR

’R

""R

前述の「…」は文字列を表し、n は文字数を表します。

例: 8 進と 16 進の定数の表現例を示します。

ブール型定数 

1 ワード 32 ビットでの内部の 8 進数 

0B

00000000000

77740B

00000077740

X"ABE"

00000005276

X"-340"

37777776300

X’1 2 3’

00000000443

X’FFFFFFFFFFFFFFFF’

37777777777

例: 代入文での 8 進と 16 進の使用例を示します。


i = 1357B
j = X"28FF"
k = X’-5A’

算術式の中で 8 進数または 16 進数の定数を使用すると、結果が未定義になることがあります。 ただし、構文エラーにはなりません。

4.2.1.3 別の場所におけるブール型定数の使用

f95 では、DATA 文以外の場所で BOZ 定数を使用することができます。

Bbbb

Oooo

Zzzz

B"bbb"

O"ooo"

Z"zzz"

このような BOZ 定数が実数変数に代入されている場合には、型は変換されません。

標準の Fortran では、BOZ 定数は DATA 文でのみ使用できます。

4.2.2 数値データ型のサイズの略記法

f95 では、宣言文、関数文、IMPLICIT 文において、次のような非標準の書式で型を宣言することができます。1 列目の形式は一般に使用されていますが、非標準の Fortran 95 です。2 列目の種別番号はベンダーにより変わります。

表 4–2 数値データ型のサイズの表記法

非標準 

宣言子 

短縮書式 

意味 

INTEGER*1

INTEGER(KIND=1)

INTEGER(1)

1 バイトの符号付き整数 

INTEGER*2

INTEGER(KIND=2)

INTEGER(2)

2 バイトの符号付き整数 

INTEGER*4

INTEGER(KIND=4)

INTEGER(4)

4 バイトの符号付き整数 

LOGICAL*1

LOGICAL(KIND=1)

LOGICAL(1)

1 バイト論理型 

LOGICAL*2

LOGICAL(KIND=2)

LOGICAL(2)

2 バイト論理型 

LOGICAL*4

LOGICAL(KIND=4)

LOGICAL(4)

4 バイト論理型 

REAL*4

REAL(KIND=4)

REAL(4)

IEEE の単精度浮動小数点数 (4 バイト) 

REAL*8

REAL(KIND=8)

REAL(8)

IEEE の倍精度浮動小数点数 (8 バイト) 

REAL*16

REAL(KIND=16)

REAL(16)

IEEE の 4 倍精度浮動小数点数 (16 バイト) 

COMPLEX*8

COMPLEX(KIND=4)

COMPLEX(4)

単精度複素数 (各部に 4 バイト) 

COMPLEX*16

COMPLEX(KIND=8)

COMPLEX(8)

倍精度複素数 (各部に 8 バイト) 

COMPLEX*32

COMPLEX(KIND=16)

COMPLEX(16)

4 倍精度複素数 (各部に 16 バイト) 

4.2.3 データ型のサイズおよび整列

記憶領域および整列は常にバイト単位で表されます。シングルバイトに収まる値は、バイト整列です。

データ型のサイズおよび整列は、コンパイラのオプションとプラットフォーム、および変数の宣言方法に依存します。COMMON ブロック内のデフォルトの最大の整列は、4 バイトの境界整列です。

デフォルトのデータ整列および記憶領域の割り当ては、-aligncommon -f-dalign-dbl_align_all-xmemalign、および -xtypemap などの特別なオプションを指定してコンパイルすることにより、変更できます。このマニュアルは、これらのオプションが有効でないものとして記述されています。

いくつかプラットフォームにおける特殊ケースのデータ型および整列については、『Fortran プログラミングガイド』に追加の説明があります。

デフォルトのサイズおよび整列を次の表にまとめます (データ型のその他の点およびオプションは考慮していません)。

表 4–3 デフォルトのデータサイズおよび整列 (バイト)

Fortran 95 のデータ型 

サイズ 

デフォルトの整列 

COMMON 内の整列 

BYTE X

CHARACTER X

CHARACTER*n X

COMPLEX X

COMPLEX*8 X

DOUBLE COMPLEX X

COMPLEX*16 X

COMPLEX*32 X

16 

16 

32 

8/16 

DOUBLE PRECISION X

REAL X

REAL*4 X

REAL*8 X

REAL*16 X

16 

8/16 

INTEGER X

INTEGER*2 X

INTEGER*4 X

INTEGER*8 X

LOGICAL X

LOGICAL*1 X

LOGICAL*2 X

LOGICAL*4 X

LOGICAL*8 X

次の点に注意してください。

オプション -f または -dalign は、8、16、または 32 バイトのデータすべてを、強制的に 8 バイト境界で整列させます。オプション -dbl_align_all の場合は、すべてのデータが 8 バイト境界で整列します。これらのオプションを使用するプログラムには、移植性がない場合があります。

4.3 Cray ポインタ

Cray ポインタとは、別のエンティティーのアドレスを値に持つ変数のことです。 この別の言語要素のことを、「指示先」と呼びます。

f95 は、Cray ポインタをサポートしていますが、標準の Fortran 95 はサポートしていません。

4.3.1 構文

Cray ポインタの POINTER 文は次の形式で記述します。


POINTER  ( pointer_name, pointee_name [array_spec] ), …

pointer_namepointee_namearray_spec のそれぞれの意味は、次のとおりです。

pointer_name

対応する pointee_name へのポインタです。

pointer_name には pointee_name アドレスが含まれます。pointer_name にはスカラー変数名を指定してください。ただし、派生型は指定できません。禁止事項 : 定数、構造体の名前、配列、または関数。

pointee_name

対応する pointer_name の指示先です。

制限事項 : 変数名、配列の宣言子、配列名を指定してください。

array_spec

array_spec を指定する場合は、明示的な実体があるもの (定数または非定数のサイズを持つもの)、または仮のサイズを持つものを指定してください。

例: 2 つの指示先に対して Cray ポインタを宣言できます。


    POINTER ( p, b ),  ( q, c )

前述の例では、Cray ポインタ p とその指示先 b、Cray ポインタ q とその指示先 c を宣言しています。

例: 配列に対して Cray ポインタを宣言することもできます。


     POINTER ( ix, x(n, 0:m) )

この例では、Cray ポインタ ix とその指示先 x を宣言しています。同時に、xn × m+1 次元の配列であることを宣言しています。

4.3.2 Cray ポインタの目的

ポインタを使用すると、記憶領域の特定の場所に変数を動的に対応付け、ユーザーが管理する記憶領域にアクセスすることができます。

Cray ポインタでは、メモリーの絶対アドレスにアクセスすることができます。

4.3.3 Cray ポインタと Fortran 95 のポインタ

Cray ポインタは次のように宣言します。

POINTER ( pointer_name, pointee_name [array_spec] )

Fortran 95 のポインタは次のように宣言します。

POINTER object_name

この 2 種類のポインタを混在させることはできません。

4.3.4 Cray ポインタの機能

4.3.5 Cray ポインタの制限事項

4.3.6 Cray ポインタの指示先の制限事項

4.3.7 Cray ポインタの使用法

Cray ポインタには次のようにして値を割り当てることができます。

例: Cray ポインタの使用例


    SUBROUTINE  sub ( n )
    COMMON pool(100000)
    INTEGER blk(128), word64
    REAL a(1000), b(n), c(100000-n-1000)
    POINTER ( pblk, blk ), (ia, a ), ( ib, b ), &
            ( ic, c ), ( address, word64 )
    DATA address / 64 /
    pblk = 0
    ia = LOC( pool )
    ib = ia + 4000
    ic = ib + n
    ...

前述の例を説明します。

4.4 STRUCTURE および UNION (VAX Fortran)

f77 からのプログラムの移行をサポートするために、 f95 は、VAX Fortran の STRUCTURE および UNION 文を受け付けます。これらは、Fortran 95 の「構造型」に相当します。構文についての詳細は、『FORTRAN 77 言語リファレンス』を参照してください。

STRUCTURE の欄宣言は、次のいずれかになります。

f77 と同様に、POINTER 文を欄宣言として使用することはできません。

また、f95 には次のような拡張機能があります。

4.5 符号なし整数

Fortran 95 コンパイラでは言語が拡張され、新しいデータ型である UNSIGNED が使用可能になりました。UNSIGNED では、KIND (種別) パラメータに対して指定できる値は 4 つです。パラメータ値、1、2、4、8 はそれぞれ 1、2、4、8 バイトの符号なし整数に対応します。

符号なし整定数は、数字列のあとに大文字または小文字の U が付き、場合によっては下線と種別パラメータが続くという形式です。次の例では、符号なし整定数の最大値が示されています。


         255u_1
         65535u_2
         4294967295U_4
         18446744073709551615U_8

種別パラメータが付いていない場合 (12345U) は、デフォルトは基本整数の場合と同じです。この場合、デフォルトは U_4 ですが、-xtypemap オプションを使うとデフォルトの符号なし整数の種別が変更されます。

UNSIGNED 種別指定子を使って、符号なし整変数または配列を宣言します。


        UNSIGNED U
        UNSIGNED(KIND=2) :: A
        UNSIGNED*8 :: B

4.5.1 演算式

4.5.2 関係式

関係組み込み演算を使用して、符号あり整数と符号なし整数の演算対象を比較できます。結果は演算対象の変更されない値に基づいて決まります。

4.5.3 制御構文

4.5.4 入出力構文

4.5.5 組み込み関数

4.6 Fortran 2003 の機能

今回の f95 コンパイラのリリースには、Fortran 2003 規格の多数の新機能が含まれています。詳細は、Fortran 2003 規格を参照してください。

4.6.1 C 関数との相互運用性

Fortran の新しい規格には次のものが含まれています。

ISO_C_BINDING モジュールは、C の型と互換のデータを表す種別パラメータである名前付き定数へのアクセスを可能にします。

この規格草稿は、BIND(C) 属性も取り入れています。Fortran の構造型は、BIND 属性を持つものならば、C と相互に利用できます。

Fortran 95 コンパイラの今回のリリースでは、規格草稿の第 15 章に記述されている機能を実現します。また、規格第 4 章に述べられている、C の型に対応する構造型およびリストを定義する機能を備えます。

4.6.2 IEEE 浮動小数点の例外処理

新しい組み込みモジュール、IEEE_ARITHMETIC および IEEE_FEATURES は、Fortran 言語における例外と IEEE 演算をサポートします。次のように指定すると、これらの機能がすべてサポートされます。

USE, INTRINSIC :: IEEE_ARITHMETIC

USE, INTRINSIC :: IEEE_FEATURES

INTRINSIC キーワードが Fortran 2003 で新しく追加されました。これらのモジュールは、一連の構造型、定数、丸めモード、照会関数、要素別処理関数、種別関数、要素別処理サブルーチン、非要素別処理サブルーチンを定義します。詳細は Fortran 2003 規格草稿の第 14 章に説明があります。

4.6.3 コマンド行引数用組み込み関数

Fortran 2003 規格では、コマンド行引数および環境変数を処理するための新しい組み込み関数が紹介されています。それら組み込み関数は次の 3 つです。

4.6.4 PROTECTED 属性

Fortran 95 コンパイラでは、新たに Fortran 2003 の PROTECTED 属性が使えるようになりました。PROTECTED はモジュール要素の使用に制限を設けます。PROTECTED 属性を持つオブジェクトは、それ自身が宣言されるモジュール内でのみ定義可能です。

4.6.5 Fortran 2003 非同期入出力

コンパイラは入出力文中の ASYNCHRONOUS 指定子を認識します。

ASYNCHRONOUS=[’YES’ | ’NO’]

この構文は Fortran 2003 規格の第 9 章で提案されているものです。WAIT 文とともに使うことで、コンピューティングで重複する可能性のある入出力処理を指定することができます。このコンパイラは ASYNCHRONOUS=’YES’ を認識しますが、規格草稿は実際の非同期入出力を要求しません。今回のコンパイラのリリースでは、入出力は常に同期します。

4.6.6 ALLOCATABLE 属性の拡張機能

Fortran 2003 で、ALLOCATABLE 属性に使用できるデータエンティティーが拡張されました。以前、この属性はローカルに格納された配列変数に制限されていました。現在では、次の要素を使用できます。

割り付け要素は、記憶領域に関連付けられているすべての場所で使用が禁止されています。COMMON ブロックと EQUIVALENCE 文。割り付け配列成分は SEQUENCE 型になることがありますが、そのような型のオブジェクトは COMMON および EQUIVALENCE で使用できません。

4.6.7 VALUE 属性

f95 コンパイラは、Fortran 2003 VALUE 型の宣言属性を受け入れます。

この属性とともに副プログラムのダミー入力引数を指定すると、実際の引数は「値」によって渡されます。次の例では、リテラル値を引数とする Fortran 95 副プログラムを呼び出す C 言語の主プログラムにおいて VALUE 属性を使用しています。


C コード:
#include <stdlib.h>
int main(int ac, char *av[])
{
    to_fortran(2);
}

Fortran コード:
       subroutine to_fortran(i)
       integer, value :: i
       print *, i
       end

4.6.8 Fortran 2003 ストリーム入出力

Fortran 2003 規格では、新しい「ストリーム」入出力方式が定義されています。ストリーム入出力探査は、データファイルを連続したバイトのシーケンスとして扱い、1 から始まる正の整数でアドレスを定義できます。データファイルは、書式付きアクセスまたは書式なしアクセス用に結合できます。

OPEN 文で ACCESS=’STREAM’ 指定子を使用して、ストリーム入出力ファイルを宣言します。バイトアドレスにファイルを位置付けるには、READ または WRITE 文に POS=scalar_integer_expression 指定子が必要です。 INQUIRE 文では、ACCESS='STREAM'、指定子 STREAM=scalar_character_variable、および POS=scalar_integer_variable が使用できます。

4.6.9 Fortran 2003 の書式付き入出力機能

3 つの新しい Fortran 2003 書式付き入出力指定子が、f95 に実装されています。これらの指定子は、OPENREADWRITEPRINT、および INQUIRE 文で指定されます。

INQUIRE 文で使用する場合は、これらの指定子は、現在の値を返すための文字変数を宣言します。

新しい編集記述子 DPDCRP、および RC は、単一の FORMAT 文内のデフォルトの設定を、それぞれ、小数点、小数部のコンマ、プロセッサ定義の丸め、および互換性のある丸めに変更します。次に例を示します。

WRITE(*,’(I5,DC,F10.3)’) N, W

F10.3 出力項目のピリオドの代わりにコンマが使用されます。

書式付き入出力の浮動小数点丸めモードの変更については、-iorounding コンパイラコマンド行オプションも参照してください (「3.4.49 -iorounding[ ={compatible|processor-defined}]」)。

4.6.10 Fortran 2003 の FLUSH 入出力文

f95 コンパイラでは、Fortran 2003 の FLUSH 文を使用できます。FLUSH 文を使用すると、外部ファイルに書き込まれたデータをほかのプロセスで利用したり、Fortran 以外の方法で外部ファイルに配置されたデータを READ 文で利用したりすることができるようになります。

4.7 新しい入出力拡張機能

ここでは、 Fortran 2003 規格草稿には含まれていませんが、f95 コンパイラで使用可能な Fortran 95 入出力処理の拡張機能について説明します。FORTRAN 77 コンパイラ、f77 の入出力拡張機能の一部は、Fortran 95 コンパイラに組み込まれました。

4.7.1 入出力エラー処理ルーチン

2 つの新機能によって、ユーザーは独自に論理ユニットの書式付き入力のエラー処理ルーチンを指定できます。書式エラーが検出されると、実行時入出力ライブラリが、エラーの原因となった入力中の文字を表すデータを付けて、指定されたユーザー定義のハンドラを呼び出します。ハンドラルーチンは、代わりの文字を提供してエラーが検出された時点から入出力処理を続けるか、デフォルトの Fortran エラー処理を実行することができます。

この新しいルーチン、SET_IO_ERR_HANDLER(3f)GET_IO_ERR_HANDLER(3f) はモジュールサブルーチンであり、これらを呼び出すルーチンの中には USE SUN_IO_HANDLERS が必要です。これらのルーチンの詳細については、マニュアルページを参照してください。

4.7.2 可変フォーマット式

FORTRAN 77 では、ある書式の整定数を、山カッコで囲まれた任意の式に置き換えることができました。

1 FORMAT(< expr > … )

nH… 編集記述子の n として、あるいは ASSIGN 文の参照する FORMAT 文、または並列化領域内の FORMAT 文では、可変フォーマット式は使えません。

この機能は f95 で可能になり、-f77 互換性オプションフラグは不要です。

4.7.3 NAMELIST 入力形式

4.7.4 書式なしバイナリ入出力

ファイルを開くときに FORM='BINARY' と指定すると、レコード長がファイルに組み込まれないことを除いて、FORM='UNFORMATTED' とほとんど同じ結果になります。このデータがなければ、1 レコードの開始点と終了点を示す方法がありません。このように、後退する場所を知らせることができないので、FORM='BINARY' ファイルに対して BACKSPACE を実行できません。'BINARY' ファイルに対して READ を実行すると、入力リストの変数を設定するために必要な量のデータが読み込まれます。

4.7.5 その他の入出力拡張機能

4.8 指令

コンパイラ指令は、特別な動作をするようにコンパイラに指示します。「プラグマ」とも呼ばれます

コンパイラ指令は 1 行または複数行のテキストとしてソースプログラムに挿入されます。コンパイラ指令は一見注釈に似ていますが、 注釈にはない特別な文字が付加されています。Fortran 95 以外のほとんどのコンパイラでは指令を注釈として扱うので、コードの一定の移植性は保たれます。

Sun 形式の並列指令では、f95 -explicitpar のデフォルトです。Cray 形式の指令に切り換えるには、コンパイラコマンド行フラグの -mp=cray を使用してください。OpenMP 指令を使用した明示的な並列化では、-openmp を指定してコンパイルしてください。

Fortran の指令については、表 C–1 にまとめられています。

4.8.1 f95 の特殊な指令行の書式

f95 は、「1.9 コマンド行ヘルプ」で説明した指令に加え、独自の特別な指令を認識します。これらの指令は、次のような構文になります。


!DIR$ d1, d2, …

4.8.1.1 ソースが固定形式の場合

4.8.1.2 ソースが自由形式の場合

これらのことから、!DIR$ を 1 桁目から 5 桁目に記述しておけば、自由形式または固定形式のどちらのソースでも機能することがわかります。

4.8.2 FIXED 指令と FREE 指令

指令行のあとに続くソース行の書式を指定します。

4.8.2.1 スコープ

指令が適用される範囲は、ファイル内に指令が出現してから最後までの部分、または次に FREE あるいは FIXED が出現するまでの部分です。

4.8.2.2 使用法

4.8.2.3 制限事項

FREE 指令と FIXED 指令には次の制限事項があります。

例: FREE 指令を指定します。


!DIR$ FREE
    DO i = 1, n
        a(i) = b(i) * c(i)
    END DO

4.8.3 並列化の指令

並列化の指令は、コンパイラに次の DO ループの並列化処理を指示する特別な注釈です。これらに関する概要は、付録 D と『Fortran プログラミングガイド』に記載されています。f95 は、OpenMP Fortran API 指令だけでなく、Sun および Cray 形式の並列化指令も認識します。OpenMP 指令の並列化については、『OpenMP API ユーザーズガイド』を参照してください。

4.9 モジュールファイル

Fortran 95 の MODULE を含むファイルをコンパイルすると、ソースで検出された MODULE ごとにモジュールインタフェースファイル (.mod ファイル) が生成されます。ファイル名は MODULE 名を基に付けられます。 たとえば、MODULE xyz からは xyz.mod (すべて小文字) というファイル名が作成されます。

コンパイルを実行すると、MODULE 文を含むソースファイルごとにモジュール実装オブジェクトファイル (.o) が生成されます。モジュール実装オブジェクトファイルとその他すべてのオブジェクトファイルをリンクすると、実行可能ファイルを作成できます。

コンパイラは、-moddir=dir フラグまたは MODDIR 環境変数で指定されたディレクトリにモジュールインタフェースファイルと実装オブジェクトファイルを作成します。指定されていない場合は、現在の作業ディレクトリにある .mod ファイル に書き込みます。

コンパイラは、USE modulename 文のコンパイル時、現在の作業ディレクトリでインタフェースファイルを探します。-Mpath オプションを使用すると、コンパイラに追加の検索パスを提供できます。モジュール実装オブジェクトファイルは、リンク処理のコマンド行に明示的に列挙する必要があります。

通常、プログラマは、ファイルごとに単一の MODULE を定義し、MODULE 文とそれを含むソースファイルに同じ名前を割り当てます。ただし、これは必須ではありません。

前述の例では、すべてのファイルが一度にコンパイルされます。モジュールソースファイルは、主プログラムでの使用前に最初にコンパイルされます。


demo% cat mod_one.f90
 MODULE one
    ...
 END MODULE
demo% cat mod_two.f90
 MODULE two
    ...
 END MODULE
demo% cat main.f90
 USE one
 USE two
   ...
 END
demo% f95 -o main mod_one.f90 mod_two.f90 main.f90

コンパイルによって次のファイルが作成されます。

mainmain.oone.modmod_one.otwo.modmod_two.o

次の例では、各単位を個別にコンパイルし、それらをリンクします。


demo% f95 -c mod_one.f90 mod_two.f90
demo% f95 -c main.f90
demo% f95 -o main main.o mod_one.o mod_two.o

main.f90 のコンパイル時、コンパイラは、現在のディレクトリから one.mod および two.mod を検索します。これらのファイルは、USE 文のモジュールを参照するファイルをコンパイルする前にコンパイルしておく必要があります。そのあとの手順で、モジュール実装オブジェクトファイル mod_one.o および mod_two.o をその他すべてのオブジェクトファイルとリンクして、実行可能ファイルを作成します。

4.9.1 モジュールの検索

version 7.0 の Fortran 95 コンパイラでは、.mod ファイルはアーカイブ (.a) ファイルに格納できます。アーカイブファイルは、モジュールを検索するコマンド行で、-Mpath フラグによって明示的に指定する必要があります。デフォルトでは、コンパイラはアーカイブファイルを検索しません。

USE 文にある .mod ファイルのみが検索されます。たとえば、Fortran 95 の USE mymod によって、コンパイラは、デフォルトでモジュールファイル mymod.mod を検索します。

検索時には、モジュールファイルが記述されるディレクトリが優先されます。これは、-moddir=dir オプションフラグおよび MODDIR 環境変数によってコントロールできます。つまり、-Mpath オプションのみが指定されている場合は、モジュールに対して、 -M フラグに示されたディレクトリおよびファイルよりも先に、現在のディレクトリが検索されます。

4.9.2 -use=list オプションフラグ

-use=list フラグによって、1 つ以上の暗黙的な USE 文がこのフラグを指定してコンパイルされる副プログラムまたはモジュールの副プログラムに挿入されます。このフラグを使用すると、モジュールまたはモジュールファイルが、ライブラリまたはアプリケーションの機能のために要求された場合に、ソースプログラムを修正する必要がなくなります。

-use=module_name を使用してコンパイルすると、USE module_name をコンパイルされる各副プログラムまたはモジュールに追加する効果があります。-use=module_file_name を使用してコンパイルすると、module_file_name ファイルに含まれる各モジュールに USE module_name を追加する効果があります。

4.9.3 fdumpmod コマンド

fdumpmod(1) コマンドを使用すると、モジュール情報ファイルの内容を表示できます。


demo% fdumpmod x.mod group.mod
x 1.0 v8,i4,r4,d8,n16,a4 x.mod
group 1.0 v8,i4,r4,d8,n16,a4 group.mod

fdumpmod コマンドによって、単一の .mod ファイル、連結される .mod ファイルによって形成されるファイル、.mod ファイルの .a アーカイブにあるモジュールについての情報が表示されます。表示には、モジュール名、バージョン番号、対象のアーキテクチャー、およびそのモジュールと互換性のあるコンパイルオプションを示すフラグが含まれます。詳細は、fdumpmod(1) マニュアルページを参照してください。

4.10 組み込み関数

f95標準の処理を拡張した組み込み関数をサポートしています。

表 4–4 非標準の組み込み関数

名称 

定義 

関数の型 

引数の型 

引数 

備考 

COT

余接関数 

実数 

実数 

([X=]x)

P、E 

DDIM

正差 

倍精度 

倍精度 

([X=]x,[Y=]y)

P、E 

LEADZ

先行の 0 ビットの数を調べる 

整数 

ブール型、整数、実数、ポインタ 

([I=]i)

NP、I 

POPCNT

設定されたビットの数を調べる 

整数 

ブール型、整数、実数、ポインタ 

([I=]i)

NP、I 

POPPAR

ビットの設定数のパリティを演算する 

整数 

ブール型、整数、実数、ポインタ 

([X=]x)

NP、I 

備考: P: 名前を引数として渡すことができる。NP: 名前を引数として渡すことはできない。E: 組み込み関数の外部コードは実行時に呼び出される。I: f95 が組み込み関数のインラインコードを生成する。

Fortran 95 が認識可能な FORTRAN 77 の組み込み関数など、組み込み関数についての詳細は、『Fortran ライブラリ・リファレンス』を参照してください。

4.11 将来のバージョンとの互換性

ソースコードは、f95 の本リリースと将来のリリースで互換となる予定です。

f95 の本リリースでモジュール情報ファイルを作成する場合、そのファイルが将来のリリースと互換性があるかどうかは保証されません。

4.12 言語の混在

C で書かれたルーチンを Fortran のプログラムと組み合わせることができます。これは、C と Fortran では呼び出し規則が共通なためです。C と Fortran のルーチンの相互運用についての詳細は、『Fortran プログラミングガイド』の「C と Fortran のインタフェース」の章を参照してください。