%表題   MISC1 (その他の基本処理下位パッケージ)
%
%履歴
%\Drireki{
%         92/01/17 酒井  敏
%         92/04/22 林祥介   (4.1版)
%         94/04/23 塩谷雅人 (5.z版)
%        }
%
\section{ファイルの構造}
  % \label{file}

ファイルの形式も機種によりかなり異なるが, 
FIOLIB は固定長レコードのファイルに限って
異機種間のデータ転送を可能にするためのユーティリティーである. 
\vspace{1em}

FORTRAN規格におけるファイルの属性は基本的に, 
書式のありなし(FORMATTED/UNFORMATTED)と 
アクセス方法(SEQUENTIAL/DIRECT) の組み合せで決る. 
書式のありなしは, 例えばWRITE文を実行するときに, 
内部表現を文字に変換するか, 内部表現をそのまま出力するかということを
指定するものであり, 
いわば「ファイルの中身」を指定するものである.  
一方, アクセス方法の指定は文字どおり解釈すれば, 
順番に読み書きするか, ランダムに読み書きするかという指定であるが, 
実際には「アクセス方法」よりも, 
そのアクセス方法を実現する「ファイルの構造」の方が問題となる場合が多い. 
\vspace{1em}

規格上, 
DIRECT ファイルではレコード長を指定するRECL指定子を書かなければならず, 
SEQUENTIAL ファイルの場合には, これを\.書\.い\.て\.は\.い\.け\.な\.い. 
つまり, 「アクセス方法」の指定は, 
DIRECT ファイルは固定長レコードのファイルであり, 
SEQUENTIAL ファイルは可変長レコードのファイルであるという
「ファイル構造」を暗黙のうちに指定することになる. 
\vspace{1em}

FORTRANプログラム上の論理的なレコードが, 
実際に記録媒体の上でどのように記録されるかということに関しても, 
大きく分けてメインフレーム系(IBM系)とUNIX系の2種類あり, 
それぞれファイルの扱い方がかなり異なる. 

%------------------------------- IBM --------------------------------
\subsection{メインフレーム系}
  メインフレーム系の計算機では, 
  アクセス方法とファイルの構造は, ほとんど独立した概念として扱われる. 
  ファイルの構造としては,  
  固定長(F), 可変長(V), ブロック化固定長(FB), ブロック化可変長(VB), 
  さらに, スパンドブロック化可変長(VBS) などがあるが, 
  これらの概念はFORTRANにはないので, 
  FORTRANプログラム以外の部分(DD文など)で指定することになる. 
  \vspace{1em}
  
  これらのファイル構造のうち, 固定長ファイル(F, FB)が最も単純で, 
  決った長さのデータが並んでいるだけで, 
  余分なコードは入っていない. 
  これに対して, スパンドブロック化可変長(VBS)形式は, 
  最も複雑な構造をしているが, どんな長さのレコードも記録できる
  真の可変長レコード形式である
  (V, VBは可変長といってもレコード長の上限がある). 
  \vspace{1em}

  また, 一般に計算機が読み書きする時には, 
  できるだけ大きな単位にまとめて行う方が効率がよいので, 
  ブロック化された形式の方が処理は早い. 
  \vspace{1em}

\begin{itemize}
  \item {\bf SEQUENTIAL ファイル}
    \begin{quote}
      書式なしのSEQUENTIALファイルでは, 
      通常VBS形式が使われる. 
      この形式が最もFORTRAN規格とは整合性がよく, 
      DD文などで何も指定しなければ, 
      この形式が採用される場合が多い. 

      書式つきの場合は, もともと, 特定の長さを持つデバイスに出力
      することが多いので, F, FB なども使われる. 
      この場合, プログラムが書き出すレコードの最大レコード長が, 
      ファイルのレコード長を越えることがないように
      注意しなければならない. 

      書式なしのデータをF, FB などに出力することは, 
      FORTRAN の文法との整合性が悪いので, 
      禁止されているか, 制御コードを含む形式のファイルとして扱われる
      こともある. 
      
      どちらにしても, ユーザーがブロック長などを指定するということは, 
      単なるFORTRANプログラマの知識を越えて, 
      システム管理者的な知識が必要となり面倒である. 

      しかし逆に言えば, プログラムで行う処理の性質とシステムの特性の
      両方を考慮して極限までチューンアップすることが可能である. 
      実際, メインフレーム系の計算機では, 
      ブロック長などのパラメータの選び方でかなり処理速度に差が出る. 
    \end{quote}

  \item{\bf DIRECT ファイル}
    \begin{quote}
      DIRECT ファイルで使えるのは固定長レコードのファイルだけである. 
      DIRECT ファイルはランダムにアクセスすることが可能なので, 
      ブロック化ができない. 
      したがって, 順番にアクセスするならばSEQUENTIALの方が早くなる. 

      一般的に, メインフレーム系の計算機では
      DIRECTファイルは扱いやすくないので, 
      あまり使われていないようである. 
    \end{quote}
\end{itemize}
%------------------------------- UNIX --------------------------------
\subsection{UNIX系}

UNIX系の計算機が扱うファイルは
基本的に全て可変長レコードのファイルであり, 
表向きブロック化という概念はない. 
実際には, 何等かのブロック化が計算機内部で行われているものと
思われるが, 
それは, FORTRANユーザーのレベルではわからない. 

\begin{itemize}
  \item {\bf SEQUENTIAL ファイル}
    \begin{quote}
      書式つきのSEQUENTIAL ファイルでは通常のテキストファイルと同様に
      レコードの終りに行末記号が付加される. 
      行末記号はUNIXでは1バイトで LF, 
      MS-DOSでは2バイトで LF, CR である. 

      書式なしの場合には, レコードの最初と終り(または最初だけ)に, 
      レコードを認識する何等かの記号が付加される. 
      この記号は処理系によってかなりことなり, 
      同じ内部コードを採用している場合でも互換性はない. 
    \end{quote}

  \item {\bf DIRECT ファイル}
    \begin{quote}
      DIRECT ファイルではレコードの長さが決っているので, 
      レコードを認識するための記号などは付加されず, 
      決った長さのレコードがつながった最も単純なファイルとなる. 
      (システムによってはファイルの先頭に固有のヘッダを
      付加するものもある. )

      したがって, 
      変数の内部表現が同じであれば, ほとんどの計算機で互換性がとれる. 
      さらに, システムによってはSEQUENTIALファイルに比べて, 
      処理速度が圧倒的に早い場合もある. 

      UNIX系の計算機においては, 
      たとえ単に順番にレコードを参照する場合でも, 
      利用価値のあるファイル形式である. 
    \end{quote}
\end{itemize}


