Appendix-7   日立 Fortran

    ここでは, 日立の Fortran である OFORT77 について, 推奨するオプションおよび注意事項について説明します.  f77 コマンドの詳しい説明は, マニュアルあるいは man コマンドで参照して下さい.
    /keklib/guide/ の fortran_note.euc および f77-V*-ReleaseNote/* の情報も参照して下さい.

1. コンパイルオプション
  a) 推奨値 (他の Fortran との互換性)
        -i,E,U,P,PL,LT,L,EU,CL,CU -W0,'LANGLVL(CONTI199,DARG(L),H8000)'
    内容を簡単に説明します.
       E:   引数のリストの形式. 詳細は "man f77" で参照して下さい.
       U:   9文字以上のエントリ名称, _ のサポート.
       P:   以下の内容の 拡張仕様のサポート.
               FORMAT 文の $ 形, NL 形編集が使えます.
               FORMAT 文の O 形, Q 形編集が使えます.
               FORMAT 文の欄の巾の上限値を 32767 にします (標準は 255).
               上限または下限を越えた実定数について, 最大値または最小値を仮定します.
                    (ex)    parameter(fpmin=2D-308)
               " で囲まれた文字列を文字定数とみなします.
               PARAMETER 文に組み込み関数が使用できます.
               英字名に $ が使用できます.
               組み込み関数 %VAL, %REF が使用できます.
               ! 以降をコメントとみなします.
               COMMON で定義した変数を, DATA 文で初期化できます. (1995年1月サポート予定)
       PL:   LANGLVL(H8000) とともに指定して, 8進定数, 16進定数の記述形式を拡張します.
                 8進定数 :   O'xxxx'
                16進定数 :   Z'xxxx', X'xxxx' or 'xxxx'X
       LT:  1組の " で囲まれた文字列を, 文字定数とする.
       L:   エントリ名称を英小文字にします.
       EU:  エントリ名称の末尾に "_" を付加します.
       CL:  Common block 名を英小文字にします.
       CU:  Common block 名の末尾に "_" を付加します.
       LANGLVL(CONTI199):  継続行を 199行までできます. (1995年1月サポート予定)
       LANGLVL(DARG(L)):   引数をアドレス渡しとします.
       LANGLVL(H8000):     .and., .or. によるビットワイズ演算ができます.
    なお, C 言語とリンクしない場合には, 一部を省略できます.
        -i,E,U,P,PL,LT -W0,'LANGLVL(CONTI199,DARG(L),H8000)'

  b) 最適化
        % f77 -W0,'OPT(O(*))'
     O(*) の値と内容は以下の通りです.
        O(0): no optimization,  O(3): global optimization,  O(4):full optimization
        O(S)= (O(4),APPROX,DISBRACKER,DIVMOVE(1),EXPAND,ISCHEDULE,PROD)
  c) 自動倍精度
        % f77 -W0,'LANGLVL(PRECEXP(0|ALL|4|8))'
     PRECEXP の値と内容は以下の通りです.
        PRECEXP(0)  :  Default. None
        PRECEXP(ALL) : R4->R8, C8->C16, R8->R16, C16->C32
        PRECEXP(4)  :  R4->R8, C8->C16
        PRECEXP(8)  :  R8->R16, C16->C32
  d) リスト出力
      % f77  -W0,'LIST(R,S)'
    LIST の値と内容は以下の通りです.
       LIST(S)  :  Source list
       LIST(R)  :  Cross referance
    リストの出力先は <filename>.L です.

2. コンパイル
  a) Fortran プログラム実行時のエラーで表示される行番号
     正しい行番号が表示されるのは OPT(0) のときです.  それ以外では, ずれて表示される場合があります.
  b) リンク
       % f77 <*.o> -o <name> -L<path> -l<lib>

3. データの入出力
  a) テキストデータの入力
      OPEN 文で, TYPE='TEXT' を指定します.
  b) Fortran で入出力する binary data の形式が, 他の Fortran と異なります.
        ==>  実行時オプションを指定すれば, 業界標準の形式になります. (1995年1月サポート予定)
         (ex)   % a.out  -F'PORT(STDUF)'
  c) 表現可能な範囲外の数値
      10e-39 以下, 10e38 以上のデータの read はエラーになります.
        ==>  実行時オプションを指定すれば, 最小値あるいは最大値を仮定できます.
         (ex)   % a.out  -F'PORT(CNTLFLOW)'
  d) "read(9,*,end=..)" で eof 検知後に "write(9,*).." をするためには, その前に "backspace 9" をおこないます.
        ==>  実行時オプションを指定すれば, "backspace 9" を省略できます.
         (ex)   % a.out  -F'PORT(EOFRD)'
  e) FORMAT 文の指定より短い長さのデータを入力する場合
        ==>  実行時オプション -F'RUNST(FREC(nnn))' を指定すれば, 入力できるようになります.
             "nnn" は FORMAT 文でのレコードの長さです.
         (ex)  % a.out -F'RUNST(FREC(512))'
      V01-03 (1993年7月) で -F'RUNST(FREC(512))' を標準値とするようにしました. ただし, 他のオプションを指定する場合には, 明示的に指定する必要があります.
  f) DO ループ内の read 文
      Cntl-D により DO ループから抜けます.
        ==> READ 文の EOF 状態を解除して DO ループから抜けないようにするためには, 実行時オプションを指定します. (1995年1月サポート予定)
         (ex)   % a.out  -F'PORT(EOFRDT)'
  g) 業界標準に合わせるために,  b)〜 f) 全ての実行時オプションを指定することを推奨します.
         (ex)   % a.out  -F'RUNST(FREC(512)),PORT(CNTLFLOW,EOFRD,EOFRDT,STDUF)'
  h) 1995年1月に, その他, 以下の実行時オプションがサポートされる予定です.
         PORT(NSCRACH):  OPEN 文で FILE 指定子を省略した場合, ft.nn (nnは装置番号)という名称のファイルと接続し, プログラム終了後もファイルを削除しない.
         PORT(REALEDT)   実数型データ 0.0 を E, D, Q, G 形編集子で出力する場合に, 指数部を表示する.
                           (ex)   PRINT '(E5.1E1)',0.0     -->   0E+0
         PORT(REWNOCL):  REWIND 文を実行してもファイルを open したままです.
         PORT(ECONV):    E, G 形編集子で出力する場合に, 指数部を表示する.
                           (ex)   PRINT '(E10.2)',3.0D0     -->   0.30E+01

4. 組み込み関数
  a) Fortran プログラムとシステムとの間のインターフェイスのための関数
     関数がほとんどありません.  その代わりに HF_SH サブルーチンにより, shell command を実行できます.  日立では, 需要の高いものから関数を整備していく予定とのことです.
  b) getarg
     HP と同一の仕様です.  Sun と引数の仕様が若干異なります.  Sun との互換モードはありません.
             call getarg(k,arg)
                k=1 の場合には, コマンド名は返ります.
  c) getenv
     引数が他の Fortran と異なります. 次の形式です.
             call getenv (name, name_length, value, value_length)

6. 検討中の課題
  a) 継続行数の拡張
      1995年 1月に, コンパイルオプション LANGLVL(CONTI199) により, 199行まで継続できるようになる予定です.

  b) COMMON で定義した変数を, DATA 文で initialyze すること.
      1995年 1月に, コンパイルオプション P によりサポートされる予定です.
  c) Fortran で入出力する binary data の形式が, 他の Fortran と異なります.
      1995年 1月に, 実行時オプション PORT(STDUF) により業界標準の形式がサポートされる予定です.
  d) 3.-g) で推奨した実行時オプションを, 少なくとも KEK 標準に設定することを検討しています.










Appendix-8   HP Fortran

    ここでは, HP-UX 9.03 上の  HP Fortran について, 推奨するオプションおよび注意事項について説明します.  HP Fortran の詳しい説明はマニュアルあるいは man コマンドで参照して下さい. 

1. コンパイラについて
     HP の Fortran コンパイラは2種類あります.
        f77
        fort77
    このうち POSIX に対応しており,  またライブラリーのパス名が指定できるコンパイラーは fort77 なので, これを推奨します. 
    ccws06 および ccws07 では fort77 および hp_f77 により, HP Fortran を使用できます.

2. コンパイルオプション
  a) 他の Fortran および CERNlib を考慮した推奨値
        -e -K +ppu
     但し, H3050 でも実行できるバイナリを作成する場合は,
        -e -K +ppu -Wl,-a,archive
     このオプションにより, 共有ライブラリーに依存しなくなります.

  b) C言語とリンクする場合の推奨値
     シグナル処理を行なわないプログラムの場合には, 特に注意することはありません.
     シグナル処理を行なう場合には,
        +T
     オプションをつけることを推奨します.

  c) 最適化
     以下の最適化オプションがあります.
        +Os (supress optimization), +O1 , +O2(= -O)  , +O3
     その他には,
        +OP (invokes the Fortran optimizing preprocesser)
     等があります. 
 
  d) 自動倍精度
        +R4 , +R8 , +autobplpad
     等のオプションがあります.

  e) リスト出力
        +R , -L(f77 のみ)
     によって表示できます.

3. コンパイル
  a) Fortran プログラムの実行時のエラーで表示される行番号
    正しい行番号が表示されるのは +Os のときです.
 
4. 組み込み関数
    組み込み関数は Fortran90 の仕様(HP Fortran マニュアルで言う MIL-STD-1753 はこれと同じ)に沿った関数が定義されています. その他, Sun で定義されている関数等が用意されています.

    組み込み関数のうち一部の関数はデフォルトで使えない場合があります. その場合には,
        +apollo , +U77
    等のオプションを使います.
 
5. その他
  a) CERNlib のコンパイルオプションは /cern/94a/mgr/94a/hpx.names 等を参照します.

  b) デバッガ
     xdb で大抵のプログラムをデバッグできます.  GNU software の gdb も使えます.
     シグナル処理を含むプログラムの場合には, xdb が適しています.