Pascal

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。36.3.174.141 (会話) による 2016年2月10日 (水) 14:29個人設定で未設定ならUTC)時点の版であり、現在の版とは大きく異なる場合があります。

Pascal(パスカル)は、構造化された初期の代表的なプログラミング言語

Pascal は、1970年スイスチューリッヒ工科大学ニクラウス・ヴィルトが教育用プログラミング言語として開発し、ALGOL の影響を受けた簡素で厳密な構造化言語仕様を持つ。教育目的で広まり、実用的にも初期の TeXMacintoshオペレーティングシステムアプリケーションの記述も Pascal である。

ドナルド・クヌースの TeX プログラムは文芸的プログラミングシステムのWEBで書かれ、そこから文書と Pascal プログラムを生成する。現在でもパーソナルコンピュータ上の処理系が多数あり、多くの他のプログラミング言語、およびハードウェア記述言語の源泉になっている。名前は、世界で最初の機械式計算機を発明したブレーズ・パスカルの名前に因んだものである[1]

言語仕様

教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身が Pascal コンパイラを Pascal 自身で書いてみせ、その能力を示した(後の Modula-2 では、オペレーティングシステムを Modula-2 で書いてみせた)。当時 FORTRAN 以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。

Pascal の単純さはLL(1) 文法で解析できるという言語的な特徴によく現れている。全ての名札、定数、型名、変数、サブルーチン[2]は使用に先立って定義しておく必要がある。ポインタ型を用いたリストを構築するための例外、交互にサブルーチンが呼び合うための例外的書法を導入した。ポインタ型に限っては、基になる型の定義の前に、その型の変数を参照するポインタ型を定義することができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。

その結果一文字先読再帰下降型パーザを用いたワンパスコンパイル、すなわちソーステキストを一回走査するだけで実行ファイルを生成することが可能だった。なお、他言語のコンパイラでは、2回以上走査を行い、最初の走査で識別子等の情報を中心に情報収集を行い、後続の走査で、それらの情報を参照しつつ実行ファイルを生成するマルチパス形式のものが多かった。また、C言語 などの文法は LL(1) 文法では説明できず、マルチパスを行う必要があった。後述の Turbo Pascal の高速性はアセンブラで記述されていたことも一因であるが、ワンパスによるコンパイルが可能な Pascal 言語の仕様を活かし、かつ、作業領域を全てメモリ上に確保して、ファイルアクセスを最小限に留める特徴がある。

