第4章 FORTRANを超えて

 〜人間の言葉に近付いたプログラミング
■ 事務言語、論理記述、人工知能
    COBOL、ALGOL、Lisp
言語
1960年代(1)
1960年〜1963年 
●COBOL〜事務用言語の雄 ●ALGOL〜構造化言語の始祖
●Lisp〜人工知能言語 ●高級言語の原点が生まれた1960年代
COBOL〜事務用言語の雄 TOP
 FORTRANの限界を超えるべく開発された言語として、最も有名なのはCOBOLである。事務処理用言語の雄として現在も使われ続けている。コンピュータとは無縁の人たちに、プログラミングの機会を与えた功績は計り知れない。

■実務用言語の必要性
 1950年代の終わりに、米国内各種組織の代表たちによって独立機関CODASYL(COnference on DAta SYstems Language:データシステムズ言語協議会:コダシル)が組織された。その目的は、情報処理技術の研究と新しいプログラミング言語の開発である。 天文学、国勢調査、軍事など国家的な事業で用いられていたコンピュータが民間に広まり、事務計算や人事管理などの目的で使われるようになったのだ。 1959年5月、国防総省はCODASYLで討議された「事務処理計算のためのプログラミング言語」について報告を受け、CODASYLCOBOL委員会を組織する※9。この委員会で制定された言語仕様がCOBOL60である。
 
※9 国防総省とは言っても、ICBMの弾道計算ばかりやっている訳ではない。内部では人事管理、資材管理、給与管理など一般事務計算でてんてこ舞いなのだ。
■国防総省の一声
 COBOL(コボル)は“COmmon Business Oriented Language”(一般実務用言語)の略である。その名が示すように、FORTRANの持つ科学技術用プログラミングの機能では不可能な、一般事務処理のためのプログラムを簡単に書ける言語だった。 COBOL委員会はCOBOL60の仕様をさらに改良し、翌1961年、COBOL61を発表する。このとき国防総省はCOBOLの記述性の高さ、ハードウェアの専門知識を持たなくても習得できる分かりやすさを高く評価し、「COBOLの動かないコンピュータは購入しない」という方針を打ち出した。 東西冷戦の最中、国防総省は新興産業であるコンピュータ業界にとって最大の顧客だ。国防総省に気に入ってもらわなければ、商売が成り立たない。また、国防総省のお墨付きがあれば、他の民間企業に売り込む際に有利だ。様々な機種にCOBOLコンパイラが搭載され始めた。
■すべてをファイルとして処理する
 COBOLは英数字とファイルの扱いが得意な言語である。扱えるデータは英数字のみで、高度な小数点演算や三角関数などの数学的な処理は不得手だ。 数値はBCD(Binary Corded Decimal:2進化10進)で内部表現され、除算の丸め誤差が発生しないようになっていた。整数や小数点以下数桁で収まる金銭など、事務計算のデータに有利だった。 最大の特徴は、テープやディスクに記録されたデータも、その他の入出力データも一様に「ファイルの概念で操作できる点である。入出力も内部の処理も「数値または文字のデータ何桁分か」を示すフィールド※10の集合、即ちレコード※11として捉えることができ、情報はすべてレコードの集合となる。
 
※10 1種類のデータを構成する要素。住所録で言えば、氏名、電話番号、住所など個々の項目に相当する。
 
※11 書式化されたデータ集合内の1件の要素。住所録で言えば1人分のデータに相当する。
■素人に道を開いた言語
 COBOLは、書式化されたカードからの一括入力や帳票出力など、事務分野で多用される入出力形式に強かった。COBOLの扱うデータ形式は「標準データ形式」と呼ばれ、当時事務処理分野に求められていた「大量の定型情報を一括処理する仕組み」として、データベースの概念と深く関わることになる。 様々なデータ型や複雑な入出力の形態をファイルの概念に抽象化させたことで、コンピュータ技術に精通していないユーザーでもプログラムを組めるようになった。COBOLは、コンピュータの素人に情報処理への道を開いた言語である。
■文章のようなソースコード
 COBOLの持つ英単語と英文法にのっとった記述規則は、数学が苦手でFORTRANを扱いにくいと感じていた一般ユーザーを魅了した。例えば、
  N=B+2V/C
