1980年代のプログラム言語「超概論」

 この文章は、筆者が本格的にプログラミングの勉強を始めた 学生時代(1982〜4年ごろ)に「比較言語論」に興味を持って 自分なりにまとめた手書きメモが元になっています。 その後、特に何に使うという目的も無く、単にTeXを使う練習として 1990年に電子テキストに直していたのですが、 今回、それをHTMLで書き直して説明文も多少書き改め、 最近の動向も若干補記してみました。
 当時は「オブジェクト指向」などというキーワードに乗って C++やDelphiなどが流行し出す直前で、 AWK・Perl・Javaなどというスクリプト系言語もマイナーでした。 それゆえ、少々古臭い内容になっていますが、 プログラム言語というものの流れを、 わりとコンパクトにまとめることができたと思っています。
 なお、元の手書きメモでは、LISP・Prologといった非手続き型言語にも 簡単に言及していたのですが、自分としてあまりにも自信が無いため、 TeX化の時点で削除しています。

アセンブリ(assembly)

 機械語のプログラムに1対1に対応する言語。 当然対象の機械によって言語体系は違ってくるし、 アセンブラ(assembler : アセンブリを 機械語に翻訳するプログラム)の性能によっても違ってくる。 広義には単にニーモニック(本来2進数でしかない機械語命令を、 その意味を容易に連想できるような文字列に置き換えたもの) を変換するだけのものもアセンブラと呼ぶが、 狭義には「ラベル」の使用を許すものでなければならない。
 機械語のプログラムでは、番地(address)が必須である。 番地とはメモリの中の場所を識別するのに用いる数値データのことで、 その場所がデータを格納する場所であれば「変数」であるし、 プログラム自身の別の部分であれば、 次にどの命令を実行するかという実行制御のための行き先となる。
 番地を指定する場合は、基準番地または現在位置からの変位を用いる。 従って、機械語命令等が間にいくつあるかを数えなければ番地が決定できない。 その結果、例えばプログラムの加除訂正をした場合には、 直接無関係な前後の部分についても、 数え直して番地を書き換えることが要求される。 このような作業を人間が行おうとすると、 かなりの労力を要する上、間違え易い。
 そこで「ラベル」というものが考え出された。 これは、参照したい部分に名前を付けておけば、 アセンブラが翻訳時に参照している部分と参照される部分の位置関係を数えて、 番地を指定するための変位を自動的に算出してくれるという仕掛けである。
 更に高性能のアセンブラではマクロ(macro)命令が使用できる。 これは、よく使う動作パターンに名前を付けて登録しておけば、 以後その名前を書くだけで、 アセンブラが自動的に登録簿から書き写してくれるというものである。 このようなアセンブラをマクロアセンブラという。
 なお、言語名としてはアセンブリと呼ぶべきだが、 後述する「コンパイラ言語」の対義語である 「アセンブラ言語」という表現の方がよく使われる。

初期の高級言語

 高級言語とは、機械語のプログラムとは1対1に対応しない、 人間にとって解りやすい形のプログラム言語のことである。
 高級言語で書かれたプログラム(原始プログラム source program)を 機械語のプログラム(目的プログラム object program)に翻訳するには、 人間が理解しやすい形で記述された「処理内容」を 機械が実際に行う具体的な「処理手順」に直すという、 アセンブラよりも高度な処理が必要となる。
 高級言語を機械語に翻訳するプログラムのことを 「コンパイラ(compiler)」と呼び、 高級言語のことをコンパイラで処理する言語という意味で 「コンパイラ言語」と呼ぶこともある。

FORTRAN (formula translation : 1954)

 高級言語第1弾。目玉商品はその名の通り数式翻訳機能、 即ち、原始プログラムとして見なれた形の数式を書くだけで、 コンパイラが具体的な処理手順を判断して、 目的プログラムを発生するという機能である。
 また、入出力、変数の割り当て(具体的にメモリのどこに変数をおくか)、 動作制御などを機種に依存しない形に整理したので、 ある機種用のプログラムを簡単に他の機種用に移植できるようになった。 しかし、初期のものということもあって、 概してプログラミング上の発想(特に命令の実行順序を 制御する方法)が機械語に近い。

algol (algolithmic language : 1959)

 FORTRANが初期の実際のIBMの計算機を意識して作られているのに対して、 これは特にどの機種に使うことも仮定していない アルゴリズム(algolithm : 処理手順)記述言語である。 従って実際の計算に使われることは比較的少なかったものの、 その後のプログラミング言語論の発展の土台となった。

COBOL (common business oriented language : 1959)

 FORTRANやalgolが科学技術計算、 即ち数値データの演算処理に重点を置いているのに対し、 これは大量のデータを事務的に処理することに主眼がある。 従って計算は苦手だが、扱うデータの構造 (特に入出力の単位としてのまとまり)が明確に意識されている。 また、異機種間の互換性にも重点をおいて設計されている。
 COBOLのプログラムはdocumentality(文書性)が高いと言われる。 即ち、プログラムを英語の通常の文書として読んでも、 大体の内容が理解できるような文法になっている。 これは優秀なキーパンチャーを傭する社会集団を対象としているゆゑ 可能なことであったとも言えよう。