ALGOL 由来の構造化構文、サブルーチンの中に、そのサブルーチン内からのみ見えるローカルな変数、そのサブルーチン内からのみ呼び出せるサブルーチン等を定義できるといった、スコープの概念と再帰的な構文構造(ブロック構造と呼ぶ)、静的スコープによる参照の局所化機能を持つ。さらに、豊富なデータ型と、COBOL に見られた構造体を含む新しいデータ型を定義できるという特徴も持っている。レコード型とポインタを用いてリストといったデータ構造を自由に構築することができる(二分木#データの二分木への格納法の例参照)。

コンパイル時にできるだけ多くの不注意な誤りを発見するため強力に型付けた言語であり、またハードウェアを隠蔽する思想が徹底している。たとえば集合型、ポインタ型はそれぞれビットマップアドレスを抽象化したものと考えられる。また Pascal は教育用ということもあり、最初の仕様では分割コンパイルや外部ライブラリの利用が考慮されていなかった。これは大規模なプログラムを記述したり、ハードウェアを直接操作するプログラムを記述するには不便な仕様であり、入出力の扱いなど処理系に依存しなければならない部分を言語の中に抱える結果に繋がった。たとえばファイル型変数に特定のファイルを関連付ける標準的な方法はない。ヴィルト自身は Modula-2 の設計でこれらの要請に応える一方で、Pascal 処理系のベンダがそれぞれ独自の拡張を施して、分割コンパイルやハードウェアの直接操作を可能としたが、この部分の互換性は乏しい。

初期の Pascal

最初の Pascal コンパイラは、CDC 6000 シリーズ用に1970年に書かれた1パスコンパイラで、それ自身が Pascal で書かれていた[3]。CDC 6000 シリーズは 1ワードが 60ビットのマシンであった。Pascal には、メモリを節約するための詰め合わせ機能(pack/unpack)や、10文字(1文字は6ビット)の詰め合わせ文字列である alfa 型の存在[4]、長いワードをビットごとに扱うための集合型など、CDC のアーキテクチャの影響を受けた箇所がある。CDC 用のコンパイラは、extern 宣言によって外部ライブラリを読み込むことができた[5]

1975年にカリフォルニア工科大学で Pascal を並列動作用に拡張した Concurrent Pascal が開発され、それを使ってシングルユーザのオペレーティングシステムを開発し、Pascal がシステム設計にも優れていることを明らかにした[6]

Pascal-P は、Pascal からP コードへのコンパイラと、Pコードインタプリタからなる中間言語コンパイラで、やはり Pascal 自身で書かれていた。このことにより、後の Java が異なるアーキテクチャの計算機への移植が進んだのと同様、多くの計算機への移植が進んだ。中間言語コンパイラを移植するためには、仮想スタックマシンであるPコードマシンのエミュレータを移植元の機械で開発し、コンパイラを移植先の機械でコンパイルするだけで良い。1970~80年代の低速な計算機では、このような中間言語方式では性能が不十分だった。

なお、Pコードマシンは負値の表現に「1の補数」を用いており、これは Object Pascal などにも引き継がれている。

標準 Pascal

ISOではPascalを1983年に ISO 7185 として標準化し現在は1990年版である。対応する日本の規格は JIS X 3008-1990で、改訂版は1994である。 標準 Pascal には水準0と水準1があり、後者は長さの異なる配列を引数に取るための整合配列が使える。

アルゴリズム記述言語として

Pascal は、アルゴリズムの教科書にしばしば使われた。ヴィルト自身による『アルゴリズム+データ構造=プログラム』をはじめ、エイホホップクロフトウルマン『データ構造とアルゴリズム』などは Pascal を使用している。

パソコン用の Pascal

1970年代末のパソコン上のシステムでは、Apple IIZ80 システムで動作する UCSD Pascal(後に対応言語を増やして UCSD p-System に発展)が動いていた[7]。UCSD Pascal は Pコードを使った中間コードコンパイラで、文字列型・case文の拡張・ユニットを使った Modula-2 風の分割コンパイルなどをサポートしており、言語以外にメニューを使ったユーザーインターフェースも優れていた。

ほかに、デジタルリサーチ社 の Pascal/MT+ やJRTシステムズ社の JRT pascal(日本ではライフボートが αPascal として販売した)などが販売されていた。

Turbo Pascal とその後継

1983年にボーランドが発売した Turbo Pascal は、Z80 ベースの CP/M で動作する大変高速な1パスコンパイラ兼設計環境である。i8080/8085 ベースマシン、V30の8080エミュレーションモードでは動作しなかった。「コンパイラはコンパイル時間が長い」という常識を打ち破った。さらにWordStar風のキー操作を持った、当時としては高機能なフルスクリーンエディタを備えていながら低価格であったため、日本では「フルスクリーンエディタを買うと、おまけに高速な Pascal コンパイラが付いてくる」とまで言われたほどである。[要出典]8ビットの CP/M 版以外に16ビット版としてCP/M-86 版と MS-DOS 版も開発された。

版を重ねるにつれてユニット(モジュール化)やオブジェクト指向の概念を取り入れていった。Turbo Pascal は Pascal を拡張した言語である。 ボーランドにいた技術者が TopSpeed Modula-2 という言語を作成したが、トップ・スピード社は買収により Modula-2 の開発を停止している。 ボーランドはその後 Object Pascal という、オブジェクト指向を取り入れた Pascal を開発し、自社製品の Delphi(デルファイ)に採用した。さらに Delphi のバージョン7 より、言語名も Object Pascal から Delphi と変更している。

また、マイクロソフトは Object Pascal のブロック表記などをC言語風に置き換えた C# を開発[要出典]し、同社の主力設計言語として、その普及を推進している。

Turbo Pascal と Delphi の成功によって、互換性を謳った言語処理系が OS/2UNIX 上でも開発されている。商用のものとしては Speed Pascal、Virtual Pascal があり、フリーソフトとしては Free Pascal(元 FPK Pascal)が広い範囲のプラットフォームで動作する。ISO 標準 Pascal を意識したものでは、GNU Pascal がある。 また、ボーランドのLinux 向け設計言語にObject Pascalによる Kylix があった。

Macintosh と Pascal

当初、Macintosh にはセルフ開発環境はなく、システムの開発およびアプリケーションのクロス開発用プラットフォームとして、もっぱら Lisa を使用した。Lisa の公式開発言語は Pascal だったため Macintosh Toolbox と呼ぶ API においても、その呼び出し手法が Pascal に準拠していたのはこうした理由による。

なお、この Macintosh の開発言語は原初の Pascal ではなく、ヴィルト自身が拡張した Object Pascal である。recordclass に拡張し、GUI 環境構築の記述に実用性を持たせたものである。

Pascal の後継言語

ニクラス・ヴィルト自身が Pascal を拡張した言語として Modula 系の言語があり、Pascal 系の言語に含まれている。Pascal の上位互換になっていないため、ヴィルトは新しい言語の名前に Pascal を含めなかった。

Pascal に対する批判 と反批判

Pascal は本来教育用を意図されていたこともあり簡素な文法が特徴だが、反面プロフェッショナルの用途には耐えないという批判がある。代表的なものは、C言語の開発者の一人カーニハンによる1981年の論文 「Why Pascal is Not My Favorite Programming Language」である。 実際にC言語の普及に伴い Pascal の用途は減少し、のちに Delphi による再ブームが起こるまで少数派の存在になっていた。カーニハンの批判そのものとこの減少に直接的な因果関係があるわけではないが、C言語の移植性が高く、多くの CPU 製造者が最初に作成するコンパイラとしてC言語を選択するようになった。しかし、Safer-C、 MISRA-C のようにC言語そのものの部分集合を規定していくと Pascal の仕様に近付いているという反批判もでてきている。

脚注

  1. ^ Philips' automatic sequence calculator」という名前に由来するとする説もある。
  2. ^ Pascalにおいては手続きprocedure)または関数function)と呼び、値を返しの中で用いうるものを特に関数と読んで区別する。
  3. ^ Wirth (1986) pp.318-319
  4. ^ 『Pascal』第二版 p.106
  5. ^ 『Pascal』第二版 p.99
  6. ^ Per Brinch Hansen 著、田中英彦 訳『並行動作プログラムの構造』日本コンピュータ協会、1980年。 
  7. ^ THE UCSD P-SYSTEM MUSEUM”. THE JEFFERSON COMPUTER MUSEUM (2004年). 2015年8月28日閲覧。

関連項目

文献

  • 『PASCAL 原書第4版』ISBN 4-563-01466-4
  • K・イェンゼン、N・ヴィルト 著、原田賢一 訳『PASCAL』培風館、1981年。ISBN 456300782X  (第二版の邦訳)
  • Wirth, Niklaus 著、宇井康隆 訳「プログラミング言語:要求項目と評価方法」、アラン・フォイヤー; ナレイン・ゲハーニ 編『Ada, C, Pascal』工学社、1986年、305-325頁。ISBN 4875930844 

外部リンク