という数式は、
  COMPUTE N=B+2V/C

と、そのまま式として記述できるほか、

  DEVIDE V INTO C GIVING X.
  MULTIPLY 2 BY V.
  ADD X TO B GIVING N.

と、文章のように書くことも可能だ。英語を母語とする数学苦手人間には、実にありがたい※12。制御構造に至っては、

  IF ORDER IS GREATER THAN 100
  MULTIPLY DISCOUNT BY PRICE

.と、まさに文章そのものである。 FORTRANに比べて記号性が低く冗長なソースコードとなるが、処理手順を通常の言葉で記述できることには、それ以上の価値があった。特別な教育を受けなくても、一般事務レベルの知識でプログラムを読めたのである。

 
※12 日本語で表わせば「VをCで割って、答えをXに入れよ」「Vを2倍せよ」といった感じになる。分かりやすい!
■4つの部と5つの節
 COBOLのもう1つの特徴は、コンピュータで行わせるべき処理を大きくINDENTIFICATION(見出し)、ENVIRONMENT(環境)、DATA(データ)、PROCEDURE(手続き)の4つの部(DIVISION)に分けた点である。 DATA DIVISIONは、さらにWORKING-STRAGE(作業場所)、FILE(ファイル)、REPORT(報告書)、COMMUNICATION(通信)、LINKAGE(連絡)の5つの節(SECTION)に分かれている。 これによってプログラマは「データ部でファイルや帳票の体裁を決め、手続き部でそれらを実際に操作する」という構成を、スムースに受け入れられる。言語仕様自体が構造化されているのだ。特にデータ部のセクション構成は便利だ。ファイルも帳票も一時的な作業領域も、すべて同じ要領で設計できるのである。 入出力にキーボードとディスプレイが用いられるようになると、SCREEN SECTIONが追加される。これも他のセクションと同じ要領でデザインできた。プログラムの書式全体が構造化されていたため、仕様の拡張にも強かったのだ。
■厳密な書式と柔軟な構造
 COBOLの登場は、FORTARNによって始まったコンピュータの一般利用を加速した。それまで数学的な知識が不可欠だったプログラミングを、一般事務の世界に持ち込んだ功績は大きい。 「科学技術計算のFORTRAN、事務計算のCOBOL」という図式は40年以上経った今でも変わらないが、COBOLの息の長さはFORTRAN以上である。科学技術計算用としては、FORTRANをベースに様々な言語仕様が生まれ、FORTRANはその元祖として存在し続けることになるが、事務処理に向いた言語にCOBOLを超えるものは、いまだ登場していない※13。 FORTRAN同様、COBOLも穿孔カードの時代に生まれた言語なので、ソースコードの書式は厳密である。が、意外にも言語の仕様は柔軟で、データの構造化やオブジェクト指向など新しい技術を次々と採り入れて拡張・改良され、40年以上の歳月を見事に生き延びている※14。
 
※13 本書では触れていないが、1970年代に登場したデータベース処理用の言語もすべてCOBOLの思想を受け継いでいる。COBOLを超える言語は、いわゆる“自然言語処理システム”以外にない。
 
※14 10年ばかり前まで、「プログラマの集団に石を投げれば、COBOLプログラマに当たる」と言われたほどだった。が、最近ではVBプログラマに当たるらしい。筆者の独断だが、3年後にはJavaプログラマに当たると思う。

ALGOL〜構造化言語の始祖 TOP
 ALGOLは“ALGOristic Language”から命名された。その名が示すように、アルゴリズムを明快に記述する目的で開発された。手続き型言語※15の始祖と呼べる言語である。ALGOLによって、コンピュータはさらに一歩、人間に歩み寄り始めた。

※15 Pascal、C言語などのように、小さな処理(手続き)を組み合わせてプログラムを構成する言語。

