第5章 FORTRAN、COBOLからの決別

 〜ヒトと機械をつなぐもの
■ 入門用言語と汎用言語の誕生
      BASIC、PL/T
言語
1960年代(2)
1964年〜1966年 
●BASIC〜寛容な入門用言語 ●PL/T〜大規模な汎用言語
●2つの言語の相違点と共通点
BASIC〜寛容な入門用言語 TOP
 BASICは、コンピュータを扱ったことがあれば誰でも一度はその名を聞き、プログラミングに手を染めたことがあれば、誰しも一度はそれを扱ったことのある、名の通り「基本中の基本」とでも言うべき言語である。

■120マイルも離れて
 BASIC(ベーシック)という名称には、当然“基本”という意味も含まれていたが、正式には“Beginner's All-purpose Symbolic Instruction Code”――“初心者向け汎用抽象化命令符号”の略称である。うまい名前を付けたものだ。 当時主流だったバッチシステム※6では、利用者がパンチカードの束を抱えてコンピュータ・センターまで出向き、さらにその処理結果を何時間も、ひどいときには何日も待たなければならなかった。 米ダートマス大学で教鞭を揮っていたジョン・ケメニートーマス・カーツの研究室は、大学のコンピュータ・センターから120マイル(およそ200km)も離れたところにあった。コンピュータを利用するには、何時間も何日もかけてパンチカードを準備し、さらに列車に乗って遥かな道のりを旅しなければならなかったのだ。
 
※6 予めプログラミングされた複数の処理を、まとめて一気に実行させる方法。コンピュータを複数のユーザーに時間配分して使用する。
■気軽に使える環境を
専門家でさえ自由にコンピュータを利用できない環境の中で、ケメニーとカーツは、コンピュータを学んでいない一般の学生にも、もっと簡単にコンピュータが利用できるような環境を望んでいた。 そんな折り、MIT(マサチューセッツ工科大学)でタイム・シェアリング・システムの研究を行っていたジョン・マッカーシーが、カーツに「ダートマス大学でも同じ研究を進めるので参加しないか」と呼びかけた。 “渡りに舟”とはこのことである。コンピュータの能力を時分割し、多数のユーザーが同時に共同利用できるタイム・シェアリング・システムは、まさに彼らの望んでいた仕掛けだったのだ。カーツはさっそくケメニーにこの話を伝え、2人はタイム・シェアリング・システムの研究・開発に参加した。
■コンピュータと会話を
 ケメニーとカーツはまた、“コンピュータと会話する”という夢を抱いていた。 コンピュータの専門でない他の学部の学生が扱うには、現在のシステムはあまりにも難しすぎた。FORTRANやCOBOLのような厳密な書式を要求せず、もっと気楽に、日常使う言葉(当然英語だが)で会話するように機械を動かせたら…と、考えていたのだ。 そして1964年、ケメニーとカーツは学生たちの意見を参考に改良を繰り返し、タイム・シェアリング・システムの端末用言語・BASICを開発した。英単語をベースにした命令をキーボードから入力し、その結果をディスプレイに表示するという、インタープリタ方式※7の会話型言語である。 覚えやすく扱いやすい命令体系を持ち、しかもキーボードからの入力とディスプレイへの表示で、リアルタイムにコンピュータと意思疎通できた。インタープリタとしたことでプログラムの修正が容易になり、簡単な実験もその場で行えた。 何より、英語による人間の問いかけにコンピュータが応答するというインターフェイスは、コンピュータを初めて操作する学生にも抵抗感なく扱えた。BASICによって、コンピュータはまた一歩人間に近づいたのだ。
 
※7 命令行を逐次的に解釈し、機械語に変換して実行する仕組み。
■柔軟で寛容な書式
 初期のBASICはコンパイラ方式※8だったが、コンピュータの性能向上と共に扱いの容易なインタープリタ方式となった※9。 ソースコードは、
 10 INPUT A
 20 C=A*10
 30 PRINT C

といった感じで行単位に区切られる。先頭の数値は行番号で、通常は10刻みとなる。続く文がステートメント(命令文)である。行番号の部分を除いてFORTRANやCOBOLのような厳密な桁位置の決まりはなく、比較的自由な書式とインタープリタ形式のお陰で、気楽に扱えたのである。 “INPUT A”で「キーボードからの入力を受けてその値を変数Aに代入」することを、“PRINT C”で「変数Cの値をディスプレイに表示」することを意味した。命令数は少なく、非常にシンプルで分かりやすい言語体系である。 コンピュータに詳しくないユーザーにもできるだけ簡単に操作できるよう、扱えるデータは文字列と数値のみとされた。文字列の場合は変数名の最後に$記号を付けて区別する。+記号は数値同士なら加算命令、文字列同士なら連結を意味する。 このような柔軟性が言語仕様の随所にあり、ある意味で厳密性を欠く側面もあったが、逆にこの柔軟さ、寛容さがプログラミング初心者に受け入れられ、急速に広まっていったのである。

 
※8 命令行の集合を一括して機械語に変換し、実行形式ファイルを生成する仕組み。
 
