FORTRAN - はじめてのプログラミング言語
最初に覚えたプログラミング言語と言えば、実はFORTRANなんです。小学生高学年の頃に図書館にあった「電子計算機入門」みたいな本に代表的なプログラミング言語としてCOBOLと共に紹介されていたのが出会いです。実はCOBOLは当時の英語力では多くの予約語の意味がわからず、殆どが式で、せいぜいIFとかDOとかの単語しか登場しないFORTRANの方が取っつきやすかったんです。
時代を考えればFORTRANといっても、多分66相当だったと思います。紙にコードを書いて、カードにパンチして計算機に読み込ませて、実行させると結果がラインプラインタの両側に穴の空いた紙で出てくるという時代です。残念ながら計算機を使えるような環境はなく、竹橋の科学技術館に展示してあった(多分、当時は稼働させていたんだと思う)大型機を遠くから眺めるだけでした。
その時のFORTRANが、どんな言語であったかを調べようとしたのですが、77以降ならともかく古い言語仕様はネット上には、きちんとまとまっているものがなかなか見つかりません。きっとどこかの書庫には立派な紙の本が今でも眠っているのだとは思いますが。またANSI(ISO)の規格と似てるけど少しだけ違う、それぞれの時代のJIS規格。そして各機種に移植されたローカルな仕様があるので、あまり深く追うことはしないことにします。記憶を頼りにしているところが多いので、ご指摘を歓迎します。
あくまで当時のプログラミングで、今は推奨されないものもたくさんありますが、FORTRANの流儀を思い出してみます。
コードは大文字で書く。小文字が使えない処理系も多かった。
1行は72文字固定。打ち込むのがカードです。
最初の5文字は必要な行にだけ行番号を書く。注釈行の場合は先頭に”*”または”C”。
6文字目は継続行(前の行が長くて書ききれない時)であるときのみ空白以外の文字を書く。”-”を使うことが多かったが、何行にも渡る時は”1”~”9”の数字を書くことがあったかも。
7文字目以降に文を書く。マルチステートメントは不可。
空白は無視される。予約語や変数名は空白では区切られない。”END”と書いても”E N D”と書いても同じ。
変数の型は、整数、実数(単精度および倍精度)、複素数、文字。
変数の型は、変数名の(何も書かなければ)先頭の文字で決まる。I~Nが整数です。
変数名の長さが6文字までが安全。言語で大丈夫でもリンカでダメなことがある。
IF文のひとつに三分岐IFがあった。結果が負か零か正で指定の行番号に飛ぶ。
文字列のコードはASCII「ではない」のが普通(EBCDIC)。
安定のWRITE文と組みになるFORMAT文。FORMAT文の書式指定子がとても難解(C言語のprintfにも似ている)。
グローバル変数は無いのだが、COMMON文でいくらでも共有はできる。
言語仕様を知らない人にはなんの事かもわからないかもしれませんが、もう少しレトロな雰囲気に浸りたい方は以下のサイトも参考にしてみてください。
Fortran code examples
https://zims-en.kiwix.campusafrica.gos.orange.com/wikibooks_en_all_maxi/A/Fortran/Fortran_examples
BASICの時代に批判の的となったGOTO文ですが、そもそもFORTRANの時代にはやりたい放題でした。行番号はBASICと異なりサブルーチンや関数に閉じてはいるので、外からいきなり飛び込むことは無かったものの、DO文の内側に飛び込んだり飛び出したりは自由でしたし、ASSIGN文のおかげで、簡単にはループの中か外かもわからなかったりもします。
私がFORTRANのコードと馴染んだのは、大学で大型機を使うようになってからで、
もう77の時代ではあったのですが、アメリカからテープで取り寄せたような伝統的なコードは、ほぼ古いFORTRANで書かれていました。古いコードほど、互換性の高い方法を選んではあるものの省メモリと高速化を狙って、妙なテクニックが駆使されていたのは確かです。
今からFORTRANの作りを振り返ると、古いFORTRANはなるほど、すべての変数が静的でコンパイル時にメモリの割り当てが済んでいるのだなとわかります。変数をスタックに割り当てるということもありません(このため再帰を書く時に制限のあるコンパイラも多かったです)。ですので出来上がったプログラムを走らせるには、どれだけのメモリが必要であるかは実行するまでには確定していて、OSは必要なメモリを確実に割り当てることが出来ます。実行してみてメモリが足りないという事態は避けられるわけです(細かい例外はいつでもあります)。
これは今でもOSやドライバなどを書く人には大切なことで、C言語で書く時にも使う変数領域が静的に確実に割り当てられるようにstatic文を駆使する人もいます(スタックの状態を仮定できない)。
今のFORTRANは、動的なメモリ割り当ても出来るようになっていて、他の言語と変わらないことが出来ますが、過去の資産を使わないのであれば、わざわざ新しく使う必要もないのかなとは思います。過去に資産を使うのであれば、今度は複雑なCOMMON文と戦う必要があるのですが、コンパイラが強力で最適化が期待できますし、コンパイル時にかなりのエラーをあぶり出すことが出来るという意味では、悪くはないと思います。
私が泣いたASSIGN文であるとか、EQUIVALENCE文の恐怖、そして情報処理技術者試験の話なんかは機会があれば。ああベクタライズで苦労する時代でもあったなぁ。
FORTRAN
FORTRAN 77の言語仕様
ヘッダ画像は、以下のサイトから使わせていただきました。
https://commons.wikimedia.org/wiki/File:Blue-punch-card-front.png