■自動プログラム
 FORTRANに代表される初期のプログラミング言語は、コンピュータに数学的な計算を行わせるには最適だった。が、コンピュータの処理能力が向上するにつれ、コンピュータに求めるものは単なる計算の解から、それを含めた“問題の解決”へと変化し始めていた。 1950年代の終わり頃、ヨーロッパでは、コンピュータに扱わせる問題をアルゴリズムとして記述する手法が研究されていた。「機械の制御手順はコンピュータに任せ、人間は“問題の解決手順”を考えればいい」という発想のこの手法は、“自動プログラム”と呼ばれた。 やがて米国でも同じ目的を研究する組織が作られ、米欧の研究組織が合体してI.A.L.(International Algebraic Laguage)委員会が組織された。ここで生まれたプログラミング言語I.A.L.が後にALGOL58と呼ばれることになる。
■論理を記述する言語
 アルゴリズム(aligorism)は代数学的に“算法”などと訳されるが、プログラミングでは“問題解決の手順または手法”という意味合いになる。 問題を解決する手順をプログラムとしてコード化するということは、アルゴリズムを明快に記述するということにほかならない。そのためには分類・整理された現実の事象とそれらに対する扱い方を、個別の処理単位としてくくることができなければならない。これを、プログラムの“構造化”という。 ところがFORTRANでは、IFやGOTOなどの制御命令が単に機械語のニモニック(個々の命令)に英単語を当てはめただけであったため、複雑な論理を組み立てるには難があった。また、ハードウェアごとに異なる仕様のFORTRAN処理系が存在することも問題だった。 自動プログラムでは、プログラミングは単なる数値の計算手順ではなく、問題解決のための論理を組み立てる作業となる。処理構造を明快に記述するためには、開発環境の差異――方言が大きな障害となってしまうのだ。 1958年、FORTRANにはできないプログラムの構造化と、言語仕様の統一を目指して、I.A.L.は生まれた
■抽象性と構造化
 FORTRANが英大文字のみを扱ったのに対し、I.A.L.では大文字と小文字の混在が許された。これによって識別名がより冗長性を増し、処理対象を抽象的に表現できるようになる。 また、FORTARNは文番号を基準にして処理の流れを制御したが、I.A.L.ではProcedure(プロシージャ:手続き)単位にまとめられて独立した処理を基準に、制御構造を記述できた。この2点がI.A.L.の大きな特徴である。 特にProcedureの概念は非常に重要だ。Procedureには処理を構成する小さなプログラムが手続きとして記述され、プログラム全体は複数のProcedureを呼び出す形で処理を進める。つまり、手続きから手続きを呼び出す入れ子構造が記述できたのである。 また、begin〜end構文によって複数の文をくくり、Procedureの中にさらに小さな処理単位を構成することもできた。 後にALGOL58と改称されたI.A.L.は、それ以降も様々な意見を採り入れて改良され、1960年、ALGOL60となる。 以下は、ALGOL60による平方根を求めるプログラムである※16。
real procedure SquareRoot(x);
value x; real x;
begin
 SquareRoot:= 0.0;
 if x >  0.0 then
  begin real y, z;
   y:= 1.0;
loop: z:= y;
   y:=(x/z+z)/2.0
   if abs(y*y-x)≧0.00001 then
    go to loop;
   SquareRoot:=y
  end
 else if x<0.0 then outstring(6, 'argument error.')
end SquareRoot
※16 「岩波情報科学辞典」岩波書店 1990より一部抜粋。
■論理を明快に
 ALGOL60の報告書の中に、「同じ手続き名がそれ以外に現れたときは、すべてその手続きの発動を意味する※17」という一文がある。 これは非常に遠まわしに、「手続きの再帰呼び出し※18が可能である」ことを述べたものだ。ある手続きがその処理の中で自分自身を呼び出せるのである。これによって、階乗やアッカーマン関数※19などのアルゴリズムが、非常に明快に記述できるようになった。 上記のような遠まわしな表現で、それも1行記されているだけであることから、I.A.L.委員会では再帰の概念をさほど重要視していなかったようだ。が、再帰はプログラミング手法として非常に重要な概念である。 このほかALGOLでは、数値型や文字型とは異なる新たなデータ型として論理型(Boolean)が設けられるなど、論理を明快に記述するための工夫に満ちていた。 手続きによる構造化、再帰呼出し、論理型――これらの概念は、やがて時を経てPascalやC言語に受け継がれていくことになる。ALGOLは、手続き型構造化言語の原点なのだ。
 