※9 インタープリタ形式では逐次的な解釈が必須なため、処理能力の低いコンピュータでは実用的な速度を出せなかった。実行効率の面だけから見れば、コンパイラ方式の方が遥かに有利である。
■寛容過ぎて方言が蔓延
 コンピュータは多くの“普通の人”に使われるべきだと考えていたケメニーとカーツは、BASICをパブリック・ドメイン※10として広く開放した。少しでも多くの人に、コンピュータを扱う機会を与えたかったのである。 BASICの著作権はダートマス大学が所有していたが、それを利用する自由に加え、言語仕様を改変する自由さえ、“多くの人々”に与えてしまったのである。寛容な言語が寛容な扱いを受けて広まった。その結果様々な環境に移植されたまでは良かったのだが、その数だけの方言――異なる仕様のBASICが生まれてしまった。 COBOL同様、現在でも使われ続けている長老級のプログラミング言語だが、BASICにはCODASYLのような開発者の組織もなければ、“標準”と呼べる仕様も存在しない。同じBASICと名乗りながら、実行環境ごとに異なる言語仕様が多数存在するのはこのためである。 特に1980年代に入ってパーソナル・コンピュータ(パソコン)に移植されてからは、同名異体のBASICが無数に登場するようになる。このあたりの事情については、ビル・ゲイツの移植したパソコン用BASICを含め、第10章で取り上げることにする。
 
※10 public domain――不特定多数のユーザーが無料で自由に利用できる配布形態。今で言うフリーウェアに近い。

PL/I〜大規模な汎用言語 TOP
 PL/Iは1965年、IBM社によって開発された。事務計算は言うに及ばず、OSやコンパイラから並列処理の記述まで、実に適用範囲の広い汎用プログラミング言語である。

■プログラミング言語“1番”の気負い
 PL/I(ピー・エル・ワン)の“PL”とは“Programming Language”の頭文字だ。つまりPL/Iとは、「プログラミング言語1番」ということになる。このいささか気負った名前から、相当な意気込みで開発された言語であることがうかがえる。実際PL/Iの開発は、当時としては極めて大規模なプロジェクトで行われた。 PL/Iの生まれた1960年代の半ば頃は、集積回路の登場によってハードウェアが日ごとに発展していった時期だ。それに伴いOSやアプリケーションなどのソフトウェアに対する要求も高度で複雑なものになっていた。 PL/Iの目指したものは、それら高度化する技術と、それに伴って増大する適用業務に対応できる汎用的な開発環境だった。加えて、様々な環境で同じ言語を利用できるようにハードウェア依存性をなくし、プログラム開発の合理化を推進する目的も与えられた。
■書き直すより新しく作れ
 IBM社の開発したFORTRANは改版を重ねてFORTRAN IVとなり、当時最もポピュラーな言語となっていた。そのためPL/Iプロジェクトでは、最初の頃新しい言語を“FORTRAN V”と呼んでいた。FORTRANの仕様を拡張すれば、新しい要求が満たせると考えられていたのだ。既に多数のソフトウェアが開発されているFORTRANの資産を受け継がせるために、上位互換性を持たせる必要もあった。 しかし単なる既存言語の仕様拡張では、「科学技術にも事務にもシステム記述にも使える汎用言語」という贅沢な目的は達成できないとすぐに分かった。書き直すより新しく作った方が早いと判断されたのである。 PL/Iの開発は期限付きだった。同じ時期にIBM社が開発していた新しい構想のコンピュータ、System/360の発表に間に合わせたかったのだ。プロジェクトは急ピッチで新しい言語を作り上げた。 何もないところからまったく新しいものを創り出すのは至難の業だ。PL/Iは、仕様の確立している既存の言語の「良いとこ取り」で生まれた。FORTRANをベースにしながら、それに事務計算に強いCOBOLと、記述性に優れたALGOLの長所を採り入れたのである。
■FORTRANとCOBOLにALGOLを
 PL/Iでは、ALOGOLの築いたブロック構造※11やモジュール化※12などの概念を発展させ、多種のデータ型、式中での異なる型の混在、省略時の暗黙の指定などの仕様を加えて、記述の自由度を増した。さらにFORTRANやCOBOLの欠点でもあった書式の制約も取り払い、記入欄に拘束されないコーディング(記述方法)も可能にした。 コーディングの基本単位は文(statement)であり、文が連続して手続き(procedure)が構成される。 手続きは、
PROCEDURE
  :
END

という形でブロックを構成し、さらにその中に実行可能単位が、

BEGIN
  :
END

という形で記述される。関数の呼出しにはCALL命令を用い、制御を戻すにはRETURN命令を用いる。IF、SELECT、GO TOなどの制御命令で複雑な制御構造※13も記述できた。

 
※11 小さな処理を手続きにまとめてブロック(処理のかたまり)を作り、それを連携させて大きなプログラムを作る構造。
 
※12 プログラムを機能ごとに分割したモジュールとして作成する手法。
 
