第3章 半導体時代

 〜機械の言葉から人間の言葉へ
■ 高級言語の誕生〜FORTRAN、APL
言語
1950年代(2)
1955年〜1959年 
●FORTRAN〜元祖にして現役の高級言語 ●APL〜記号で機械と対話する
●FORTRANとAPLのたどった運命 ●OSの誕生
FORTRAN〜元祖にして現役の高級言語 TOP
 コンピュータの普及と共に登場したFORTRANは、最も息の長いプログラミング言語だ。度重なる改編を経て現在まで第一線で活躍し続けている。

■FORTRAN以前
 FORTRAN(フォートラン)以前にも、人間の言葉に近いソースコードを記述できる高級言語はいくつかあった。名の残っているものに、J.マーキュリーが提案しレミントンランド社が1950年に実用化したShortCode(ショート・コード)がある。次に代表的なものが、1953年にIBM701コンピュータ用として開発されたSpeedcording(スピードコーディング)だ。 以下は、参考文献(8)に掲載されていたSpeedcordingのソースコード表記の一例である。
 
[523 SUBAB 100 200 300 TRPL 500] 

最初の523は命令の存在するアドレスで、具体的な処理は、

  1. 100番地の値から200番地の値を減じ、その結果を300番地にセットする
  2. 300番地の符号を調べ、結果が正なら500番地に制御を移す

という、加算・代入と条件分岐命令となっている。SUBABが減算と代入の命令、TRPLが条件判断と分岐の命令だ。 機械語っぽい具体的な番地指定が残っているものの、“SUBAB 100 200 300”、“300 TRPL”といった書き方からも分かるように、数学的な解法を意識した文法が採用されていた。 Speedcordingはインタープリタ方式※18の処理系で310個の機械語から構成され、701コンピュータの主記憶容量の30%を占めていたといわれている。

※18 ソースコードを一気に機械語に変換するコンパイラ方式に対して、ソースコードを1行ずつ読み込んでは逐次的に機械語に変換する方式。
■数式を分かりやすく
 続いて登場したのが、IBM704コンピュータ用のPACT Iというコンパイラ型言語である。コンパイルすることによって複数パスの処理が可能となり、作業領域、サブルーチン領域などコードとデータの領域をメモリ上に自動的に割り付けることができた。現代の高級言語コンパイラに受け継がれている手法である。 しかしPACT Iの言語構造はアセンブラに近く、高度な抽象化を行うことはできなかった。 1953年、マサチューセッツ工科大学(MIT)でJ.H.ラニングJr.らが、通常の数式に似た形で計算式を書けるシステムを開発した。1954年、J.バッカス※19をはじめとするIBM社の開発チームはこれにPACT Iの技術を注ぎ込み、FORTRANの開発を始めた。704コンピュータ上でFORTRANコンパイラが使えるようになったのは、1957年のことである。 FORTRANは、FORmula TRANslation――つまり“数式変換”という語を短縮したものだ。この名前からも分かるように、数式を分かりやすく記述するために考案された言語である。
  X=Y−80
といった一般的に見慣れた数式が使えた。
※19 バッカスはFORTRAN開発の功績を認められ、1987年に国家科学勲章を受章している。
■穿孔カードとFORTRANの書式
図3-4:穿孔カードと穿孔機
 FORTRAN登場当時の入力デバイスは穿孔カードだった。穿孔カードは180mm×85mm程度の大きさで80桁の列が設けてあり、各桁ごとに孔の開け方で数字や記号を入力できるようになっている。カード1枚で1行分しか入力できないため、大規模なプログラムでは何千枚ものカードを読み込ませなければならなかった。  
図3-5:FORTRANのソースコード入力用フォーマット

穿孔カードには左から順に1から始まる桁番号が打たれており、1つの番号が1バイト文字1桁に相当する。FORTRANの命令は1行単位のステートメントで記述され、図3-5のように先頭の5桁にステートメント番号、6桁目には直前の行からの継続を示す記号(1行が80桁を超える場合に使用)、7桁目から実際のステートメントが始まる。 ソースコードは、

  XAPP=-2.0
  K=1
5  XIMP=(XAPP*COS(XAPP)-
   SIN(XAPP)+1.0)/(COS(XAPP)-1.0)
  WRITE(5,100) K,XIMP
    :