※17 「岩波講座 情報科学-1 情報科学の歩み」 高橋秀俊著 岩波書店 1983より抜粋。
 
※18 ある手続きの中で、自分自身を呼び出して処理の入れ子構造を形作ること。
 
※19 自動車が旋回する際の左右前輪の切れ角の違いを計算するための関数。再帰呼出しの例題としてよく取り上げられる。

Lisp〜人工知能言語 TOP
 Lispは“List Processor”の略称だ。その名の通り、リスト処理を行うための言語として、人工知能・オートマトンの研究をしていたMIT(マサチューセッツ工科大学)のジョン・マッカーシー教授と学生たちによって、1962年に開発された。

■括弧だらけの不思議な言語
 人工知能の研究は、コンピュータの登場とほぼ同時期に始まっている。コンピュータは“高速計算機”として世に登場したが、同じ頃“人間の思考を肩代わりする装置”として、アラン・チューリングの理論※20に基づいた研究が行われていた。 マッカーシーたちが当初目指していたのは、アドバイス・テイカー(Advice Taker)という「与えられた命題からより良い解法を導き出すために、事実とコマンドの両方を同じレベルで扱う」システムで、コンピュータの“命令を解釈し実行する”機能に応用されるものだった。 こうして出来上がった言語は、あらゆる事象を関数として記述するという一風変わった仕組みとなった。( )を多用し、関数定義の中で別の関数の定義が行われたり、関数の戻り値が別の関数の引数として直接使われたりする。 この仕組みによって、事象を分析・整理しリスト化して扱えられるようになり、定理の証明やパターン認識などに応用できた。以後Lisp(リスプ)は、人工知能言語としてその名を馳せることになる。
 
※20 「計算し得る数について、決定問題への応用」という題の論文。有名な仮想計算装置「チューリング・マシン」が定義されている。チューリングについては、第6章で取り上げる。
■一目見てLispと分かる

 Lispのソースはすべて関数定義であり、一目見てLispだと分かるほど特徴的だ。例えば、

  もし リストが0 だったら 項目数は0
  そうでなければ 項目数は1とし
  さらに リストの残りに項目数を加える

という論理をLispのソースにすると、

(DEFINE (LENGTH L)
      (COND ((NULL) 0)
          (T(ADD1(LNGTH(CDR L))))
                           ))

のようになる。 Lispでは、データとプログラムが同一の形式で表現される。すべての処理を関数の呼出しで行い、関数定義の中に関数呼出しが存在するため、データはプログラムの一部となり、プログラムはデータとなるのである。 従ってソースは( )だらけとなる。処理レベルを意識した字下げと文末の“)”の並びがLispのソースの大きな特徴だ。


高級言語の原点が生まれた1960年代 TOP
 1960年代前半に仕様が確立した3つの言語の特徴を見てきた。どれも、次の時代に生まれる高級言語の土台となった言語だ。

■FORTRANを超えて
 COBOLはFORTRANの対象としていなかった事務分野のユーザーを意識して、ALGOLはFORTRANでは不可能だったプログラムの構造化を目指して、それぞれ開発された。 Lispを除く2つの言語は、どちらもFORTRANの欠点を克服、あるいはそれの対象としていなかった機能を実現する目的で生まれ、改良されていったのである。 後にLispもALGOL60と結びつき、Lisp2からScheme(スキーム)へと発展している。また、次章で取り上げるBASICも、FORTRANのような専門的な言語を学ぶ前段階の入門用として利用されることになる。
■進歩と欲求から新たな言語へ
 1950年代後半のプログラミング手段は、実質的にFORTRANがすべてだった。1960年代に入りハードウェアの能力が向上してくると、様々な立場の人々がコンピュータを使い始めるようになる。機能の進歩と人間の欲求の増大が、この時期に新たな言語を多数生み出したのである。 これ以降、さらに多数の高級言語が生まれることになるのだが、その原点はFORTRANとそれを元にして生まれた1960年代前半の言語にある。 1960年代の後半には、ALGOLを祖とし、後にPascalやC言語へと発展していくALGOL68とPL/Iが誕生する。出自は同じであったにもかかわらず、この2つの言語はまったく違う運命をたどることになる。