※13 条件を調べ結果によって分岐する、同じ処理を繰り返すなど、通常の上から下への流れ以外の自在な処理の流れ(制御)を形作る構造。
■COBOLとALGOLの残したもの
 PL/Iの特徴はデータ型にある。 文字列を表すストリング(string)型は“文字の集合”として捉えられ、ストリング型変数同士を+演算子で連結できた。 次元付き集合体型(dimension-aggregate-type)は多次元配列※14や行列を表現する。これはALGOLの配列の概念を押し進めたもののようだ。 中でも、構造体集合型(sturucture-aggregate-type)は特異である。COBOLのレコードの概念を発展させ、複数の異なるデータを1つの型として定義し、さらにその中の個々の要素を個別に参照できる仕組みとした。 例えば以下のように定義すると、
  DECLARE 1 A,
           2 B,
            3 C CHARACTOR(3),
            3 D FIXED DECIMAL(2),
           2 E FIXED DECIMAL(5);

Cで3桁の文字を、Dで2桁の10進数を、BでCとDを合わせた5桁を、AでBの5桁とEの10進数5桁の集合を、それぞれ参照できる(図5-5参照)。個々の要素は、
  階層の深さ 要素名 データ型(桁数)
という形で定義される。データ型と桁数を明らかにされた要素だけが実在し、その上の階層の要素は、個々の要素の集合に対する別名となるのである。

図5-5:PL/Tの構造体集合型

 この仕組みの根底には、ALOGOL60で提唱された構造化の思想も見てとれる。PL/Iと直接のつながりはないが、この「データ型の複合」という発想は、ALGOL60から発展したC言語の構造体(struct)や共用体(union)、Simulaのクラスにも受け継がれ、オブジェクト指向言語へと結実することになる。

 
※14 同じ種類のデータの連続を1つの名前で扱えるようにしたものが“配列”。これを概念として縦横の表のように配置し、“何行目の何列目”という形で多数のデータを効率的に扱えるようにしたものが二次元配列。さらに次元を増やすことで、複雑なデータ構造を表現できる。
■守備範囲の広さとマニュアルの厚さ
 PL/Iは、ハードウェアの垣根はもちろん、言語の守備範囲という垣根まで取り払おうとした。様々な分野のプログラミングを1つの言語に集約できれば、教育から開発工程管理、さらには言語自身の仕様改善まで非常に効率的に進められる。 しかし守備範囲の広さは、逆に大きな欠点も抱え込むことになった。マニュアルが膨大な量になったのだ。そこで、プログラマは必要な機能に関するサブセットの仕様だけを理解していれば、特定分野のプログラムが書けるように工夫された。すべての言語仕様を理解しなければならないというものではなかったのだ。
■実際の普及は1970年代から
図5-6:IBM社製System/360
 また、当初の計画ではSystem/360以外のハードウェアにも対応する様々なPL/Iコンパイラが開発される予定だったが、言語仕様が巨大かつ複雑であったことも原因となり、初期には2種類の、それもあまり質の良くない製品が作られただけだった。 加えてコンパイラのプログラム自体が巨大で処理が遅く、おまけにマニュアルが膨大であったため、このオールマイティーな言語はプログラマに敬遠されてしまった。PL/Iが普及し始めたのは、コンピュータの処理能力がさらに向上した1970年代の中期以降である なお、System/360用のシステム記述言語として、1966年にPL360という言語が開発されているが、これはPL/Iとは別プロジェクトの産物であり、両者にはまったくつながりがない。
 

2つの言語の相違点と共通点 TOP
 1960年代中期に生まれたBASICとPL/Iは、目指した方向こそ異なるものの、どちらもこれまでにない画期的な機能を実現した。

■大学と大企業の違い
 BASICはコンピュータの恩恵をより多くの普通の人たちに分け与えることを、PL/Iは開発環境、ハードウェア、そして守備範囲の垣根を取り払うことを目標に開発され、その夢を果たした。 両者の相違点は、BASICが仕様的には不十分でありながらも扱いの容易さと寛容さゆえに多くのユーザーを獲得したのに対し、初期のPL/Iはマニュアルの膨大さが災いしてあまり広まらなかったことだ。 片や大学教授と学生、片や企業のプロジェクトチームという、開発者たちの置かれた環境の相違も原因の1つだったろう。
■文字列を演算する
 一方、両者には共通点が2つある。1つはベースにFORTRANがあったことだ。これは、当時FORTRANが最もポピュラーな言語であったことから、至極当然と思われる。 もう1つの共通点は、文字列の連結を演算として処理する点である。FORTRANもCOBOLもその機能の中心は“計算”であり、処理の対象は数値だった。文字列は、データとしてあまり重要視されていなかったのだ。その文字列を数値と同じ重さで扱い、演算操作の対象とする発想の言語が、同じ時期に2つまったく別の場所で生まれた。 コンピュータが“メッセージを処理できる機械”であることを、2つの言語が明らかにしたのだ。コンピュータは、高速計算機から脱皮しようとしていた。