プログラミング言語のはなし

しっかりした言語と手軽な言語

(これは、1993年度、東京都立大学の「情報基礎」の教材として書いた文章に その後多少の改訂を加えたものです。)

わたしが論じることができるプログラム言語は、手順立て言語(手続き型言語とも言われる)に限られるが、 そのような言語の発達には2つの方向があると思う。

ひとつは、大規模なソフトウェアを安全に動くようにしたいという欲求から 来る改良である。大規模なソフトウェアは、複数の人が分担したり、すでに 誰かが書いたライブラリプログラムを採用したりして作られる。たとえ同じ 人が全体を書くとしても、ある部分を書いているときに他の部分の細部は 思い出せない。こういう状況では、プログラムを部品に分割し、相互に やりとりされる情報(界面=interface)を明確に記述する一方、部品の内部の 書き方はどうなっていても他の部品には影響を与えないような書き方が よいとされる。こういう考え方をモジュール(module)化という。

モジュール化の他にも、プログラミング上、安全性を高めるような注意がある。 たとえば「変数はすべて宣言しておくこと」である。 Fortranでは、変数は宣言しなくてもよい。I, J, K, L, M, Nで始まる名前は 整数型、その他は実数型(実際は浮動小数点型)と仮定して確保される。 しかし、人間は変数名を書きまちがえることがある。これはプログラム言語の 予約語の書きまちがいと違ってコンパイラが自動的に検出することはむずかしい。 変数を宣言する約束にしておけば、他の有効な変数名との間の書きまちがいで ない限り、検出される。 Pascalですべての変数を宣言する約束になっている背景にはこういう配慮が あると思う。Cの場合についてわたしは正確な知識がないが、たぶん、ごく初期には 宣言しない変数は整数型とみなすことになっていたのが、すべて宣言することに 変わったのだと思う。

しかし、こういった注意は、ある程度長いプログラムを書くときにはありがたい のだが、ごく簡単な仕事をするときには迷惑となる。 そこで、短いプログラムを書くのに便利な言語が別に設計される。 こういった言語の処理系は、全体を機械語に翻訳するコンパイラではなく、 1行ずつ解釈していくインタプリタ(interpreter)であることが多い。

その代表としてまずあげられるのはBASICだろう。これはダートマス(Dartmouth) 大学のKemenyとKurtzが1960年代に学生実習用に作った言語である。当時、計算機 の使い方はバッチ処理(会話型でない処理)がふつうだったのだが、ダートマス では大型計算機の時分割(time sharing, TSS) による対話型処理をしようとした。 しかし学生ひとりあたりに使えるメモリーは少ないし、端末の応答も遅い。 したがって変数名に使える文字数もぎりぎりに切り詰められたし、宣言文の ためのメモリーも惜しかった。巨大なプログラムは書きようがなかったから、 サブルーチン(下請け手続き)はあってもすべての変数をメインプログラムと共有 するような独立性の低いものしかなかったのも当然といえよう。また制御構造の 考え方が確立していなかった時代の産物なので、ループも条件別処理もgo to文 なしでは表現できなかった。

Bill (William) Gatesが学生時代にマイクロコンピュータ用のBASIC処理系を 作り、マイクロソフト社を始めた話は有名である。当時のマイコンの使える メモリーは数キロバイトだったので、上に述べたBASICの特徴はぴったりだった。 しかし、パソコンのメモリーが急速に大きくなり、しかもそのほとんどの機種に マイクロソフトBASICが常備ソフトウェアとして採用されたので、困ったことに なった。つまり、BASICで巨大なプログラムを書くのが流行してしまった。 予想されたことなのだが、こういうプログラムは保守・改良がむずかしい。

もちろんBASIC言語も改良された。マイクロソフト社はQuick Basic (のちVisual Basic)を、 KemenyとKurtzはTrue Basicを出した。これらの共通部分の文法を Full Basicといい、ANSI規格にもなっている(確かJISにもなったはず)。 これは、条件別処理やループの制御構造構文、サブルーチンのローカル変数や 引き数(引き渡す変数)、変数の型宣言、などの要素を持っている。 Full BasicはPascalやCにかなり近い言語だといえる。ただし、 手軽な言語としての需要にもこたえて、変数宣言を必須とはしていない。 この点で、大規模プログラム用の言語としてはやや不安がある。

主としてUnix利用者の間で好まれている手軽な言語として awk がある。 (MS-DOSやWindows上でも、 GNUプロジェクトによるGawkが移植されたものなどがある。) これはBell研究所のAho, Weinberger, Kernighanによって作られた。 もともと、Unixでは標準的データ処理であるフィルタ処理、つまり 「標準入力を1行ずつ読んで処理結果を標準出力に書く」ことのために 作られた。一つの仕事しかしないフィルタに対し、awk語のプログラムを 解釈して仕事をする少し賢いフィルタなのである。したがって、 「データがある限り繰り返す」というループ処理が組みこまれており、 一般的な手順立て言語とはいえない (BEGIN部だけを使うという邪道によって、 フィルタ処理でないプログラムを書くこともできなくはないが)。 テキストファイルのフィルタ処理で、 しかもあまり長くない(およそ100行以内の)プログラムで表現できるものに 限って、非常に有効である。設計者が同じグループに属することから 想像できるように、文法は見かけ上Cに似ている。

また、Perlというものがある。Larry Wallという人が考えたもので、 awkでできることもできるが、フィルタ処理に特化はしておらず、 一般的な手順立てもできるようになっている。 短いプログラムには便利なものである。 がんばれば長いプログラムを書くこともできてしまうのだが、 それに向いた言語ではない。

今では、まつもとゆきひろ氏によるRubyもあるが、 わたしはまだ論評できるほど知らない。


2001-12-20
増田 耕一 (MASUDA Kooiti)
[「手順立てプログラム言語に関する教材」目次へ] [「Awk使い正道邪道」目次へ]