Fortran 95 コンパイラ f95 は、ほとんどの従来の FORTRAN 77 プログラムをコンパイルできます。これには、f77 コンパイラによって以前にコンパイルされた非標準拡張機能を利用するプログラムも含まれます。
f95 は、これらの FORTRAN 77 の機能の多くを直接的に受け入れます。その他の機能は、FORTRAN 77 互換モード (f95 -f77) でコンパイルする必要があります。
この章では、f95 で使用可能な FORTRAN 77 の機能について説明し、f95 との互換性がない f77 の機能のリストを示します。f77 コンパイラで使用可能な非標準 FORTRAN 77 拡張機能についての詳細は、 http://docs.sun.com/source/806-4841/index.html の『FORTRAN 77 言語リファレンス』を参照してください。
f95 コンパイラで使用可能な Fortran 95 言語のその他の拡張機能については、第 4 章「Fortran 95 の機能と相違点」 を参照してください。
f95 は、標準規則に準拠する FORTRAN 77 プログラムをコンパイルします。移植性を確保するためには、非標準 FORTRAN 77 機能を利用しているプログラムを標準に準拠する Fortran 95 に移行する必要があります。-ansi オプションを指定してコンパイルすると、プログラム中で使用されているすべての非標準機能にフラグが立てられます。
f95 では、次の FORTRAN 77 コンパイラ f77 の非標準機能を、直接的でも、-f77 互換性モードでも使用できます。
ソースの書式
継続行は、カラム 1 に「&」を設定して始めることができます。[-f77=misc]
インクルードファイルの最初の行は、継続行の場合があります。[-f77=misc]
f77 タブ書式を使用します。[-f77=tab]
タブ書式は、ソース行を 72 桁以上に拡張できます。[-f77=tab]
f95 のタブ書式では、文字列が継続行に及ぶ場合、72 桁目で途切れることはありません。[-f77]
入出力
Fortran 95 では、ACCESS='APPEND' でファイルを開くことができます。
並び出力は f77 コンパイラと類似する形式を使用します。[-f77=output]
f95 は、直接探査ファイルの BACKSPACE を許可しますが、ENDFILE は許可しません。
f95 では、形式編集記述子で欄幅を暗黙的に指定できます。たとえば、FORMAT(I) が許可されます。
f95 は、出力形式で f77 のエスケープシーケンス (\n \t \) を認識します。[-f77=backslash]
f95 は、OPEN 文の FILEOPT= を認識します。
f95 では、STATUS='KEEP' を使用して、SCRATCH ファイルを閉じることができます [-f77]。プログラムが終了しても、検索ファイルは削除されません。SCRATCH ファイルは、-f77 を指定してコンパイルすれば、FILE=name を使用して開くこともできます。
内部ファイルの直接的な入出力を実行できます。[-f77]
f95 は、FORTRAN 77 形式編集記述子 A、$、および SU を認識します。[-f77]
FORM='PRINT' を、OPEN 文で使用できます。[-f77]
f95 は、従来の FORTRAN 入出力文 ACCEPT および TYPE を認識します。
FORTRAN 77 形式の NAMELIST 出力を記述するには、-f77=output を指定してコンパイルします。
ERR= のみを指定した READ (IOSTAT= も END= 分岐もない場合) は、EOF が検出されると、ERR= 分岐を END= として取り扱います。[-f77]
VMS Fortran NAME='filename' を、OPEN 文で使用できます。[-f77]
f95 では、READ() または WRITE() の後ろの余分なコンマを受け入れます。[-f77]
END= 分岐は、REC= による直接探査 READ で使用できます。[-f77=input]
形式編集記述子 Ew.d.e が使用でき、これは Ew.d.Ee として取り扱われます。[-f77]
入力文 FORMAT で文字列を使用できます。[-f77=input]
IOSTAT= 指定子を、ENCODE/DECODE 文で使用できます。
ENCODE/DECODE 文で、並び入出力が使用できます。
入出力文の論理ユニットとして使用される場合、アスタリスク (*) を STDIN および STDOUT の代わりに使用できます。
FMT= 指定子で配列を使用できます。[-f77=misc]
PRINT 文で変数群名を使用できます。[-f77=output]
コンパイラは、FORMAT 文の余分なコンマを受け付けます。
NAMELIST 入力実行中に疑問符 (?) を入力すると、読み込まれた変数群の名前が返されます。[-f77=input]
データ型、宣言、および用法
プログラム単位において、別の宣言文の後ろに IMPLICIT 文が記述される場合もあります。
f95 では、IMPLICIT UNDEFINED 文が使用できます。
f95 では、FORTRAN 77 拡張機能 AUTOMATIC 文を使用できます。
f95 では、STATIC 文が使用でき、これは SAVE 文のように取り扱われます。
f95 では、VAX STRUCTURE、UNION、および MAP 文が使用できます (「4.4 STRUCTURE および UNION (VAX Fortran)」 を参照)。
Fortran 95 では、LOGICAL 変数と INTEGER 変数を置き換えて使用できます。[-f77=logical]
INTEGER 変数は、DO WHILE などの条件式で使用できます。[-f77=logical]
Cray ポインタは、組み込み関数の呼び出しに使用できます。
f95 では、型宣言で、スラッシュを使用したデータ初期化を実行できます。例: REAL MHW/100.101/, ICOMX/32.223/
f95 では、Cray 文字ポインタを、非ポインタ変数および文字ポインタ以外のその他の Cray ポインタに割り当てることができます。
f95 では、型サイズの異なる項目 (たとえば、REAL*8、INTEGER*4) を同一の Cray ポインタがポイントできます。
POINTER として宣言されたものと同じプログラム単位で Cray ポインタを INTEGER として宣言できます。INTEGER 宣言は無視されます。[-f77=misc]
Cray ポインタは、割り算や掛け算の演算で使用できます。[-f77=misc]
ASSIGN 文の変数の型を INTEGER*2 にすることができます。[-f77=misc]
代替 RETURN 文の表現を非整数型にすることができます。[-f77=misc]
SAVE 属性を保持する変数は、COMMON ブロックの要素と同等化できます。
同じ配列の初期化指定子に異なる型を使用できます。例: REAL*8 ARR(5) /12.3 1, 3, 5.D0, 9/
名前リスト項目の型宣言は、NAMELIST 文に後続できます。
f95 では、BYTE データ型が使用できます。
f95 では、非整数を配列添字として使用できます。[-f77=subscript]
f95 では、関連演算子 .EQ. および .NE. を論理演算対象とともに使用できます。[-f77=logical]
f95 では、従来の f77 VIRTUAL 文が使用でき、これは DIMENSION 文のように取り扱われます。
異なるデータ構造は、f77 コンパイラと互換性のある方法で等価にされます。[-f77=misc]
f77 コンパイラと同様に、f95 では、PARAMETER 文の初期化式で、多くの組み込み関数が使用できます。
f95 では、整数値を CHARACTER*1 変数に割り当てることができます。[-f77=misc]
指数として BOZ が使用できます。[-f77=misc]
BOZ 定数は文字変数に割り当てることができます。例: character*8 ch ch ="12345678"X
BOZ 定数は、組み込み関数呼び出しの引数として使用できます。[-f77=misc]
文字変数は、DATA 文の整数値で初期化できます。変数の先頭文字は整数値に設定され、残りの文字列 (文字列が 2 文字以上の場合) は空白になります。
ホレリス文字の整数配列を形式記述子として使用できます。[-f77]
浮動小数点の例外が生成される場合、定数の折りたたみは実行されません。[-f77=misc]
-f77=misc を指定してコンパイルすると、f95 は、f77 コンパイラの方法で、自動的に REAL 定数を、引数、データ、およびパラメータ文に適切な種類 (REAL*8 または REAL*16) にします。[-f77=misc]
割り当てられた GOTO で、等価にされた変数を使用できます。[-f77]
非定数文字式を数値変数に割り当てることができます。
-f77=misc でコンパイルを実行すると、型宣言の変数名のあとに *kind を配置できます。[-f77=misc] 例: REAL Y*4, X*8(21)) INTEGER FUNCTION FOO*8(J)
部分文字列を、DATA 文の DO 形並びの対象として使用できます。[-f77=misc] 例: DATA (a(i:i), i=1,n) /n*’+’/
括弧で囲まれた整数式は、型サイズとして配置できます。例: PARAMETER (N=2) INTEGER*(N+2) K
プログラム、サブルーチン、関数、および実行文
f95 では、名前を設定するために PROGRAM 文は必要ありません。
関数は、サブルーチンと同様に、CALL 文で呼び出すことができます。[-f77]
関数は、定義された戻り値を持つ必要はありません。[-f77]
選択戻り指定子 (*label または &label) を実際のパラメータリストおよび別の位置で使用できます。[-f77=misc]
%VAL を COMPLEX 型の引数とともに使用できます。[-f77=misc]
%REF および %LOC を利用できます。[-f77=misc]
サブルーチンは、RECURSIVE キーワードを使用して自分自身を宣言しないでも、自分自身を再帰的に呼び出すことができます。[-f77=misc] ただし、間接的な再帰を実行するプログラム (ルーチン A がルーチン B を呼び出し、そのあとにルーチン B がルーチン A を呼び出す) は、正しく動作させるために -xrecursive フラグでコンパイルする必要があります。
代替リターンを保持するサブルーチンは、ダミー引数のリストに代替リターンのリストがない場合でも呼び出すことができます。
-f77=misc を指定してコンパイルすると、INTEGER または REAL 型以外の引数を使用して文関数を定義でき、実際の引数は文関数で定義された型に変換されます。[-f77=misc]
null の実引数を許可します。例: CALL FOO(I,,,J) には、先頭の I と末尾の J 引数の間に 2 つの null 引数があります。
f95 では、関数 %LOC() の呼び出しは LOC() の呼び出しとして取り扱われます。[-f77=misc]
**、* など別の演算子のあとに単項プラスや単項マイナスを配置できます。
最初の引数が COMPLEX 型であっても、CMPLX() 組み込み関数を保持する第 2 引数を使用できます。この場合、最初の引数の実数部が使用されます。[-f77=misc]
CHAR() 組み込み関数の引数が 255 文字を超過しても、警告が発せられるだけで、エラーにはなりません。[-f77=misc]
負のシフトカウントに対し、警告が発せられるだけでエラーにはなりません。
現在のディレクトリに配置された INCLUDE ファイルと -I オプションで指定された INCLUDE ファイルを検索します。[-f77=misc]
連続的な .NOT. 演算子 (.NOT..NOT..NOT.(I.EQ.J) など) を許可します。[-f77=misc]
その他
f95 コンパイラは、通常、標準出力に対する進捗メッセージを発行しません。f77 コンパイラは、進捗メッセージを発行し、コンパイルしているルーチン名を表示します。この規則は、-f77 互換フラグを指定してコンパイルすると維持されます。
f77 コンパイラでコンパイルされたプログラムは、算術例外でトラップされることはなく、自動的に ieee_retrospective を終了に呼び出し、実行中に起こった例外をレポートします。-f77 フラグを使用したコンパイルは、f77 コンパイラのこの動作を模倣します。デフォルトでは、f95 コンパイラは最初の算術例外でトラップされますが、ieee_retrospective は呼び出しません。
f77 コンパイラは、高い精度が必要な場合に、REAL*4 定数がコンテキスト中でより高い精度を保持しているように取り扱います。-f77 フラグを使用してコンパイルする場合、f95 コンパイラは、倍精度または 4 倍精度の演算対象に対し、REAL*4 定数がそれぞれ倍精度または 4 倍精度を保持することを許可します。
DO ループ変数をループ内で再定義できます。[-f77=misc]
コンパイルするプログラム単位の名前を表示します。[-f77=misc]
DIMENSION 文で使用される変数の型を DIMENSION 文のあとに宣言できます。次に例を示します。
SUBROUTINE FOO(ARR,G) DIMENSION ARR(G) INTEGER G RETURN END |
非標準の言語拡張機能の構文および意味についての詳細は、 http://docs.sun.com/source/806-4841/index.html の『FORTRAN 77 言語リファレンス』を参照してください。
現行リリースの f95 で、従来の f77 プログラムをコンパイルおよびテストしたときに生じた非互換性の問題を次に示します。これらの問題は、f95 の比較機能の欠如、または動作の相違点が原因となって発生します。次の項目は、FORTRAN 77 の非標準の拡張機能であり、f77 でサポートされていても f95 でサポートされていません。
ソースの書式
-f77 オプションを指定すると、6 文字を超える名前に対し ANSI 警告が発せられます。
入出力
f95 は、直接探査ファイルで ENDFILE を許可しません。
f95 は、直接探査入出力でレコード番号を指定する 'n 書式 (例: READ (2'13) X,Y,Z) を認識しません。
f95 は、従来の f77 "R" 書式編集記述子を認識しません。
f95 では、CLOSE 文における DISP= 指定子を許可しません。
WRITE 文でのビット定数は許可されません。
Fortran 95 NAMELIST は、可変長の配列および文字列を許可しません。
RECL=1 を使用して直接探査ファイルを開くことは、「ストリーム」ファイルとしては使用できません。代わりに FORMAT='STREAM' を使用してください。
Fortran 95 は、不当な入出力指定子をエラーとしてレポートします。f77 では警告のみです。
データ型、宣言、および用法
f95 では 7 つしか配列添字を使用できません。f77 では 20 個まで使用できます。
f95 は、PARAMETER 文での非定数を許可しません。
CHARACTER 型宣言の初期化子では整数値は使用できません。
REAL() 組み込み関数は、引数を REAL*4 に変換する代わりに、複素引数の実数部を返します。これにより、引数が DOUBLE、COMPLEX、または COMPLEX*32 の場合に、異なる結果が返されます。
Fortran 95 は、配列が宣言される前に、境界式の配列要素を許可しません。次に例を示します。
subroutine s(i1,i2) integer i1(i2(1):10) dimension i2(10) ...ERROR: "I2" は関数として使用されているため、 形状明示 DIMENSION 属性を付けて宣言してはいけません。end |
プログラム、サブルーチン、関数、文
名前の最大長は 127 文字です。
コマンド行オプション
f95 がサポートしていない f77 ライブラリルーチン
IOINIT() ライブラリルーチン
start_iostats および end_iostats ライブラリルーチン
f77_init() 関数
f95 では、IEEE_RETROSPECTIVE サブルーチンが同じ名前を持つユーザー独自のルーチンを定義することによってバイパスされることを許可していません。
f77 および f95 オブジェクトバイナリを混在させるには、-xlang=f77 オプションを指定して f95 コンパイルとリンクします。主プログラムが f77 プログラムであっても、f95 でリンクを実行します。
例: f77 オブジェクトファイルで f95 主プログラムをコンパイルします。
demo% cat m.f95 CHARACTER*74 :: c = 'テストです。' CALL echo1( c ) END demo% f95 -xlang=f77 m.f95 sub77.o demo% a.out テストです。 demo% |
f95 プログラムに対して FORTRAN 77 ライブラリおよび組み込み関数が使用できます。『Fortran ライブラリ・リファレンス』を参照してください。
例: FORTRAN 77 のライブラリからルーチンを呼び出す f95 のメインです。
demo% cat tdtime.f95 REAL e, dtime, t(2) e = dtime( t ) DO i = 1, 100000 as = as + cos(sqrt(float(i))) END DO e = dtime( t ) PRINT *, '経過:', e, ', ユーザー:', t(1), ', システム:', t(2) END demo% f95 tdtime.f95 demo% a.out 経過: 0.14 , ユーザー: 0.14 , システム: 0.0E+0 demo% |
dtime(3F) を参照してください。
Fortran 95 の標準機能として、FORTRAN 77 にはない組み込み関数がサポートされています。Fortarn 95 の非標準組み込み関数を含むすべての組み込み関数は、『Fortran ライブラリ・リファレンス』に記載されています。
『Fortran ライブラリ・リファレンス』に記載された組み込み関数名をプログラムの関数名として使用する場合は、組み込みではないユーザー指定のルーチンを使用するために、f95 の EXTERNAL 文を追加する必要があります。
『Fortran ライブラリ・リファレンス』には、以前の f77 コンパイラ が認識可能な組み込み関数も記載されています。f95 コンパイラは、これらの名前を組み込み関数と同様に認識できます。
-f77=intrinsics を指定してコンパイルすると、認識可能な組み込み関数は f77 コンパイラで知られるものだけに制限され、Fortran 95 組み込み関数は無視されます。
floatingpoint.h ヘッダーファイルは、f77_floatingpoint.h を置き換え、次のソースプログラムで使用される必要があります。
#include "floatingpoint.h"
f77/filename 書式のヘッダーファイルの参照は、f77/ ディレクトリパスを削除するように変更する必要があります。
非標準の名前付け手法を使用しているプログラム (配列のオーバーインデックス、Cray または Fortran ポインタのオーバーラップによる) の場合は、適切な -xalias フラグを指定してコンパイルするとよいでしょう。「3.4.112 -xalias[= keywords]」 を参照してください。また、『Fortran プログラミングガイド』では、「dusty deck (互換性または保守のために残さざるを得ない)」プログラムの移植についての章で、例を挙げて検討されています。