といった感じになる(…は画面の都合上折り返しているマークです)。 FORTRANは現在でも使われており、情報処理技術者試験にも登場していたのでご存じの方も多いだろう。現在ではキーボードで入力したソースコードをディスプレイで確認できるが、FORTRANの書式は登場当時の穿孔カードの仕様に基づいているのである。 =による代入、四則演算、( )による優先順位の指定、SIN、COSといった三角関数など、一般的な数学の記法がそのまま利用できる。このほか、配列、IF〜ELSE IF〜ELSEによる条件判断、GOTOによる分岐※20、サブルーチンの呼び出しと復帰、ファイル入出力など、高度な抽象化が実現されていた。

  
 ※20 通常ソースコードは上から下へと実行されていくが、GOTO〜という形で次に実行される行を任意に指定できる。
■FORTRANの恩恵
 FORTRANが開発された本当の理由は、機械語あるいはアセンブリ言語など“生の言語”によるプログラミングでは、手間と経費がかかり過ぎて効率が上がらない――ということだった。 「プログラマが数学(で用いる数式)のような簡潔な言語を使って数値計算の手続きを指定できるように、そしてその指定から手続きを実行する効率の良いプログラムが自動的に得られるようにする」※21ことが目的だったのだ。開発者らは、これによって「プログラミングに要する作業量が1/5以下になるだろう」と述べている。 FORTRANはまた、“移植性”※22という恩恵ももたらせた。現在でも汎用機※23の作業環境は製品ごとに異なっているが、当時の機種間の相違はそれ以上で、機械が違えば全然別世界だった。機械語はもちろん、アセンブリ言語でも共通性などまったくなかったのだ。 そんな中、FORTRANコンパイラさえ動けば、異なるコンピュータでも同じプログラムが使えたのである。これは画期的なことだった。 加えて、数学を理解できればFORTRANの書式もある程度理解できたため、FORTRANの登場によってコンピュータのユーザー層が広まった。日々膨大な計算をこなさなければならない研究者たちが、FORTRANを、つまりコンピュータを使い始めたのだ※24。
 ※21 参考文献(6)より。()内は著者による補足。
 
※22 あるコンピュータで動作するプログラムを、別のコンピュータ用に書き換える作業。
 
※23 銀行のオンラインシステムなどに用いられる大型のコンピュータ。英語ではメインフレーム(main frame)。
 
※24 人類初の月着陸を果たした1969年のアポロ11号でも、FORTRANで書かれたプログラムが着陸船を制御した。

APL〜記号で機械と対話する TOP
 FORTRANと同じ時代に生まれた言語にAPLがある。“言語”と呼ぶにはあまりに特異な仕様で、FORTRANのように万人を魅了することはできなかったが、今でも熱心なファンを持っている。

■記号の羅列で対話する
表3-1:APLで用いられる記号。
通常のキーボードでは入力できないものが多い
+ × ← [ ] , . /”  ̄ < ≦ = ≧ > ≠ ∨ ∧ − ÷? ω ε ρ 〜 ↑ ↓ ∫ ◯ ★ →α 「 L _ ▽ △ ・ ’ □ ( )⊂ ⊃ ∩ ∪ ⊥ T | ; : \

 APL(エーピーエル)は元々“表記法”として考案された“アイバーソン言語”から発展していったため、非常に記号性が強く“言語”のイメージからは遠い。むしろ“アルゴリズム※25の表現手法”といった感じである。 APLでは、ソースコードに表3-1に示すような記号を用いる。一瞥すれば気付くように、これらの中には通常のコンピュータ用キーボードには存在しない記号が多数含まれている。JISの2バイトコードでは表示可能だが、当然当時のコンピュータでは日本語入力などできない。APLを扱うには、これらの記号を入力できる専用のAPLキーボードが必要だったのだ。通常の英語キーボードを用いる場合はASCIIコードで代用させることもできたが、非常に非効率的だったことは想像に難くない。 APL処理系はコンパイラでもインタープリタでもない。対話型のプログラムである。キーボードから先に掲げた記号を用いた数式を入力すると、その答えがコンソール(ディスプレイ画面)に表示される。

※25 ある処理を実現するための論理的な計算手順。日本語では“算法”と訳される。
■キーボードとコンソールによる会話
 APLとの対話例を簡単に紹介しておこう。APLがキーボードから入力を受け付けるとき、コンソールには6個のスペースが出力される。
5+3

   と入力すると、

と答えが表示される。対話は以下のように続く。

   12÷3

   (8+3)×6
