GNU Fortran

大信田 丈志
作成: 2000-10-23


まず言っておかなければならないことは、 FORTRANそのものは未だ生命を保っているかもしれないにせよ、FORTRAN77は既に過去の遺物であるということだ。 どうしてもFORTRAN系の言語を使うのなら、Fortran90に移行するか、 せめて GNU Fortran の拡張機能を利用して、 読みやすく、バグの少ないプログラムを書くようにすべきである。

[UNIXのページ] [ホームページに戻る]


良いプログラムを書くのに役立つ拡張機能

GNU Fortran は、基本的にはFORTRAN77をベースにしているが、 それに加えて さまざまな拡張機能を取り込んでいる。 これらの拡張機能のなかには「Fortran90でも通用し、かつ 良いプログラムを書くのに役立つような機能」が少なくない。 そういう機能を積極的に利用すべきである。 具体的には、次のようなものが挙げられる:

[ページの冒頭に戻る]


g77.infoメモ

私の手元にある版のg77.infoの内容を自分なりにまとめたもの。 内容が正しいかどうかは一切保証しないので、そのつもりで読んでほしい。 英語の文書を読むパワーと時間がある場合は、 自分のマシンのg77.infoを直接読むか、 本家GNUDelorie Softwareのオンラインマニュアルを参照するほうが良いだろう。

しくみ

% g77 -v 
Reading specs from /usr/lib/gcc-lib/i586-pc-linux-gnulibc1/egcs-2.90.29/specs
gcc version egcs-2.90.29 980515 (egcs-1.0.3 release)

% locate libf2c
/usr/lib/gcc-lib/i586-pc-linux-gnulibc1/egcs-2.90.29/libf2c.a
/usr/lib/libf2c.a
% locate libf2c | xargs file  # 両者の実体は同じであることが分かる

g77 は gcc のフロントエンドであり、gcc が f771 を呼び出す:
% locate f771  
% g77 -v hello.F
% g77 --driver=/bin/true  # ← gcc を呼ぶのを邪魔する

コマンドラインオプション

% g77 -fno-silent hello.F   # プログラム単位の名前をstderrに表示
% g77 -fno-ugly   prog.F    # 「醜悪な」構文をまとめて排除 (→ distensions)

-ff90 :     Fortran 90 の構文(の一部)が認識できるようになる
-ffree-form または -fno-fixed-form :  自由形式
-fbackslash および -fno-backslash  :  たとえば '\n'を「改行」に変換するか否か
                                      [デフォルトは -fbackslash]
-fcase-preserve          :  U と u を区別する(?)
-ffixed-line-length-桁数 :  固定形式での桁数の指定

-w           :  警告メッセージを抑止
-Wimplicit   :  各単位で IMPLICIT NONE を宣言するのとほぼ同じ
-Wall        :  -Wunused と -Wuninitialized を組み合わせたものと同等
-Wsurprising :  解釈に任意性がある式などの問題点を指摘する

-g             :  デバッグ情報を追加 (ただしまだ不完全)  →  -fdebug-kludge
-O             :  最適化
-malign-double :  [i386系(Pentiumなど)で倍精度を多用する場合に有効]

言語仕様

「GNU Fortran言語」 = ANSI FORTRAN 77 + GNU独自の拡張

注意

厳密には「GNU Fortran言語」と g77 の仕様は一致しない.
「言語」の仕様に含まれない拡張機能の例:

NAMELIST文

現時点では大文字と小文字の区別に対応できていない.

KIND表記

KIND表記
GENERIC-TYPE(KIND=N) のような型表記
GENERIC-TYPE
(INTEGER|REAL|COMPLEX|LOGICAL|CHARACTER)
現時点でのKIND割り当て案 (変更の可能性あり):

書き方

 
感嘆符から行末まではコメント(ただし感嘆符が第6桁にある場合は継続行)

セミコロンで文を並べて書ける.
ただし, 次のように IF のあとにセミコロンを使うのは良くない:

     IF (VALIDP) CALL FOO; CALL BAR

プログラム単位の末尾の「END」の代わりに「END PROGRAM」「END SUBROUTINE」
などと書くことができる.

INCLUDE 'ファイル名' が使える.
これは実行文でも非実行文でもない: statementではなく directiveである.

制御文

ポインタに似た機能

  %LOC()  %VAL()  %REF()  %DESCR()
  ※ 濫用厳禁!  OSやウィンドウシステムなどにアクセスする部分に
     限って使用し, プログラム本体での使用を避けるようにする.

組み込み関数

Cと組み合わせて使う

オブジェクトファイルの互換性

型宣言(f2c.h)

f2cを用いた骨格生成

コンパイル

FORTRANの主プログラム → 関数 MAIN__() としてコンパイルされる

副プログラムのコンパイル:

共有ブロック: 今のところ, char配列として実装されている.
[例] COMMON I(15), R(20), T  →  char _BLNK__[144]
     I → _BLNK__[0..59]
     R → _BLNK__[60..139]
     T → _BLNK__[140..143]

EQUIVALENCE: COMMONブロックを含む場合はCOMMONブロックと同じ方法で実装.
             そうでない場合は __g77_equiv_X のような char配列として実装.

注意

FORTRANの知恵袋

暗黙の型宣言を避ける:

変数の値がきちんと設定されていることを確かめる:

バッファへの書き出し: CALL FLUSH(N)

Pentium または Pentium Pro で次のように指定すると少し速くなる:
   -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2
   -fomit-frame-pointer
ただし -fomit-frame-pointer を指定するとデバッグができなくなる.

おまけ


[ページの冒頭に戻る] [UNIXのページ] [授業のページ] [ホームページに戻る]