本日も出張仕事。内容は大したことが無いのですけど、先方の企業の特定の場所には入るわけで、とても緊張します。確認項目の数だけは多く、へとへとになって帰社。やることやって退社のタイムカードを刻印して、と。
なんだか懐かしくなったので、いわゆる四方山話を。
私はFORTRANを至高とするFORTRAN MANの一人と思っているので、本来はC言語などくそ食らえ、なのですが、現在の主流で、ものすごく優秀なコンパイラがあって、解説書が充実しているので、初心者にC言語以外を推奨するなんてとんでもないです。
米国らしく、たたき上げ言語なので強いです。特にC++というC言語のオブジェクト指向方向の拡張は今でも要チェックと思います。計算機言語に興味のある方は、これの最初の段階を踏んでいないと話になりません。
初期の計算機言語と言えば、FORTRAN、LISP、COBOL、ALGOLと並びます。前3者は生き残っていて、ALGOLには後続のPASCALという、歴史的に重要な計算機言語があります。
ALGOLは1960年頃にまとめられたらしく、その名の通りアルゴリズムを記述するための形式美を誇っていた、…はずです。手元の1974年の日本語の資料にはJIS規格の解説があって、およそ計算機言語がどんなものかを知っている人はいきなり読んでも意味が分かるはずです。
で、その資料にはあまり効率が良くない、と書かれていて、なのにその原因が書かれていません。私もALGOLは使ったことが無いので類推になってしまいますが、多分、名前呼び出しの機能のためだと思います。
計算機言語の関数の変数(引数)には値呼び出しと参照呼び出しの2方式があって、C言語では値呼び出しだけで、参照はポインタの値渡しになります。細かい話で、初心者には関係ないです。呼び出された方で変数に代入しても、元の変数の値が変わらないのが値呼び出し、変わってしまうのが参照呼び出しで、値呼び出しが基本で、後者は変化して欲しいときにあえて使います。
ALGOLには名前呼び出しと呼ばれる第3の呼び出し方式があります。現在の観点で言うと、いわゆるマクロです。本格的なマクロは今はCommon LISPにあって、「`」「,」「,@」が使えたら一人前です。C言語では#define、C++ではテンプレートに相当します。
マクロは二段階評価で、簡単に言うと、数式を変形するプログラムを実行してから、その数式を計算します。ものすごく強力で、しかし、プログラムの一部をプログラムが自分で書き換えることに相当しますから、下手をすると動きが予想できないプログラムが書けてしまいます。しかも効率が悪い。なので、ALGOL流の名前呼び出しは不評でした、…のはずです。残念なことに、手持ちの資料では追跡できませんでした。
そこで、実行時の効率を損なうこと無く、形式美も備えた言語として設計されたのがPASCALです。名前呼び出しはありません。
いわゆる構造化プログラミングを広めた言語で、しかし、本来のPASCALは文字列処理がやや窮屈で、文字列を改良したturbo PASCALというのが実際には使われました。turbo PASCALは本来のPASCALとは別言語だ、という意見があって、しかし数値計算部分は同じです。私が使ったのもturbo PASCALの方。
結局、WindowsがC言語を主力としてしまい、UNIXはもともとC言語が主流でしたし、組み込み系もC言語に収束していったと思います。なので、お行儀が良く特色の無いのが特色のPASCALは廃れてしまいました。
あくまで私の意見ですが、設計者のその後の動きを見ても分かるように、PASCALには足りない点があって、結構致命的です。C言語なら力業で解決しますが、見栄えは良くありません。