66
   N←3×6
   N
18
     : 

まるで、パソコンのBASICインタープリタ※26のようだ。しかし、まだこの時代にはキーボードもディスプレイも実用化されていない。入力はパンチカードや穿孔テープ、出力は穿孔テープが標準だった。 APLの原理は1956年に“アルゴリズムを簡潔に記述する記述法”として考え出されたものであり、APLという名前で対話型言語として登場したのは、実は1960年代中期なのだ。1960年代中期には、入出力にキーボードとディスプレイが使えるようになっていたので、対話型言語の利用価値は大きかった。

※26 BASICインタープリタに関しては第5章を参照のこと。
■10行を1行で表す簡潔さ
 上に示したのは非常に単純な計算ばかりなので、「これで何ができるのだ?」と思った方も多いだろう。実はAPLは、変数名を並べるだけでリストを作り、そのリストに順に、または一斉に値を代入したり、文字列を連結したり、文字列から指定した位置の文字を取り出したり、さらには繰り返しや条件判定を行ったり――といった操作を、数個の記号を組み合わせるだけで行えるのである。 例えば、
   (+/Y)÷ρY←

と入力すると、APLはキーボード入力を待つ。ここで「10」と入力すると、続いて10個の数値入力を受け付ける。10個の数値をスペースで区切って入力すると、その10個の数値の平均値をコンソールに表示する。 内部の処理を言葉にすると、以下のようになる。( )内は、対応するソース中の記号である。

  1. 入力を受ける(←)
  2. 入力された値だけ要素を持つ配列Yを作る(ρY)
  3. 配列の各要素に数値を入力する(ρY←)
  4. 配列Yの要素の総和を求める(+/Y)
  5. (4)で求めた値を(1)で入力された値で割る(÷)

 BASICで書けば10行程度のプログラムとなるだろう。それをたった1行の式で行ってしまうのである。

 
■再利用性の低さが難点
 例に示したように、APLでは配列の扱いが非常にスマートだ。半面アクが強く、一朝一夕にはマスターできない。こういった性格から、APLは他の高級言語を用いたプログラミングの前段階としてアルゴリズムを考えたり、あるいは業務計画や設計のための試行錯誤などに使用された。 簡潔なのはよいが記号性の高さが災いし、覚えて使いこなせるようになるまでが大変だ。また、ソースコード(=算式)からその意味するところを読み解くのも至難の技である。加えて、対話式であるため入力したプログラムを再利用できないことも、大きな問題となる。 そもそもAPLは「個人の思考を助ける」ことが目的の処理系であるため、ソースコードの保存と再利用という観点は重視されていないのだ。このアクの強さがネックとなり、APLはFORTRANのように多くのユーザーを獲得するには至らなかった。しかし、その後も細々と使い続けられている。

FORTRANとAPLのたどった運命 TOP
 初期のプログラミング言語は、どちらも「数式とアルゴリズムを明快に記述する」ことを最大の目的として開発された。にもかかわらず、FORTRANは人間の思考の冗長性を具現化し、APLは抽象性を押し進めて記号性を特化させた。同じ目的から、まったく異なる種類の言語が生まれたのである。

■言語の長老〜FORTRAN
 FORTRANが多くのユーザーに広まり現在まで受け継がれている最大の理由は、その分かりやすさにある。簡潔さより、記述性の高さが受け入れられたのだ。 FORTRANは人間の用いる数式に近い形でプログラムを書けるため、科学技術計算用として広く使われ始め、プログラミング技術の進展に伴って構造化プログラミングなどに対応した拡張が行われた。 1990年には標準規格として“FORTRAN90”が定められている。これを拡張してさらに並列処理の機能を付加した“HPF(High Performance Fortran)”という言語仕様や、“Microsoft FORTRAN”などパソコン用の処理系も存在する。 登場してから40年以上の長きにわたり、延々と使い続けられている歴史的な言語なのだ。次章で取り上げる事務処理用言語COBOLと双璧をなす、プログラミング言語の長老である。
 
