Pascalのリストは美しい

('90/1 EPSON Value-up誌 掲載稿より) 赤字は'97年現在における補注
●言語概要
Pascalはチューリッヒ工科大学(スイス)の天才計算機科学者、N.Wirth(ヴィルト)教授の手によって1968年に誕生した。教育用として系統的な言語構造をもつこと、高度に抽象化された問題をできるだけ自然な形で明瞭に記述できること−−それが開発時の主要な目標であった。歴史的にみればALGOL60、ALGOLWのブロック構造を継承してるが、言語仕様が文書によって簡潔かつ明確に定義されており、前世代の言語と比較すると規模ははるかにコンパクトである。機能を必要なものに限ることで処理系の実現が容易となり、プログラムの作成・保守もずっと簡単になっている。
 Pascalは言語仕様的には次のような特色をもつ。

1)”型”が豊富であること
 型というのは、ある変数がとりうる値の集合とそれらに対する正しい操作の集合を定めるものだ。型という言葉はCにもあり、データのもつ性質を表すという点では同じだがPascalの場合は変数の形式・範囲・構造という3つの要素を包含した、一つの概念を指す言葉と言うほうが適当である。別表に示したもの (注:別表は割愛) が定義済み型として用意されている。このうち列挙型はenum型として最近のCにも取り入れられた。部分範囲型や集合型などは読みやすく理解しやすいプログラムを書くのに欠かせない。
 そしてデータ構造の主役はなんといってもレコード型である。注意深く作られたPascalのプログラムは大域変数と単純型の変数をできるだけ減らすよう工夫されている。いくつかの変数が相互に意味的な関係をもつなら、できるだけレコードとしてまとめるべきである。

2)型が”強い”こと
 Pascalは型にうるさい言語である。ソースリスト中のどんなオブジェクトも型をもち、違う型に対するデータの転送はできない。このことによって、後述するようにプログラミングの重大な障害となるケースがいくつか指摘されているが、総じて言えば型が強いことは望ましいことであり、Pascalの大きな長所だといえる。たとえば変数xをvar x: 0..MaxInt; と宣言した場合、x := -1という代入は実行時エラーとなる。ー1という数が宣言の部分範囲型と一致しないからである。
親和性のある型同士ならば用意された型変換関数によって一つの型に統一し、一つの式に記述したり代入したりすることもできるので不便はない。
 型が違うことを厳密にチェックするということは、逆に言えば同じ型同士ならば非常に柔軟に扱える、ということだ。型さえ同じならばどんな代入も許される。レコード型変数や配列変数など、構造をもつもの全体をそのまま代入に使うことができるのである。このようにPascalはデータ構造の扱いが容易で強力な言語だが、これはプログラムの主役はコードではなくデータだという考えに基づいているためである。

3)ブロック構造をとること
 プログラムの形式という点でPascalがCと最も違うのは、文・手続き・型の構造などがすべてブロック構造で統一されており、繰返して新たな構造を宣言できることである。手続きの中で別の手続きを定義したり、if文のなかに別のif文がはいったり、レコードのなかにレコードがあるという具合である。これは、PascalがEBNF式(拡張バッカス・ナウア記法)によって再帰的に定義されていることによる。オブジェクトの可視性(スコープ)もブロック構造によって制御される。つまり、ある手続きの中にある変数や手続きは、その中だけのローカルなものとすることができ、別の場所で定義された同じ名前のオブジェクトとは区別して扱われ、しかも外側からは参照できないため、手続きをブラックボックスとすることができる(モジュールの独立性を保証する)。
 近代的なプログラミング手法の3本柱として挙げられるのが、プログラムの構造化、トップダウン設計、段階的詳細化法である。ブロック構造はこれらの技法をもっとも容易に実現する方法だ。Pascalで”文”を記述する場所には、いくつかの文を並べてbeginとendで挟んだ”複文”を書くことができる。if文などは一目見た限りでは、Cのそれと似ているが、セミコロンのもつ意味が異なっている。Cでは一つの文の終りを示すターミネータだが、Pascalでは文と文を区切るセパレータに過ぎず、むしろ日常的な意味ではカンマの用法に近い。
 この他のPascalの特徴としては、文書性に優れていることが挙げられる。記号化をあまり押し進めないでプログラムは自然言語に近い。それでいて簡潔に表現されているため、ソースリストには一種の美しさがある。

