Fortran, C, Pascalはいずれも、プログラム言語としては手順立て型という 同じグループに属しますから、概念は相互に対応しています。 1996年当時、情報基礎科目でPascal を経験している人が多かったので、 Pascalとの対応をつけながらFortran文法の要点を説明しておきます。

プログラミング言語 Fortran と Pascal の文法の比較

ここでは、いわゆるFortran 77(注)の文法のうち、 増田の教材でまず必要になる部分の説明をする。 また、Pascalとの対比を添える。 なお、Fortranには新しい90および95標準があり、 大規模な数値計算をする人には使われているが、 ここでは、GNU g77などのフリーのコンパイラに合わせて、 77標準に多少の新しい要素を追加した文法を紹介する。 また、サブルーチン(Pascalでのprocedureに対応) や関数サブプログラムに関することは、今回は省略し、 別の記事で紹介する。

注「Fortran 77」: ANSI=アメリカ国定標準 1978年、JIS=日本工業規格 1982年制定の標準であるが、 原案の最終版が書かれた年にちなんでこう呼ばれる。一つ前の標準はFortran 66 である。

◎文字の種類

Fortran
Fortranプログラム中で意味を持つ文字は、アルファベット、数字、空白と 記号 + - * / = ( ) , . : ' & $ である。大文字と小文字の区別はない。 ただし、文字列および文字型変数の値としては、もっと多種類の文字が許され、 大文字と小文字が区別されるのがふつうである。
Pascal
Pascalで意味を持つ文字はFortranよりやや多い ( ; { } [ ] < > ^ など)。 Pascalでも大文字と小文字の区別はない。
注:
Cなど、比較的新しいプログラム言語では、大文字と小文字を区別するもの が多い。

◎行と文

*行
Fortran
Fortranプログラムは行からなっている。
Pascal
Pascalでは改行は空白と同等であり、行という構造を特別に意識しない。
*注釈(コメント)

注釈とは、人間のための覚えや、プログラムの見かけをよくするために 挿入されるもので、機械語には翻訳されない。

Fortran
次のような行は注釈行である。 行の一部が注釈になることは、77標準にはない。 (それぞれのコンパイラで拡張された約束があることが多い。)
Pascal
次のような部分は注釈である。 行の一部が注釈であったり、一つの注釈が複数の行にまたがったりする。
*文
Fortran
注釈以外の文は、次のいずれかの形で書かれる。 複数の文が1つの行にあることは77標準にはない。
Pascal
文が複数の行にまたがってもよいし、同じ行に複数の文があっても よい。文と文の境には、セミコロン(;)を置く。
*複合文
Fortran
Fortranでは複数の文の組み合わせで複合文ができるという考え方はしない。 ただし、文のブロックという考えはある。(IF, DOの項)。
Pascal
Pascalでは、複数の文を BEGIN ... END でくくったものは複合文とみなされ、 一つの文が来るべきところに置くことができる。

◎変数名などの字数

Fortran
Fortran 77では、6文字までとなっている。 実際のコンパイラでは、もっと長い変数名を許すことが多いが、7文字め以降で 初めて区別されるような名前は避けたほうがよい。 DEC Fortranでは、31文字までとなっている。
Pascal
Pascal (ANSI 1983年標準)では変数名の字数の制限はない。 DEC Pascalでは、 頭から31文字までが区別され、その先の違いは無視される。

◎宣言文と実行文

FortranでもPascalでも、プログラムを構成する文は、機械に仕事の手順を指示する 実行文と、それに使う変数の名前や種類などを決める宣言文とがある。プログラム (Fortranの場合、正確には「プログラム単位」)の前のほうに宣言文をまとめて 置き、実行文はそのあとに置く。 宣言文相互の間に順序の指定がある場合もあるが、ここでは詳しくは述べない。

Fortran
Fortranでは、宣言部と実行部の境目に特別な印はない。注釈行をはさむのがよい。
Pascal
Pascalでは、実行部の初めに BEGIN を置く。 プログラムの最後の END. と呼応する。

◎主要な宣言文

*定数宣言

Fortran
PARAMETER文(Fortran 66にはなかった)
  PARAMETER(定数名=値, 定数名=値, ...)
  例、PARAMETER(nmax=100)
  
Pascal
CONST宣言
   CONST 定数名=値, 定数名=値, ...
   例、CONST nmax=100;
  

*変数の型宣言

Fortran
型名で始まる宣言
  型名   変数名, 変数名, ...
  例、INTEGER  ix, iy
      REAL*8   v
宣言を省略すると、次のようになる。 変数はなるべく宣言したほうがよい。 (77標準ではないが、最近の多くの コンパイラでは、) IMPLICIT NONE と書いておくと、変数を 全部宣言しなければならなくなる。
Pascal
VAR宣言
   VAR  変数名, 変数名...: 型名
   例、VAR ix, iy: INTEGER;
           v: REAL;
Pascalでは変数の宣言を省略できない。

*配列の宣言

(配列変数の意味については、 例文で実際に使う回で補足する。)