Basic (beginner's all-purpose symbolic instruction code : 1964)
この言語の名前は、略語を先に作って、後から正式名称をこじつけた典型例である。

 FORTRANやCOBOLがバッチ(batch)処理(依頼された仕事を 溜めておいて順に実行していく処理方式)を 前提に作られているのに対して、この言語は online処理(依頼された仕事を即時実行する処理方式)、 特にTSS(time shearing system : 人間と計算機の反応時間差を 利用して、複数の人間で1つの計算機を共有するonline処理システム)による 会話処理(計算機の出す応答メッセージに応じて段階的に 仕事を指示していくonline処理方式)を前提に作られた言語である。
 従って、Basicの文法は、コンパイラではなく インタプリタ(interpreter : 原始プログラムを 1文ずつ読んで解釈実行するプログラム)で 処理することを前提に設計されている。
 インタプリタはコンパイラでの処理に比べると、実行速度は圧倒的に遅いが、 デバッグ(debug : bug(虫 : プログラムの誤りのこと)を 除く作業)や修正再実行などプログラム開発のための操作 ということを考えたとき、計算機の負担も少なく、操作も単純である。
 また、マニュアル操作(完成したプログラムを作らずに、 1文ずつインタプリタに与えて実行させる操作方法)を利用して 簡単なO.S.(operating system : 計算機の動作を 制御するプログラムで、利用者側から見れば計算機の一部と 考えられるようなもの)の機能を組み込むことができるので、 黎明期のパソコンにおける標準言語とされるに至った。
余談:インタプリタとは「通訳」という意味である。 コラムの類で、コンピュータの世界には「通訳」は居るけど 「翻訳者」は居ないという軽口が叩かれることがある。 しかし、実は「アセンブラ」と「コンパイラ」を総称して 「トランスレータ(translator=翻訳者)」と呼ぶのである。

PL/I (programming language one : 1964)

 FORTRAN、COBOL、algolの良い所だけ寄せ集めるという 方針に基づいて作られた欲張り言語。 長所はまず、何でもできて、なおかつ暗黙宣言や標準動作の機能が豊富で、 初心者でも比較的容易に扱えることであろう。 また、algol系言語の「構造化可能」という特徴も受け継いでいる。
 短所はといえば、何でもできすぎることから来る 次のようなことが挙げられる。
  1. 変な機能が多数有り、間違いの元となる。 例えば、他の言語ならsyntax error(文法違反)になるところを、 とんでもない意味に解釈してしまうことがある。
  2. 言語体系が大きくなり過ぎて、コンパイラの負担が大きく、 高性能の計算機でないと持て余すし、どうしてもコンパイラのバグが多くなる。 また、マニュアル体系が大きくなりすぎて、充分な習得が容易でない。
 1980年ごろ、欠点の多いFORTRANに替わるものとして 持てはやされた時期があるが、FORTRAN77の普及と共に ブームも去ってしまった。

プログラミング言語論の産物

Pascal (略語ではない : 1968)

 algol系言語の1つで、次のような特徴がある。
  1. algol系言語の特徴である構造化(アルゴリズムの 階層構造を意識した書き方をすること)という考え方を徹底して、 構造化していないプログラムは実際上書けないような言語仕様になっている。 これには幾分教育的な目的もあるが、コンパイラの負担を軽くする効果も大きい。
  2. データ型の概念を整理し、読み易いプログラムを書けるように工夫している。
  3. その他、旧来の高級言語によくある機能でも、 効率(翻訳効率・実行効率)と読み易さの意味で 問題のあるものは容赦なく切り捨てている。
 Pascalのその後の発展としては、 モジュール(module : プログラム中に現れる 動作パターンを取り出してひとまとまりとし、単独に翻訳できるように したもの)別開発を意識したModula(1976)や、 大規模なシステム開発(主に軍事目的)での 信頼性の高い統一言語仕様を目指したAda(1980)等が著名である。

C (Bという言語の改良版だからC : 1972)

 algol系言語の1つで、システム記述(計算機自体の動作を 制御する基本的なプログラムを記述すること)の為に 用いることを目的に設計されたものであり、次のような特徴がある。
  1. モジュール別開発を前提に設計されている。
  2. 1文字の文字データを、その文字の文字コードを値とする 数値データとしても扱うことができる。 これは、機械語やアセンブリの記述では当然の概念であるし、 システム記述には不可欠の機能である。 しかし、通常の高級言語では「文字であると同時に数値」 という二面性のあるデータの存在は許していない (必要な場合は、明示的に変換するよう要求される)し、 このような小さな値しか扱えない(通常255以下の非負整数しか 表わせない)データ種別を用意することもない。
  3. ポインタ(pointer : 番地を値とするデータ)操作を 明示的に(機械語に密着した形で)できる。 これにより計算機で行える仕事は大概何でも記述できる。 その反面、ちょっとした間違いで何が起こるか分からないという 危険性も併せ持つ。
  4. 次のような特徴的な演算子が多数あり、記述性が非常に良い。
    1. ビットパターンを扱う演算子(データの内部表現に依存するので 普通の高級言語では無いか曖昧であることが多いが、システム記述には不可欠)
    2. ビット演算と厳密に区別された論理演算子(PL/IやパソコンBasicでは ビット演算と論理演算がゴッチャになっていて間違え易い面がある)
    3. 代入演算子(変数の内容に簡単な演算を施して元の変数に 代入する演算子 : 効率と見易さ(間違えにくさ)を同時に向上させる) FORTRANでは、複雑な数式を処理できるようにすることに主眼があったためか、 単純に「COUNTERに5を加える」だけの操作でも 「COUNTER = COUNTER + 5」と「COUNTER」を2回書く必要がある。 algolもBasicもPascalもPL/Iもこの点はFORTRANを継承している。 これがCでは「COUNTER += 5」と表現できる。 Cの流れをくむ以外の手続き型言語でこの表現ができるのは、 COBOLの「ADD 5 TO COUNTER」くらいしか無い。 Cのこの書式はアセンブリ的な発想に基づくものと思われるが、 結果的には自然言語に近い素直な表現が実現されている。
  5. プリプロセッサ(preprocessor : コンパイラの 翻訳に先立って、原始プログラム自体に文字列置換等の処理を 施すプログラム)の規格がしっかり定められている。 これをうまく利用すると、計算機に依存する部分に かなり立ち入ったプログラムでも移植性を高めることができる。 また、プログラムの見易さのためにも有効利用が図れる。

FORTRAN77 (1977年版FORTRANの意 : 1978)

 プログラミング言語論の進展に連れ、 FORTRANの欠点がいろいろと目についてきたが、 一方ではソフトウェア(software(紙物) : 計算機自体を意味するハードウェア(hardware(金物))に対して 計算機に載せるプログラムを利用すべき資源とみていう言葉。 利用者作成のプログラムも一度作ったものを後日また利用するという場合には 私用ライブラリと呼ばれる一種のソフトウェアである。 紙に書いたプログラムも、そのまま入力すれば使えるという意味で 広い意味のソフトウェアに入る。)が FORTRAN用に揃ってしまっていて容易に変えられないという事実があり、 その矛盾はひとつの大きな問題になってきた。
 これに対する解答として出されたものがこのFORTRAN77で、 algol系言語(特にPL/I)にみられる良い機能で FORTRANの根本を変えることなく取り入れ得るものを組み込んだものである。
 このFORTRAN77も、まだ不充分だということで、 更に発展させたものが計画された。 当初FORTRAN8X(‘X’というのは何年に公表できるかわからないという意味) と呼ばれていたが、最終的には1991年に「FORTRAN90」となり、 実用的に使えるようになったのは1995年ごろである。 一応、FORTRANの継承と銘打っていて、 確かに初期のFORTRAN以来の数式表現などは保持されているが、 全般的にはかなり大胆な改変が加えられていて、 昔のFORTRANとは随分雰囲気の違ったものになっている。

参考:ratforのこと

 ratforとは「rational FORTRAN(合理的なFORTRAN)」の意味で、 FORTRAN77以前に「構造化プログラミングができるFORTRAN」を作ろう という目的で開発されたものであるらしい。
 ratforの開発者はC言語で記述されたシステムの利用者が主であった こともあり、ratforのプログラムはCとFORTRANの合いの子のような 雰囲気である(筆者は詳細を知らない)。それに較べれば、 FORTRAN77の見掛けは伝統的なFORTRANそのものだと言える。
 FORTRAN77はratforを通じてC言語の影響を受けているという見解がある。 確かに開発経緯から言えばそうかもしれないが、 FORTRAN77には「C言語的」なものは何も残っていない。 あるのは「C言語も含めたalgol系言語全体に共通の発想」だけである。

構造化Basic (1988ごろ)

 FORTRANがFORTRAN77→FORTRAN90と変化するようになった事情は Basicでも同様である。即ち、パソコンが高性能化して、 Basicに組込まれたO.S.ではない本格的なO.S.が普及する一方で、 Basicに慣れたユーザは相変わらず多いという状況を前提に、 その状況に対応した新しいBasicが作られるようになった。
 即ち、個々の処理文の記述文法は基本的に伝統的なBasicを踏襲する一方で、 それを並べてプログラムを作り上げる部分の言語仕様は、 構造化プログラミングやモジュール別開発を伴うコンパイラ処理を前提とした ものに変化させたわけである。
 Basicでは、FORTRANのような新しい統一規格が作られないまま、 メーカー主導で各々の独自仕様でこのような拡張が行われ、 それが淘汰して事実標準ができるという形で変化が進んでいる。



2000年11月13日WWW公開用初稿/2001年12月1日最終改訂/2014年1月23日ホスト移転

戸田孝の雑学資料室へ戻る

Copyright © 2000 by TODA, Takashi