●なぜCなのか
プログラム言語は古くはマシンに命令を与えるもの、という位置付けであった。現在ではマシンを構成する要素の一つとして捉えられ始めている。Pascalも正しくは一つの仮想Pascalマシンであって、抽象的な考えを文書化するための支援ツールなのである。ハードウェア指向のプログラミングはシステムとプログラマを含めた特殊な環境の中では効率的な働きをするだろう。しかしそれは一般性を欠き、ソースコードの可読性を欠くことになる。ひいては信頼性の低下にもつながりかねない。
 PascalとCはよく対比して捉えられる。C言語はunixというOSと優秀な技術者達が育み、”プログラマ=性善説”によって使用者に最大限の自由を与えてきた。しかしこのことはCを使えば誰でも優れたプログラムが書けるということではない。むしろ逆であって、生半可な知識しかもたない人が使うと他人に読めないものになったり原因不明の蟲を生んだりするのがオチとなる。切れ味のよいカミソリのように、使うには危険がつきまとうのである。どんなに役に立つ道具であっても、その人が使いこなせなければ意味がない。Cを徳治主義とするならPascalは法治主義である。型の厳密さ、ブロック構造の窮屈さなど、プログラマにとっては一見制約に思える点が多い。だが、曖昧なデータ処理を禁ずることはプログラムの信頼性を向上させることなのだ。
 最近読んだ本の中に気の利いた言葉があった。”大名プログラマ”という人達のことで、「CPUは限りなく速く」、「メモリは無尽蔵で」、「コンパイラは無駄なコードを吐かない」これを当然のこととして要求するのだそうである。その本の中では皮肉な言い回しであったが、私はむしろ褒め言葉として解釈したい。実行されるプログラムは速ければ、小さければいい−−当然の要求ではあるが、それはプログラムの究極の目的ではない。最低の条件として求められるのは信頼性と保守性である。”きちんと動作すること”なのである。プログラマが負担を感じず、自然な発想で考えを形にできるならば素晴らしいことではないか。私は大名プログラマになりたい。 (注:意味不明)

●そして新言語へ
Pascalを規定するのは、Wirthによる著書(プログラミング言語PASCAL、公理的記述、ユーザーマニュアルとレポート)が原典とされてきたが、現在ではいくつかの欠点と曖昧な点を改めて制定されたISO規格(ISO7185Pascal)が標準となっている。 (注:当時はまだANSIはなかった(はず)) しかし実際の処理系は標準Pascalとは大きな隔たりがあって、プログラム作成に有利となるいくつもの拡張が施されている。これは文字列の扱いやモジュール化のための付加的な機能が主なものだが、実はPascalは本質的な欠点を内含している。それは、主に次の3点である。
・変数の存在性が、ブロック構造による可視性に束縛されている。このためローカル変数が値を静的に維持できず、大域的に宣言するしかない。
・大きさが違う配列は違う型とみなされてしまうので、任意の大きさのマトリクスを扱う手続きが不可能である。(ただしISO規格によって整合配列形式という解決策は示されている)
・ハードウェアが言語仕様から隔離されているため、現存するOSの環境を使いこなすことができない。また言語仕様にRead、Writeなど入出力が含まれてしまい、ユーザーの細かな要求を満たすインターフェースが作りにくい。
この他にも宣言の順番などプログラムの構成上の問題、定数式が使えないなど装飾的な問題もある。これらの欠点を補うべく、Pascalは異なる2つの進化を遂げた。一つはBorland社のTurboPascalであり、もう一つは生みの親WirthによるModula2である。 (注:ご承知の通りその後Modula3、oberonと進化)
 Modula2は、現存するプログラム言語の中では最も完成され洗練されたものの一つで、Adaと並んで究極の言語と称されている。 (注:ちょっと誉めすぎ?) MODLULEという新たな概念を用いることでPascalのスコープの問題を発展的に解消し、モジュール別開発や分割コンパイルを積極的にサポートできるようになった。抽象データ型、未定配列形式、コルーチンなどいくつもの機能が付加され、システム記述言語としてすばらしい能力をもっている。現在 (注:'89年当時) MSDOSで利用できるものとしては、Logitech-Modula2、FTL-Modula2が日本語化され発売されている。IBM-PC版としてはJPI社のTopSpeed-Modula2が知られている。
 一方、TurboPascalはPascalの枠内で性能アップをはかってきたが、現在のバージョン(ver5.0 (注:'89年当時) )はむしろModula2に近い。記法など表面的な違いはあるが、言語仕様もModula2にそれほどひけをとらない。MSDOS専用になっており、DOSに密接した低レベルの処理も自在に記述できる。コンパイラとしての性能はもちろんだが、1つの製品として速度、操作性、開発環境などの点で実に快適なプログラミング環境を提供している。初心者でも容易に利用できるが、TurboPascalはむしろマニアックな使われかたをした時に性能が充分に発揮できると言えるかも知れない。多少なりともパソコンマニアを自認する人にはぜひ一度使ってみてほしい処理系である。Pascalのもつ整然とした美しさがわかるようになれば、きっとやみつきなる。

 もっと深くPascalを知っていただくには、次の関連書籍を御一読していただきたい。
・「PASCAL」原書第3版(培風館)K.Jensen、N.Wirth著/原田訳
・アルゴリズム+データ構造=プログラム(日本コンピュータ協会)N.Wirth著/片山訳
・ターボパスカルプロフェッショナルマニュアル(JICC出版局)吉田義人
・All That BORLAND(技術評論社)プロセッサ別冊


↑戻る