■“A Programming Language”
  一方のAPLはジョン・ウィリーの著した“A Programming Language”という本で言語体系が紹介され、その頭文字をとって命名された。“プログラミング言語”そのものを意味する、なんとも厚かましい名前である。 この本は1962年に出版されているため、APLは1960年代に入ってから生まれた言語だと思っている人もいるかもしれない。しかし先述したように、その原形は1956年、ハーバード大学のK.E.アイバーソンによって考案された“アイバーソン言語”である。 アイバーソンはプログラミング言語を作るというより、むしろアルゴリズムの厳密な表記とハードウェアの働きを正しく記述できるような手法として、この言語を考案した。 当初は大学などの教育用言語として使われ、後にIBMのSystem/360で用いられるようになり広まった。実際に活用されるようになったのは、1960年代半ばから1970年代にかけてだが、その原点は1956年、FORTRANとほぼ同じ時期にあたる。
■APLは消えず
 興味深いのは、APL実用化までの時間差だ。APLの原点であるアイバーソン言語では、アルゴリズム、つまり解法の簡潔な記述のみが追求された。 当時のプログラム開発では、1行の入力に1枚のカードを消費し、何千枚も読み込ませてコンパイルしてはエラーでやり直し…といったことが日常茶飯だった。そのため、たとえソースコードの作成に時間がかかっても、文字数・行数の少ない言語に価値が見出せたのだ。 効率と簡潔さを目指して生まれたアイバーソン言語だが、そのソースの分かりにくさ、習得の難しさからFORTRANのように広まることはなかった。ところが、ハードウェアの処理能力が向上してメモリ空間が広がり、キーボードとディスプレイ端末が使えるようになったとき、対話型言語APLとして蘇ったのである。 先に“A Programming Language”とは「厚かましい」と書いたが、この命名は「プログラムを作るための言語」というより、「プログラムを考えるために用いる言語」といったニュアンスが強いようだ。確かに覚え難く読み難い言語だが、独特の記述法にはパズルのような趣きがあり、ひとたびその魅力に取り憑かれると病みつきになってしまう。 1993年に日本アイ・ビー・エムがDOS/Vで動作するAPLを無償で配布した。現在、パソコンで思考支援ツールとしてAPLを愛用している人も少なからずいる。アイバーソンの思想は、細々と、しかし確実に受け継がれている。

OSの誕生 TOP
 FORTRANが40年以上も表街道を突っ走ってきたのに対し、ほぼ同じ頃に原形が生まれたAPLは、プログラミング言語としては王道を歩めなかった。両者の特徴を見れば、その理由は察しが付く。プログラムを“知的資産”として眺めたとき、端的であることより把握しやすく再利用できることの方が重要だったのである。

■地獄のルーチンワーク
 FORTRANとほぼ同じ時期にOS※27が登場している。これによって開発環境が整備され、FORTRAN処理系が様々なOSの上で動くようになると、ユーザー層はさらに拡大した。 アセンブリ言語で書かれたソースコードをコンパイルするには、穿孔カードの束を積み、カードリーダーを動かし、テープを掛け替え…と、オペレータが毎回同じ作業を繰り返していた。バグ※28が修正されプログラムが完成するまでは、まさに地獄のルーチンワークである。
※27 Operating System(オペレーティング・システム)の略。メモリやファイルの管理、プログラムの実行、ユーザーとの対話などハードウェアとユーザーとの仲介を行うプログラム。日本語では“基本ソフト”。
 
※28 プログラムの中に潜む間違い。この語の由来は次章(P108)で紹介する。
■OSはユーザーが作った
 上述のような定型化された作業を効率良く進めるため、一連の処理を自動化する目的で、つまりオペレータを助けるためにOSの原形となる“モニタ”(monitor)※29が開発された。1955年のことである。 モニタを開発したのはノースアメリカン航空ジェネラルモータース(GM)。コンピュータメーカーではなく、ユーザーの側だったのだ。モニタによって地獄のルーチンワークを効率化することで、人件費と稼働コストを節約できた。民間ユーザーなればこその発想だった。 その後モニタの概念は1962年に登場したIBMのIBSYSに受け継がれ、System/360コンピュータに用いられたOS/360で、入出力サポートや処理の自動実行と制御機能などを備えたOSとして確立されることになる。 OSが誕生し、ユーザーの負担が軽減されることで、コンピュータに求められる処理はさらに高度に複雑になった。当然、そういった要求を受け止める言語が必要になる。1960年代前半には、COBOL、ALGOL、BASIC、PL/Iなどなど、分野別の様々なプログラミング言語が多数登場する。
 
※29 ディスプレイのことではなく、プログラムの処理状況を“監視する”ソフトウェアと言う意味。有名なものに、FORTRANのコンパイル作業を自動化する“FORTRAN MONITOR”がある。