Fortran
変数の型宣言文で兼ねる。(専用のDIMENSION文を使うこともある。) 変数名のあとに丸カッコで寸法を書く。
 例、REAL*8   a(nmax), b(0:nmax)
  
添え字の下限は、省略すると、1 。
Pascal
変数の型の指定中でARRAYというキーワードを使う。
  例、VAR a: ARRAY[1..nmax] OF REAL;
          b: ARRAY[0..nmax] OF REAL;
  
Pascalでは添え字の下限は省略できない。
注:
Cでは添字の下限は0、Basicでは省略すると 0。

◎代入文

Fortran
代入記号は「=」(「等しい」は「.EQ.」)
 変数名 =  式
 例、a(1) = ix * v + iy
Pascal
代入記号は「:=」(「等しい」は「=」)
  変数名 := 式
  例、a[1] := ix * v + iy;

◎制御構造

*順次処理

Fortran
続けて実行する文は、次の行に置く。
Pascal
続けて実行する文は、; で区切って置く。

*条件分岐

Fortran
ブロック IF 文を使う。(66標準にはなかった。) THENやELSEのあとで改行する(つまり、別の文にする)ことに注意。
  IF (論理式1) THEN
    <THENブロック>
  ELSE
    <ELSEブロック>
  END IF
各ブロックには、(改行で区切られた)複数の文を含めることができる。 ELSE文とELSEブロックがないこともある。
Pascal
IF ... THEN ... ELSE 構文を使う。
  IF 論理式 THEN <文1> ELSE <文2>
ただし、<文1>、<文2>のところに、 BEGIN ... END でくくられた複合文が 来ることができる。
Fortran
多方面の分岐を扱えるELSE IF文もある。
Pascal
PascalではELSE IFは特別な構文ではなく、 IF構文の文2のところにIF文が来たもの。
Fortran
ELSEが必要なく、またTHENブロックの文が1つだけのときは、次のよう な「論理IF文」(THENがない)も使える。
 IF (論理式) <文>
  
Pascal
ELSEのない次の形もある。<文>のところに複合文が来てもよい。
  IF 論理式 THEN <文>
  
Fortran
Fortran 77標準にはPascalのCASEのような構文はない。(90標準にはある。)
Pascal
多方面の分岐を扱う CASE 文もある。

*回数の決まったくりかえし

Fortran
DO 文を使う。
      DO 文番号  制御変数 = 初期値, 終端値, 刻み
       <DO ブロック>
文番号  CONTINUE

文番号のついた文を"DOの終端文"と言う。正しくは、これもDOブロックに含める。 まぎらわしいので、終端文は必ずCONTINUEという、何もしない文にしておくのがよい。

DOブロックには複数の文を含めることができ、別のDOブロックやIFブロックを 含んでもよい。

刻みは省略でき、省略すると1とみなされる。

最近の多くのコンパイラや、90標準では、次の形を許す。

    DO 制御変数 = 初期値, 終端値, 刻み
      <DO ブロック>
    END DO

Pascal
FOR構文を使う。
      FOR 制御変数 := 初期値 TO 終端値 DO <文>
<文>は複合文でもよい。
刻みは 1 または -1 に限られる。-1 の場合は、TOの代わりにDOWNTOを使う。

*回数が前もってわからないくりかえし

Fortran
Fortran 77 にはこのための構文がない。次のように、GO TOを使って構成する。
  文番号1  IF (終了条件) GO TO 文番号2
             <くりかえす内容>
           GO TO 文番号1
  文番号2  CONTINUE
90標準やDEC Fortranでは次の形を使える。
    DO WHILE (くりかえし条件)
      <DO ブロック>
    END DO
Pascal
WHILE構文を使う。
  WHILE くりかえし条件 DO <文>
また、REPEAT ... UNTIL 構文もある。
  REPEAT <文> UNTIL 終了条件

◎入出力文 (テキストファイル関係のみ)

*読む

Fortran
READ文
  READ (装置番号, 書式指定) 入力変数並び
Pascal
readlnまたはread手続き
   readln(ファイル変数, 入力変数並び);
ファイル変数は TEXT型またはFILE型で、 reset手続きで割り当てられる。 ファイル変数は省略でき、省略した場合、 標準入力から読む。

*書く

Fortran
WRITE文
  WRITE (装置番号, 書式指定) 出力式並び
Pascal
writelnまたはwrite手続き
  writeln(ファイル変数, 出力式並び);
ファイル変数は TEXT型またはFILE型で、 rewrite手続きで割り当てられる。 ファイル変数は省略でき、省略した場合、 標準出力に書く。 書式指定のうち、数値の桁数は、出力 変数のそれぞれにコロンつきで指定する。
Fortranのテキストファイル入出力では、READ/WRITE文は、前に実行したREAD/WRITE の対象の行の続きではなく、新しい行を読み書きする。Pascalでは1行の内容を複数 のread/write文で読み書きすることがあるが、Fortranでは一括してREAD/WRITEする ようにプログラミングする。
1996-04-29; 2000-04-18; 2003-05-29
増田 耕一

目次へ