この付録では、標準のFortran と Solaris Studio Fortran コンパイラ f95 の機能の主な相違点について説明します。
f95 コンパイラは、Fortran 標準規則に対して、次のソース言語の機能および拡張機能を提供します。
f95 では、999 行まで行を継続することができます (開始行が 1 行とそのあとの継続行が 999)。標準の Fortran 95 では、固定形式の場合で 19 行まで、自由形式の場合で 39 行までです。
固定形式のソースの場合、1 行に 73 文字以上使用できます。ただし、73 桁目以降はすべて無視されます。標準の Fortran 95 では、行の長さは 72 文字までです。
f95 の固定形式のソーステキストは、次のように定義されています。
1 から 6 の任意の列にあるタブによって、その行がタブ形式のソース行になります。
タブより前に、コメントインジケータまたは文番号がある場合があります。
タブが最初の文字で空白以外の場合は、次のようになります。
タブのあとの文字がゼロでない数字以外の場合、タブに続くテキストが最初の行です。
最初のタブのあとがゼロでない数字の場合、その行は継続行です。ゼロでない数字に続くテキストは、その文の次の部分です。
f95 のデフォルト最大行の長さは、固定形式で 72 列および自由形式で 132 列です。-e コンパイラオプションを使用すると、固定形式のソースの行を 132 列に拡張できます。
例: 左のタブの形式のソースは、右に表示されます。
|
|
前述の例で、「^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. |
—f77 オプションを使用したタブ書式も可能です。
f95 が想定するソースの書式は、オプション、指令、および接尾辞によって異なります。
接尾辞が .f または .F のファイルは、固定形式とみなされます。接尾辞が .f90、.f95、.F90、または .F95 のファイルは、自由形式とみなされます。
表 4–1 F95 ソース書式のコマンド行のオプション
オプション |
処理 |
---|---|
-fixed |
すべてのソースファイルが Fortran の固定形式で記述されていると解釈します。 |
-free |
すべてのソースファイルが Fortran の自由形式で記述されていると解釈します。 |
-free および -fixed オプションは、ファイル名の接尾辞よりも優先されます。また、!DIR$ FREE 指令または !DIR$ FIXED 指令は、オプションおよびファイル名の接尾辞よりも優先されます。
次のように、異なるソースの書式を混在させてもかまいません。
1 つの f95 のコマンド内で、固定形式のソースファイルと自由形式のソースファイルを混在させることができます。
1 つのファイル内で、!DIR$ FREE 指令または !DIR$ FIXED 指令を使用すると、自由形式と固定形式を混在させることができます。
同じプログラム単位内では、タブ形式と自由形式または固定形式を混在させることができます。
Solaris Studio Fortran 95 では、デフォルトで大文字と小文字が区別されません。すなわち、AbcDeF という変数は、abcdef と同じ文字列として扱われます。-U オプションを付けてコンパイルすると、コンパイラは大文字と小文字を区別します。
Fortran のプログラム単位には、最大 65,535 個の構造型、および最大 16,777,215 個の定数を定義できます。
変数およびほかのオブジェクトの名前は最大 127 文字です。31 文字が標準です。
ここでは、Fortran データ型の機能と拡張子について説明します。
f95 では、ブール型の定数と式をサポートしています。ただし、ブール型の変数、配列、文はサポートしていません。
マスク処理の場合、ビット単位の論理式ではブール型の結果が生成されます。個々のビットは、対応する演算対象のビットで行われた 1 つまたは複数の論理演算の結果を表します。
2 進の算術演算子および関係演算子では、次のように処理されます。
一方の演算対象がブール型の場合は、そのまま演算が実行されます。
両方の演算対象がブール型の場合は、両者を整数であるとみなして演算が実行されます。
ユーザー定義の関数によってブール型の結果を生成することはできません。ただし、一部の (標準でない) 組み込み関数では可能です。
ブール型と論理型には、次のような相違点があります。
変数、配列、関数は論理型にできますが、ブール型にすることはできません。
LOGICAL 文はありますが、 BOOLEAN 文はありません。
論理型の変数、定数、または式は、2 つの値 .TRUE. または .FALSE. だけしか表しません。ブール型の変数、定数、または式は、任意のバイナリ値を表すことができます。
論理要素は、算式、関係式、またはビット単位の論理式において無効です。ブール要素はいずれにおいても有効です。
f95 では、ブール型定数 (8 進、16 進、ホレリス) を、次のような書式 (2 進ではありません) で使用することができます。ただし変数はブール型として宣言できません。標準の Fortran では、このような書式は許されていません。
B または b のどちらの文字を使用してもかまいません。
1 桁から 11 桁までの 8 進数 (0 から 7) を使用できます。
11 桁の 8 進数は 32 ビットの完全なワードを表します。左端の数字は常に 0、1、2、3 のいずれかです。
8 進の個々の数字は 3 ビットの値を表します。
右端の桁は、右 3 ビット (29、30、31 ビット) の内容を表します。
11 桁未満の場合は、値は右揃えになります。ワードの右端にある n ビットから 31 ビットまでが使用され、それ以外のビットは 0 になります。
空白は無視されます。
入出力の書式指定では、B という文字は 2 進数であることを示しますが、それ以外の場合は 8 進数であることを表します。
X'ddd' または X"ddd"、d が任意の 16 進数である の書式です。
1 桁から 8 桁までの 16 進数 (0 から 9、A から F) を使用できます。
文字は大文字でも小文字でもかまいません (X、x、A から F、a から f)。
数字は引用符 (アポストロフィ) または二重引用符で囲む必要があります。
空白は無視されます。
16 進数の始めに + か - の記号を付けてもかまいません。
8 桁の 16 進数は 32 ビットの完全なワードを表しています。この 32 ビットワードの各ビットの内容は、同じ値を表す 2 進数に対応しています。
8 桁未満の場合は、値は右揃えになります。ワードの右端にある n ビットから 31 ビットまでが使用され、それ以外のビットは 0 になります。
ホレリスデータには、次の書式を使用できます。
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 進数の定数を使用すると、結果が未定義になることがあります。ただし、構文エラーにはなりません。
f95 では、DATA 文以外の場所で BOZ 定数を使用することができます。
B’bbb’ |
O’ooo’ |
Z’zzz’ |
B"bbb" |
O"ooo" |
Z"zzz" |
このような BOZ 定数が実数変数に代入されている場合には、型は変換されません。
標準の Fortran では、BOZ 定数は DATA 文でのみ使用できます。
f95 では、宣言文、関数文、IMPLICIT 文において、次のような非標準の書式で型を宣言することができます。1 列目の形式は一般に使用されていますが、非標準の Fortran です。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 バイト) |
記憶領域および整列は常にバイト単位で表されます。シングルバイトに収まる値は、バイト整列です。
データ型のサイズおよび整列は、コンパイラのオプションとプラットフォーム、および変数の宣言方法に依存します。COMMON ブロック内のデフォルトの最大の整列は、4 バイトの境界整列です。
デフォルトのデータ整列および記憶領域の割り当ては、-aligncommon、 -f、-dalign、-dbl_align_all、-xmemalign、および -xtypemap などの特別なオプションを指定してコンパイルすることにより、変更できます。このマニュアルは、これらのオプションが有効でないものとして記述されています。
いくつかのプラットフォームにおける特殊ケースのデータ型および整列については、『Fortran プログラミングガイド』に追加の説明があります。
デフォルトのサイズおよび整列を次の表にまとめます (データ型のその他の点およびオプションは考慮していません)。
表 4–3 デフォルトのデータサイズおよび整列 (バイト)
Fortran のデータ型 |
サイズ |
デフォルトの整列 |
COMMON 内の整列 |
---|---|---|---|
BYTE X CHARACTER X CHARACTER*n X |
1 1 n |
1 1 1 |
1 1 1 |
COMPLEX X COMPLEX*8 X DOUBLE COMPLEX X COMPLEX*16 X COMPLEX*32 X |
8 8 16 16 32 |
4 4 8 8 8/16 |
4 4 4 4 4 |
DOUBLE PRECISION X REAL X REAL*4 X REAL*8 X REAL*16 X |
8 4 4 8 16 |
8 4 4 8 8/16 |
4 4 4 4 4 |
INTEGER X INTEGER*2 X INTEGER*4 X INTEGER*8 X |
4 2 4 8 |
4 2 4 8 |
4 2 4 4 |
LOGICAL X LOGICAL*1 X LOGICAL*2 X LOGICAL*4 X LOGICAL*8 X |
4 1 2 4 8 |
4 1 2 4 8 |
4 1 2 4 4 |
次の点に注意してください。
REAL*16 および COMPLEX*32: 64 ビット環境 (-m64 を指定してコンパイル) では、デフォルトの整列は、表で 8/16 と示されるように、8 バイトではなく 16 バイト境界整列になります。このデータ型は、4 倍精度とも呼ばれます。
配列および構造体は、その要素または欄に従って整列します。配列は、配列要素と同じように整列します。構造体は、もっとも広い整列で整列する欄と同じように整列します。
オプション -f または -dalign は、8、16、または 32 バイトのデータすべてを、強制的に 8 バイト境界で整列させます。オプション -dbl_align_all の場合は、すべてのデータが 8 バイト境界で整列します。これらのオプションを使用するプログラムには、移植性がない場合があります。
Cray ポインタとは、別のエンティティーのアドレスを値に持つ変数のことです。この別の言語要素のことを、「指示先」と呼びます。
f95 は、Cray ポインタをサポートしていますが、標準の Fortran 95 はサポートしていません。
Cray ポインタの POINTER 文は次の形式で記述します。
POINTER ( pointer_name, pointee_name [array_spec] ), … |
pointer_name、pointee_name、array_spec のそれぞれの意味は、次のとおりです。
対応する pointee_name へのポインタです。
pointer_name には pointee_name のアドレスが含まれます。pointer_name にはスカラー変数名を指定してください (派生型は指定できません)。禁止事項: 定数、構造体の名前、配列、または関数。
対応する pointer_name の指示先です。
制限事項 : 変数名、配列の宣言子、配列名を指定してください。
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 を宣言しています。同時に、x は n × m+1 次元の配列であることを宣言しています。
ポインタを使用すると、記憶領域の特定の場所に変数を動的に対応付け、ユーザーが管理する記憶領域にアクセスすることができます。
Cray ポインタでは、メモリーの絶対アドレスにアクセスすることができます。
POINTER ( pointer_name, pointee_name [array_spec] )
Fortran 95 のポインタは次のように宣言します。
POINTER object_name
この 2 種類のポインタを混在させることはできません。
指示先が引用されるたびに、f95 はポインタの現在の値を指示先のアドレスとして使用します。
Cray ポインタ型の文では、ポインタと指示先の両方を宣言します。
Cray ポインタは Cray 型のポインタです。
Cray ポインタの値は、32 ビットプロセッサ上で領域の 1 単位を占め、64 ビットプロセッサ上で領域の 2 単位を占めます。
Cray ポインタは COMMON の並びまたは仮引数で使用することができます。
Cray ポインタの値が定義されるまでは、指示先にアドレスはありません。
指示先として配列が指定されている場合、その配列を「指示先配列」と呼びます。
この場合の配列の宣言子は次の場所に指定することができます。
独立した型宣言文
独立した DIMENSION 文
ポインタ文自体
配列の宣言子が副プログラムにある場合、次元の設定は次の場所で確認できます。
共通ブロックにある変数
仮引数である変数
各次元のサイズは、指示先が引用される時ではなく、副プログラムの処理が始まる時に認識されます。
pointee_name は、CHARACTER*(*) で型宣言された変数であってはいけません。
pointee_name が配列の宣言子である場合は、明示的な実体があるもの (定数または非定数のサイズを持つもの)、または仮のサイズを持つものでなければいけません。
Cray ポインタを配列にすることはできません。
Cray ポインタを次のように扱うことはできません。
別の Cray ポインタまたは Fortran ポインタの指示先にする
構造体の成分にする
ほかのデータ型で宣言する
Cray ポインタを次の場所で使用することはできません。
PARAMETER 文または PARAMETER 属性を含む型宣言文
DATA 文
Cray ポインタの指示先を、SAVE、DATA、EQUIVALENCE、COMMON、PARAMETER 文で使用することはできません。
Cray ポインタの指示先を仮引数にすることはできません。
Cray ポインタの指示先を関数値にすることはできません。
Cray ポインタの指示先を構造体または構造体の成分にすることはできません。
Cray ポインタの指示先を構造型にすることはできません。
Cray ポインタには次のようにして値を割り当てることができます。
絶対アドレスに設定します。
例: q = 0
整変数の加減式によって割り当てます。
例: p = q + 100
Cray ポインタは整数ではありません。Cray ポインタを実数変数に割り当てることはできません。
LOC 関数 (非標準) を使用して Cray ポインタを定義することができます。
例: p = LOC( x )
例: 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 ... |
前述の例を説明します。
word64 は絶対アドレス 64 の内容を参照します。
blk はメモリーの最初の 128 ワードを占める配列です。
a は無名共通ブロックにある配列で、長さは 1,000 です。
b は a のあとに位置し、長さは n です。
c は b のあとに位置します。
a、b、c は pool 領域に関連付けられています。
word64 は blk(17) と同じです。Cray ポインタはバイトアドレスであり、blk の整数要素はそれぞれ 4 バイトの長さがあるためです。
従来の FORTRAN 77 からプログラムを移行しやすくするため、f95 は、Fortran 95 の「構造型」のプレカーソルである、VAX Fortran の STRUCTURE 文と UNION 文を受け入れます。構文についての詳細は、『FORTRAN 77 言語リファレンスマニュアル』を参照してください。
STRUCTURE の欄宣言は、次のいずれかになります。
副構造体 - 別の STRUCTURE 宣言、または事前に定義された記録。
UNION 宣言。
TYPE 宣言。初期値を含むこともできます。
SEQUENCE 属性を保持する構造型 (これは特に f95 の場合のみ)。
従来の f77 コンパイラと同様に、POINTER 文を欄宣言として使用することはできません。
また、f95 には次のような拡張機能があります。
構造体の欄宣言の記号として、「.」または「%」を使用できます (struct.field または struct%field)。
構造体を書式化された入出力文に配置できます。
構造体を PARAMETER 文で初期化できます。書式は、構造型の初期化と同じです。
構造体を構造型の成分として配置できますが、構造型は SEQUENCE 属性として宣言する必要があります。
Fortran コンパイラは言語への拡張子として、新しいデータ型である 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 |
+ - * / といった 2 項演算子は、符号あり、符号なしの演算対象をともに指定することはできません。つまり、U が UNSIGNED として宣言され、N が符号ありの INTEGER である場合、U*N は不正です。
2 項演算に符号あり、符号なしの演算対象を混在させる場合は、U*UNSIGNED(N) のように、UNSIGNED 組み込み関数を使用します。
ただし、一方の演算対象が符号なし整数で、もう一方が符号あり整定数式で値が正かゼロである場合は例外で、結果は符号なし整数となります。
このような混在した式の結果の種別は、演算対象の最大種別となります。
符号ありの値のべき乗は符合ありに、符号なしの値のべき乗は符号なしになります。
符号なしの値の単項マイナスは符号なしになります。
符号なし演算対象は、実数と複素数を自由に混在させることができます。符号なし演算対象は、区間演算対象と混在させることはできません。
関係組み込み演算を使用して、符号あり整数と符号なし整数の演算対象を比較できます。結果は演算対象の変更されない値に基づいて決まります。
CASE 構文では符号なし整数が場合式として使用可能です。
符号なし整数は、DO ループ制御変数としても、また、算術 IF 文の制御式中でも使用できません。
符号なし整数は I、B、O、Z の各編集記述子を使用して読み取り、書き込みが可能です。
また、並び入出力、変数群入出力を使っても読み取り、書き込みが可能です。並び入出力または変数群入出力による符号なし整数の書き込み形式は、正の符号あり整数の場合と同じです。
符号なし整数は、書式なし入出力によっても読み取り、書き込みできます。
符号なし整数は組み込み関数内で使用できますが、例外として SIGN および ABS 関数では使用できません。
新しい組み込み関数、UNSIGNED は、INT と似ていますが、符号なし型を結果として生成します。形式は次のとおりです。
UNSIGNED(v [,kind] ).
もう 1 つの新しい組み込み関数、SELECTED_UNSIGNED_KIND(var) は、var の種別パラメータを返します。
組み込み関数は、符号あり整数演算対象も符号なし整数演算対象も使用できません。ただし、MAX 関数と MIN 関数では、REAL 型の演算対象が少なくとも 1 つ存在していれば、符号あり整数演算対象と符号なし整数演算対象を使用できます。
符号なし配列は、配列組み込み関数の引数として使えません。
今回の Solaris Studio Fortran コンパイラのリリースには、Fortran 2003 規格の多数の新機能が含まれています。詳細は、Fortran 2003 規格を参照してください。また、Fortran 2008 ドラフト規格で提案されている機能もいくつか含まれています。これらの機能の詳細は、該当するドラフト出版物を参照してください。
Fortran の新しい規格には次のものが含まれています。
C 言語手続きを参照する方法、および反対に C 関数から Fortran 副プログラムを参照できるよう指定する方法
外部 C 変数とリンクする大域変数を宣言する方法
ISO_C_BINDING モジュールは、C の型と互換のデータを表す種別パラメータである名前付き定数へのアクセスを可能にします。
この規格は、BIND(C) 属性も取り入れています。Fortran の構造型は、BIND 属性を持つものならば、C と相互に利用できます。
Fortran コンパイラの今回のリリースでは、規格の第 15 章に記述されている機能を実現します。また、規格第 4 章に述べられている、C の型に対応する構造型およびリストを定義する機能を備えます。
新しい組み込みモジュール、IEEE_ARITHMETIC および IEEE_FEATURES は、Fortran 言語における例外と IEEE 演算をサポートします。次のように指定すると、これらの機能がすべてサポートされます。
USE, INTRINSIC :: IEEE_ARITHMETIC
USE, INTRINSIC :: IEEE_FEATURES
INTRINSIC キーワードが Fortran 2003 で新しく追加されました。これらのモジュールは、一連の構造型、定数、丸めモード、照会関数、要素別処理関数、種別関数、要素別処理サブルーチン、非要素別処理サブルーチンを定義します。詳細は、Fortran 2003 規格の第 14 章を参照してください。
Fortran 2003 規格では、コマンド行引数および環境変数を処理するための新しい組み込み関数が紹介されています。それら組み込み関数は次の 3 つです。
GET_COMMAND(command, length, status)
command で、プログラムを呼び出したコマンド行全体を返します。
GET_COMMAND_ARGUMENT(number, value, length, status)
value でコマンド行引数を返します。
GET_ENVIRONMENT_VARIABLE(name, value, length, status, trim_name)
環境変数の値を返します。
Fortran コンパイラでは、Fortran 2003 の PROTECTED 属性が受け入れられています。PROTECTED はモジュール要素の使用に制限を設けます。PROTECTED 属性を持つオブジェクトは、それ自身が宣言されるモジュール内でのみ定義可能です。
コンパイラは入出力文中の ASYNCHRONOUS 指定子を認識します。
ASYNCHRONOUS=[’YES’ | ’NO’]
この構文は Fortran 2003 規格の第 9 章で提案されているものです。WAIT 文とともに使うことで、コンピューティングで重複する可能性のある入出力処理を指定することができます。このコンパイラは ASYNCHRONOUS='YES' を認識しますが、規格は、実際の非同期入出力を要求しません。今回のコンパイラのリリースでは、入出力は常に同期化します。
Fortran 2003 で、ALLOCATABLE 属性に使用できるデータエンティティーが拡張されました。以前、この属性はローカルに格納された配列変数に制限されていました。現在では、次の要素を使用できます。
構造体の配列成分
ダミー配列
配列関数の結果
割り付け要素は、記憶領域に関連付けられているすべての場所で使用が禁止されています。COMMON ブロックと EQUIVALENCE 文。割り付け配列成分は SEQUENCE 型になることがありますが、そのような型のオブジェクトは COMMON および EQUIVALENCE で使用できません。
f95 コンパイラは、Fortran 2003 VALUE 型の宣言属性を受け入れます。
この属性とともに副プログラムのダミー入力引数を指定すると、実際の引数は「値」によって渡されます。次の例では、リテラル値を引数とする Fortran 副プログラムを呼び出す C 言語の主プログラムにおいて VALUE 属性を使用しています。
C code: #include <stdlib.h> int main(int ac, char *av[]) { to_fortran(2); } Fortran code: subroutine to_fortran(i) integer, value :: i print *, i end |
Fortran 2003 規格では、新しい「ストリーム」入出力方式が定義されています。ストリーム入出力アクセスは、データファイルを連続したバイトのシーケンスとして扱い、1 から始まる正の整数でアドレスを定義できます。データファイルは、書式付きアクセスまたは書式なしアクセス用に結合できます。
OPEN 文で ACCESS=’STREAM’ 指定子を使用して、ストリーム入出力ファイルを宣言します。バイトアドレスにファイルを位置付けるには、READ または WRITE 文に POS=scalar_integer_expression 指定子が必要です。INQUIRE 文は、ACCESS='STREAM'、指定子 STREAM=scalar_character_variable、および POS=scalar_integer_variable を受け入れます。
3 つの新しい Fortran 2003 書式付き入出力指定子が、f95 に実装されています。これらの指定子は、OPEN、READ、WRITE、PRINT、および INQUIRE 文で指定されます。
DECIMAL=[’POINT’|’COMMA’]
デフォルトの小数部分編集モードを変更します。デフォルトでは、ピリオドによって、D、E、EN、ES、F、および G 編集によって書式付けされた数値全体と、浮動小数点の小数部分が分離されます。’COMMA’ は、123,456 のように、印刷の際に、ピリオドの代わりにコンマを使用するようにデフォルトを変更します。デフォルトの設定は、123.456 のように、印刷の際にピリオドを使用する ’POINT’ です。
ROUND=[’PROCESSOR_DEFINED’ | ’COMPATIBLE’]
書式付き入出力 D、E、EN、ES、F、および G 編集のデフォルトの丸めモードを設定します。’COMPATIBLE’ と指定する場合は、データ変換によって得られる値は、2 つのもっとも近い表示値のうち、より近い方の表示値になります。値が表示値のちょうど中間である場合は、0 から離れている方の表示値になります。’PROCESSOR_DEFINED’ を指定する場合は、丸めモードはプロセッサのデフォルトのモードに依存します。ROUND が指定されていない場合は、丸めモードはコンパイラのデフォルトになります。
たとえば、WRITE(*,’(f11.4)’) 0.11115 は、デフォルトのモードでは 0.1111、’COMPATIBLE’ モードでは 0.1112 になります。
IOMSG=character-variable
指定された文字変数に文字列としてエラーメッセージを返します。これは、標準の出力で表示されるエラーメッセージと同じです。最長メッセージが保持可能な大きさの文字バッファーを割り当ててください。CHARACTER*256 で十分です。
INQUIRE 文で使用する場合は、これらの指定子は、現在の値を返すための文字変数を宣言します。
新しい編集記述子 DP、DC、RP、および RC は、単一の FORMAT 文内のデフォルトの設定を、それぞれ、小数点、小数部のコンマ、プロセッサ定義の丸め、および互換性のある丸めに変更します。次に例を示します。
WRITE(*,’(I5,DC,F10.3)’) N, W
F10.3 出力項目のピリオドの代わりにコンマが使用されます。
書式付き入出力の浮動小数点丸めモードの変更については、-iorounding コンパイラコマンド行オプションも参照してください (「3.4.45 –iorounding[={ compatible|processor-defined}]」)。
IMPORT 文は、親子結合によってアクセス可能な親有効域の要素を指定します。この文は、インタフェース本体でのみ使用できます。
f95 コンパイラは、Fortran 2003 の FLUSH 文を受け入れます。FLUSH 文を使用すると、外部ファイルに書き込まれたデータをほかのプロセスで利用したり、Fortran 以外の方法で外部ファイルに配置されたデータを READ 文で利用したりすることができるようになります。
Fortran コンパイラは、POINTER 仮引数の INTENT 属性をサポートするようになりました。ポインタ仮引数として INTENT(IN)、INTENT(OUT)、または INTENT(INOUT) を指定できます。
たとえば、次を見てください。
subroutine sub(P) integer, pointer, intent(in) :: p ... end |
ポインタの INTENT 属性はポインタに適用され、指示先には適用されません。したがって、INTENT(IN) ポインタの場合、次のものはポインタを変更するため無効です。
p => t allocate(p) deallocate(p) |
ただし、INTENT(IN) ポインタの場合、次のものは指示先を変更するため有効です。
p = 400 |
配列構成子内の (/ と /) に角括弧を使用できるようになりました。
X = [ 3.2, 4.01, 6.5 ] |
Fortran 2003 規格では、配列構成子としての角括弧の使用が許可されます。これによって、区間定数との間で衝突が起こる可能性があります。-xia オプション (または区間演算を有効にするための同様のオプション) を指定せずに角括弧を使用すると、配列構成子として処理されます。-xia オプションを使用すると、角括弧は定数として処理されます。区間ユーザーは、コンパイルエラーを回避するために、(/ および /) 配列構成子を継続して使用する必要があります。
次に示す Fortran 2003 機能についての詳細は、公開されている Fortran 2003 規格を参照してください。Fortran 2008 機能については、公開されている Fortran 200x ドラフトドキュメントを参照してください。
割り付け配列の 2003 拡張 — 配列の再割り付け、および割り付けスカラー
ALLOCATE/DEALLOCATE 文の 2003 拡張 — ERRMSG および SOURCE
2003 拡張の MOVE_ALLOC 組み込み関数
2003 拡張のポインタ代入と再マッピング
2003 拡張の MIN/MAX、MIN/MAXVAL、および MIN/MAXLOC と文字引数
2003 組み込み関数 IS_IOSTAT_END、IS_IOSTAT_EOR、NEW_LINE
2003 組み込み関数 SELECTED_CHAR_KIND
組み込み関数 SYSTEM_CLOCK の引数 COUNT_RATE の 2003 REAL 型
複素 SQRT 組み込み関数の結果に関する 2003 の新規制限
2008: 欠如しているオプション引数としての null ポインタの使用
x86 プラットフォームでの IEEE 組み込みモジュールのサポート
2008 ビット組み込み関数: BGE、BGT、BLE、BLT、DSHIFTL、DSHIFTR、LEADZ、POPCNT、POPPAR、TRAILZ、MASKL、MASKR、SHIFTA、SHIFTL、SHIFTR、MERGE_BITS、IALL、IANY、IPARITY
ここでは、Fortran 2003 規格には含まれていませんが、f95 コンパイラで受け入れら Fortran 95 入出力処理の拡張機能について説明します。FORTRAN 77 コンパイラ、f77 の入出力拡張機能の一部は、Fortran コンパイラに組み込まれています。
2 つの新機能によって、ユーザーは独自に論理ユニットの書式付き入力のエラー処理ルーチンを指定できます。書式エラーが検出されると、実行時入出力ライブラリが、エラーの原因となった入力中の文字を表すデータを付けて、指定されたユーザー定義のハンドラを呼び出します。ハンドラルーチンは、代わりの文字を提供してエラーが検出された時点から入出力処理を続けるか、デフォルトの Fortran エラー処理を実行することができます。
この新しいルーチン、SET_IO_ERR_HANDLER(3f) と GET_IO_ERR_HANDLER(3f) はモジュールサブルーチンであり、これらを呼び出すルーチンの中には USE SUN_IO_HANDLERS が必要です。これらのルーチンの詳細については、マニュアルページを参照してください。
FORTRAN 77 では、ある書式の整定数を、山カッコで囲まれた任意の式に置き換えることができました。
1 FORMAT( … < expr > … )
nH… 編集記述子の n として、あるいは ASSIGN 文の参照する FORMAT 文、または並列化領域内の FORMAT 文では、可変フォーマット式は使えません。
この機能は f95 で可能になり、-f77 互換性オプションフラグは不要です。
入力時にグループ名の先頭に $ または & が付きます。& は、Fortran 95 の規格だけが受け付ける形式であり、NAMELIST 出力によっても書き込まれます。
入力の終了を表す記号として $ を受け入れます。ただし、グループ内の最後のデータ項目が CHARACTER データである場合は別です。その場合、$ は、入力データとして扱われます。
NAMELIST 入力は、記録の最初の桁から開始することができます。
ファイルを開くときに FORM='BINARY' と指定すると、レコード長がファイルに組み込まれないことを除いて、FORM='UNFORMATTED' とほぼ同じ結果になります。このデータがなければ、1 レコードの開始点と終了点を示す方法がありません。このように、後退する場所を知らせることができないので、FORM='BINARY' ファイルに対して BACKSPACE を実行できません。'BINARY' ファイルに対して READ を実行すると、入力リストの変数を設定するために必要な量のデータが読み込まれます。
WRITE 文。データはバイナリでファイルに書き込まれ、出力リストで指定された量のバイトが転送されます。
READ 文。入力リストの変数にデータが読み込まれ、リストで必要なだけのバイトが転送されます。ファイルにはレコードマークがないので、「レコードの終端」エラーは検出されません。検出されるエラーは、「ファイルの終端」または異常システムエラーだけです。
INQUIRE 文。FORM='BINARY' で開いたファイル上の INQUIRE は、次の結果を返します。
FORM=”BINARY”ACCESS=”SEQUENTIAL”DIRECT=”NO”FORMATTED=”NO” UNFORMATTED=”YES”RECL=AND NEXTREC= は未定義です。
BACKSPACE 文。許可されていません。エラーが返されます。
ENDFILE 文。通常どおり、現在の位置でファイルを切り捨てます。
REWIND 文。通常どおり、ファイルの位置をデータの先頭に変更します。
さまざまな装置に対し再帰的な入出力が可能です (これは、f95 の入出力ライブラリが「MT-Warm」だからです)。
RECL=2147483646 (231-2) は、順番に書式化された、並びによる変数群出力上のデフォルトの記録長です。
ENCODE および DECODE は、『FORTRAN 77 言語リファレンスマニュアル』で説明するように認識され、実装されています。
次に示すように、ADVANCE=’NO’ で非前進入出力が可能になります。
write(*,’(a)’,ADVANCE=’NO’) ’n= ’ read(*,*) n
コンパイラ指令は、特別な動作をするようにコンパイラに指示します。「プラグマ」とも呼ばれます。
コンパイラ指令は 1 行または複数行のテキストとしてソースプログラムに挿入されます。コンパイラ指令は一見注釈に似ていますが、注釈にはない特別な文字が付加されています。Fortran 95 以外のほとんどのコンパイラでは指令を注釈として扱うので、コードの一定の移植性は保たれます。
すべての Fortran 指令についての概要は、付録 C Fortran 指令の要約を参照してください。
f95 は、「1.8 コマンド行ヘルプ」で説明した指令に加え、独自の特別な指令を認識します。これらの指令は、次のような構文になります。
!DIR$ d1, d2, … |
指令を 7 桁目以降に記述します。
73 桁目以降は無視されます。
最初の指令行の 6 桁目は空白です。
継続指令行の 6 桁目は空白以外の文字です。
!DIR$ のあとに空白を 1 つ付けて、行の任意の位置に記述できます。
!DIR$ 文字は、その行の空白でない最初の文字となります。
指令は空白のあとに記述します。
新たに始まる指令行では、!DIR$ の直後に空白、タブ、または改行が続きます。
指令の継続行では、!DIR$ の直後に空白、タブ、改行以外の文字が続きます。
これらのことから、!DIR$ を 1 桁目から 5 桁目に記述しておけば、自由形式または固定形式のどちらのソースでも機能することがわかります。
指令行のあとに続くソース行の書式を指定します。
指令が適用される範囲は、ファイル内に指令が出現してから最後までの部分、または次に FREE あるいは FIXED が出現するまでの部分です。
1 つのソースファイル内でソースの書式を切り換えることができます。
INCLUDE ファイルのソースの書式を切り換えることができます。INCLUDE ファイルの先頭に指令を挿入します。INCLUDE ファイルが処理されたあとに、ソースの書式が INCLUDE ファイルの処理前の書式に戻ります。
FREE 指令と FIXED 指令には次の制限事項があります。
どちらの指令もコンパイラの指令行に単独で指定します (継続行にしないでください)。
どちらの指令もソースコードの任意の位置に指定できます。その他の指令は作用するプログラム中に指定する必要があります。
例: FREE 指令を指定します。
!DIR$ FREE DO i = 1, n a(i) = b(i) * c(i) END DO |
並列化の指令は、コンパイラに次の DO ループの並列化処理を指示する特別な注釈です。これらに関する概要は、付録 D と『Fortran プログラミングガイド』に記載されています。Sun および Cray 形式の並列化指令は、非推奨になり、廃止されました。OpenMP の Fortran API 指令および並列化モデルを使用してください。OpenMP 指令の並列化については、『OpenMP API ユーザーズガイド』を参照してください。
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 をその他すべてのオブジェクトファイルとリンクして、実行可能ファイルを作成します。
Version 7.0 の Fortran コンパイラでは、.mod ファイルはアーカイブ (.a) ファイルに格納できます。アーカイブファイルは、モジュールを検索するコマンド行で、-Mpath フラグによって明示的に指定する必要があります。デフォルトでは、コンパイラはアーカイブファイルを検索しません。
USE 文にある .mod ファイルのみが検索されます。たとえば、Fortran の USE mymod によって、コンパイラは、デフォルトでモジュールファイル mymod.mod を検索します。
検索時には、モジュールファイルが記述されるディレクトリが優先されます。これは、-moddir=dir オプションフラグおよび MODDIR 環境変数によってコントロールできます。つまり、-Mpath オプションのみが指定されている場合は、モジュールに対して、-M フラグに示されたディレクトリおよびファイルよりも先に、現在のディレクトリが検索されます。
-use=list フラグによって、1 つ以上の暗黙的な USE 文がこのフラグを指定してコンパイルされる副プログラムまたはモジュールの副プログラムに挿入されます。このフラグを使用すると、モジュールまたはモジュールファイルが、ライブラリまたはアプリケーションの機能のために要求された場合に、ソースプログラムを修正する必要がなくなります。
-use=module_name を使用してコンパイルすると、USE module_name をコンパイルされる各副プログラムまたはモジュールに追加する効果があります。-use=module_file_name を使用してコンパイルすると、module_file_name ファイルに含まれる各モジュールに USE module_name を追加する効果があります。
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) マニュアルページを参照してください。
f95 は標準の処理を拡張した組み込み関数をサポートしています。
表 4–4 非標準の組み込み関数
名 |
定義 |
関数の型 |
引数の型 |
引数 |
備考 |
---|---|---|---|---|---|
COT |
余接関数 |
実数 |
実数 |
([X=]x) |
P、E |
DDIM |
正差 |
倍精度 |
倍精度 |
([X=]x,[Y=]y) |
P、E |
備考: P: 名前を引数として渡すことができる。E: 組み込み関数の外部コードは実行時に呼び出される。
Fortran が認識可能な FORTRAN 77 の組み込み関数など、組み込み関数についての詳細は、『Fortran ライブラリリファレンス』を参照してください。
ソースコードは、f95 の本リリースと将来のリリースで互換となる予定です。
f95 の本リリースでモジュール情報ファイルを作成する場合、そのファイルが将来のリリースと互換性があるかどうかは保証されません。
C で書かれたルーチンを Fortran のプログラムと組み合わせることができます。これは、C と Fortran では呼び出し規則が共通なためです。C と Fortran のルーチンの相互運用についての詳細は、『Fortran プログラミングガイド』の「C と Fortran のインタフェース」の章を参照してください。