FORTRAN 77の言語仕様
FORTRANの「空白は無視する」という言語仕様が招く、コンマとピリオドの打ち間違いがコンパイルエラーにならず、間違ったプログラムになる、という例を説明する。
Cで、次のように書くプログラムの一部があったとする。
これをFORTRAN66で書くと次のように書ける。
最初の行は、整数型変数Iを1から5まで1ずつ増加させつつ、行ラベル10の行までを繰り返し実行することを表す。行ラベル10のCONTINUE文はループ制御の端末文ではなく、どこにでも置ける「何もしない」機能の文である。
この、DO文のコンマをピリオドに打ち間違えたとする。すると、空白を無視するFORTRAN66では、この行は、
という、「DO10Iという実数型変数に1.5という実数を代入する代入文」と解釈される。FORTRANでは変数宣言が無い場合、DO10Iは実数型変数を暗黙に示すからである。 この結果、このプログラムは(他のどこからも参照されない)変数DO10Iへの代入とただ1回の「何らかの処理」が実行されるだけとなり、意図した繰り返し処理は起こらない。
C言語などでは、空白文字は字句要素の切れ目として解釈されるため、DO と 10 と Iが結合して一つの字句要素になることはない。
「これが原因でNASAの宇宙ロケットが制御不能になり爆破された」という話が度々語られる。
以下の関数が追加された。
文字長(LEN)
部分列の位置(INDEX)
正接(TAN、DTAN)
逆正接(ASIN、DASIN)
逆余弦(ACOS、DACOS)
逆正接(ATAN、DATAN)
双曲線正弦(SINH、DSINH)
双曲線余弦(COSH、DCOSH)
双曲線正接(TANH、DTANH)
文字列の大小比較(LGE、LGT、LLE、LLT)
プログラムは以下の形式で記述する。もともとパンチカードに書くことを前提としていたので、1行は80文字で構成されていた。行の左端からの文字位置を桁(けた)またはカラムと呼んだ。
もともとのFORTRANは、字句解析の仕組みがCやJavaと大きく異なり、桁位置(行の左端からの文字位置)に依存していた。これを固定プログラム形式という。これは、当時、データの入力にパンチカードを 使用していたためである。1桁目から5桁目が文番号で、6桁目が継続行の指定、7桁目から72桁目に文の本体を記述する。73桁目から80桁目は任意に指定可能な、行を識別するための文字列を記述する領域である。また、文字列定数中以外の空白文字は一切無視されていた。二つ以上の字句を空白無しで続けて書 いたり、逆に一つの字句の途中に空白文字を入れても構わない。
各種の書式を定義する。
DIMENSION文配列を定義する。 COMMON文プログラム間での共通領域を定義する。 EQUIVALENCE文ある変数と別の変数を同じ物とみなす。 EXTERNAL文外部手続きであることを宣言する。 型宣言文型宣言文は配列定義も兼ねられる。 INTEGER文 REAL文 DOUBLE PRECISION文 COMPLEX文 LOGICAL文