Pascal
Pascal(パスカル)は、構造化された初期の代表的なプログラミング言語。
Pascalは、1970年にスイスのチューリッヒ工科大学のニクラウス・ヴィルト(Niklaus Wirth)が教育用プログラミング言語として開発し、ALGOLの影響を受けた簡素で厳密な構造化言語仕様を持つ。教育目的で広まり、実用的にも初期のTeXやMacintoshのOSやアプリケーションの記述もPascalである。
ヴィルトはTeXで、文書とプログラムを生成する方法を例示している。現在でもパーソナルコンピュータ上の処理系が多数あり、多くの他のプログラミング言語、およびハードウェア記述言語の源泉になっている。名前は、世界で最初の機械式計算機を発明したブレーズ・パスカルの名前にちなんだものである。
目次 |
[編集] 言語仕様
教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身がPascalコンパイラをPascal自身で書いてみせ、その能力を示した(後のModula-2では、OSをModula-2で書いてみせた)。当時FORTRAN以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。
Pascalの単純さはLL(1)文法で解析できるという言語的な特徴によく表れている。全ての名札(label)、定数、型名、変数、サブルーチン[1]は使用に先立って定義しておく必要がある。ポインタ型を用いたリストを構築するための例外、交互にサブルーチンが呼び合うための例外的書法を導入した。ポインタ型に限っては、元になる型の定義の前に、その型の変数を参照するポインタ型を定義することができた。また、サブルーチンの定義部分だけを先に記述する方法で、解決した。
その結果一文字先読再帰下降型パーザを用いたワンパスコンパイル、すなわちソーステキストを一回走査するだけで実行ファイルを生成することが可能だった。なお、他言語のコンパイラでは、2回以上走査を行い、最初の走査で識別子等の情報を中心に情報収集を行い、後続の走査で、それらの情報を参照しつつ実行ファイルを生成するマルチパス形式のものが多かった。また、Cなどの文法はLL(1)文法では説明できず、マルチパスを行う必要があった。後述のTurbo Pascalの高速性はアセンブラで記述されていたことも一因であるが、ワンパスによるコンパイルが可能なPascal言語の仕様を活かし、且つ、作業領域を全てメモリ上に確保して、ファイルアクセスを最小限に留める特徴がある。
ALGOL由来の構造化構文、サブルーチンの中に、そのサブルーチン内からのみ見えるローカルな変数、そのサブルーチン内からのみ呼び出せるサブルーチン等を定義できるといった、スコープの概念と再帰的な構文構造(ブロック構造と呼ぶ)、静的スコープによる参照の局所化機能を持つ。さらに、豊富なデータ型と、COBOLに見られた構造体を含む新しいデータ型を定義できるという特徴も持っている。レコード型(C言語などでいう構造体)とポインタを用いてリスト、木といったデータ構造を自由に構築することができる(二分木#データの二分木への格納法の例参照)。それまでデータ構造といえば配列くらいしか知らないアマチュアプログラマにとっては、かなり衝撃的な言語だったろうことは想像に難くない。
コンパイル時にできるだけ多くの不注意な誤りを発見するため強力に型付けた言語であり、またハードウェアを隠蔽する思想が徹底している。例えば集合型、ポインタ型はそれぞれビットマップとアドレスを抽象化したものと考えられる。また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が登場するまでにはDigitalResearchのPascal/MT+やJRT Systems社のJRT pascal(日本ではライフボートがαPascalとして販売した)などが販売されていた。
[編集] Turbo Pascalとその後継
Z80ベースのCP/Mで動作する大変高速な1パスコンパイラ兼開発環境で(i8080/8085ベースマシン、V30の8080エミュレーションモードでは動作しなかった)、従来の「コンパイラはコンパイル時間が長い」という常識を打ち破るに十分だった。さらに当時としては高機能なフルスクリーンエディタ(TurboPascalで記述していた)を備えていながら低価格であったため、日本では「フルスクリーンエディタを買うと、おまけに高速なPascalコンパイラがついてくる」とまで言われたほどである。8bitのCP/M版以外に16bit版としてCP/M-86版とMS-DOS版も開発された。
版を重ねるにつれてユニット(モジュール化)やオブジェクト指向の概念を取り入れていった。したがって、厳密に言えばTurbo PascalとPascalとは別の言語である。
ボーランドにいた技術者がTopSpeed Modula-2という言語を作成したが,TopSpeed社は買収によりModula-2の開発を停止している。
ボーランドはその後Object Pascalという、オブジェクト指向を取り入れたPascalを開発し、自社製品のDelphi(デルファイ)に採用した。さらにDelphiのバージョン7より、言語名もObject PascalからDelphiと変更している。
また、マイクロソフトはObject Pascalのブロック表記などをC言語風に置き換えたC#を開発し、同社の主力開発言語として、その普及を推進している。
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だけでOSを含むシステムを作って見せた。
- 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
[編集] 外部リンク
- Niklaus Wirth(英語)
- Pascal programming language(英語)
- FreePascal - PascalとObject Pascalのフリーなコンパイラ
- GNU Pascal - GCCの Pascal コンパイラ