Pascal
テンプレート:プログラミング言語 Pascal(パスカル)は、構造化された初期の代表的なプログラミング言語。
Pascal は、1970年にスイスのチューリッヒ工科大学のニクラウス・ヴィルトが教育用プログラミング言語として開発し、ALGOL の影響を受けた簡素で厳密な構造化言語仕様を持つ。教育目的で広まり、実用的にも初期の TeX や Macintosh の オペレーティングシステム、アプリケーションの記述も Pascal である。
ヴィルトは TeX で、文書とプログラムを生成する方法を例示している。現在でもパーソナルコンピュータ上の処理系が多数あり、多くの他のプログラミング言語、およびハードウェア記述言語の源泉になっている。名前は、世界で最初の機械式計算機を発明したブレーズ・パスカルの名前に因んだものである。
目次
言語仕様
教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身が Pascal コンパイラを Pascal 自身で書いてみせ、その能力を示した(後の Modula-2 では、オペレーティングシステムを Modula-2 で書いてみせた)。当時 FORTRAN 以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。
Pascal の単純さはLL(1) 文法で解析できるという言語的な特徴によく現れている。全ての名札、定数、型名、変数、サブルーチン[1]は使用に先立って定義しておく必要がある。ポインタ型を用いたリストを構築するための例外、交互にサブルーチンが呼び合うための例外的書法を導入した。ポインタ型に限っては、基になる型の定義の前に、その型の変数を参照するポインタ型を定義することができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。
その結果一文字先読再帰下降型パーザを用いたワンパスコンパイル、すなわちソーステキストを一回走査するだけで実行ファイルを生成することが可能だった。なお、他言語のコンパイラでは、2回以上走査を行い、最初の走査で識別子等の情報を中心に情報収集を行い、後続の走査で、それらの情報を参照しつつ実行ファイルを生成するマルチパス形式のものが多かった。また、C言語 などの文法は LL(1) 文法では説明できず、マルチパスを行う必要があった。後述の Turbo Pascal の高速性はアセンブラで記述されていたことも一因であるが、ワンパスによるコンパイルが可能な Pascal 言語の仕様を活かし、かつ、作業領域を全てメモリ上に確保して、ファイルアクセスを最小限に留める特徴がある。
ALGOL 由来の構造化構文、サブルーチンの中に、そのサブルーチン内からのみ見えるローカルな変数、そのサブルーチン内からのみ呼び出せるサブルーチン等を定義できるといった、スコープの概念と再帰的な構文構造(ブロック構造と呼ぶ)、静的スコープによる参照の局所化機能を持つ。さらに、豊富なデータ型と、COBOL に見られた構造体を含む新しいデータ型を定義できるという特徴も持っている。レコード型とポインタを用いてリスト、木といったデータ構造を自由に構築することができる(二分木#データの二分木への格納法の例参照)。それまでデータ構造といえば配列くらいしか知らないアマチュアプログラマにとっては、かなり衝撃的な言語だったろうことは想像に難くない。
コンパイル時にできるだけ多くの不注意な誤りを発見するため強力に型付けた言語であり、またハードウェアを隠蔽する思想が徹底している。たとえば集合型、ポインタ型はそれぞれビットマップとアドレスを抽象化したものと考えられる。また Pascal は教育用ということもあり、最初の仕様では分割コンパイルや外部ライブラリの利用が考慮されていなかった。これは大規模なプログラムを記述したり、ハードウェアを直接操作するプログラムを記述するには不便な仕様であり、入出力の扱いなど処理系に依存しなければならない部分を言語の中に抱える結果に繋がった。たとえばファイル型変数に特定のファイルを関連付ける標準的な方法はない。ヴィルト自身は Modula-2 の設計でこれらの要請に応える一方で、Pascal 処理系のベンダがそれぞれ独自の拡張を施して、分割コンパイルやハードウェアの直接操作を可能としたが、この部分の互換性は乏しい。
初期の Pascal
初期の Pascal、またその派生 Pascal は、Pascal からP コードへのコンパイラと、Pコードインタプリタからなる、中間言語コンパイラだった。このことにより、後の Java が異なるアーキテクチャの計算機への移植が進んだのと同様、多くの計算機への移植が進んだ。中間言語コンパイラを移植するためには、仮想スタックマシンであるPコードマシンのエミュレータを移植元の機械で開発し、コンパイラを移植先の機械でコンパイルするだけで良い。1970~80年代の低速な計算機では、このような中間言語方式では性能が不十分だった。
なお、Pコードマシンは負値の表現に「1の補数」を用いており、これは Object Pascal などにも引き継がれている。
パソコン用の Pascal
初期のパソコン上のシステムでは、Apple II や Z80 システムで動作する UCSD Pascal(後に対応言語を増やして UCSD p-System に発展)も存在したが、普及に最も貢献したのはボーランドの Turbo Pascal である。 Turbo Pascal が登場するまでには デジタルリサーチ社 の Pascal/MT+ やJRTシステムズ社の JRT pascal(日本ではライフボートが αPascal として販売した)などが販売されていた。
Turbo Pascal とその後継
Z80 ベースの CP/M で動作する大変高速な1パスコンパイラ兼開発環境で(i8080/8085 ベースマシン、V30の8080エミュレーションモードでは動作しなかった)、従来の「コンパイラはコンパイル時間が長い」という常識を打ち破るに十分だった。さらに当時としては高機能なフルスクリーンエディタ(Turbo 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 と変更している。
また、マイクロソフトは テンプレート:要出典範囲し、同社の主力開発言語として、その普及を推進している。
Turbo Pascal と Delphi の成功によって、互換性を謳った言語処理系が OS/2 や UNIX 上でも開発されている。商用のものとしては Speed Pascal、Virtual Pascal があり、フリーソフトとしては Free Pascal(元 FPK Pascal)が広い範囲のプラットフォームで動作する。ISO 標準 Pascal を意識したものでは、GNU Pascal がある。また、Linux 向けのものに Kylix がある。
Macintosh と Pascal
当初、Macintosh にはセルフ開発環境はなく、システムの開発およびアプリケーションのクロス開発用プラットフォームとして、もっぱら Lisa を使用した。Lisa の公式開発言語は Pascal だったため Macintosh Toolbox と呼ぶ API においても、その呼び出し手法が Pascal に準拠していたのはこうした理由による。
なお、この Macintosh の開発言語は原初の Pascal ではなく、ヴィルト自身が拡張した Object Pascal である。record
を class
に拡張し、GUI 環境構築の記述に実用性を持たせたものである。
Pascal の後継言語
ニクラス・ヴィルト自身が Pascal を拡張した言語として Modula 系の言語があり、Pascal 系の言語に含まれている。Pascal の上位互換になっていないため、ヴィルトは新しい言語の名前に Pascal を含めなかった。
- Modula - モジュール概念を取り入れ Pascal の後継を目指したが、途中でヴィルトが Modula-2 の方へ移ったため実質未完成。途上版のコンパイラだけがリリースされたらしい。
- Modula-2 - モジュールの概念を追加し分割コンパイルなどを可能にした。ヴィルトは、Modula-2 だけでオペレーティングシステムを含むシステムを作って見せた。
- Modula-3 - オブジェクト指向言語へ拡張。
- Oberon - Modula-2 の後継。
- Concurrent Pascal
- Component Pascal
- Ada - アメリカ国防総省で開発された汎用言語
- VHDL - Ada風のハードウェア記述言語
- Verilog-HDL - C言語風の前処理可能な Pascal 風の記述のハードウェア記述言語
- System Verilog - Verilog-HDL の拡張仕様
- Delphi - Pascal を拡張して作られたオブジェクト指向言語
- Eiffel - 構文が 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 の仕様に近付いているという反批判もでてきている。
脚注
関連項目
文献
- 『PASCAL 原書第4版』ISBN 4-563-01466-4
外部リンク
- FreePascal - Pascal と Object Pascal のフリーなコンパイラ
- GNU Pascal - GCCのコンパイラ