Pascal
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Pascal(パスカル)は、構造化された初期の代表的なプログラミング言語。
Pascalは、1970年にスイスのチューリッヒ工科大学のニクラウス・ヴィルト(Niklaus Wirth)により教育用プログラミング言語として開発され、ALGOLの影響を受けた簡素で厳密な構造化言語仕様を持つ。教育目的で広く用いられたが、実用的にも初期のTeXやMacintoshのOSやアプリケーションの記述にも用いられた。現在でもパーソナルコンピュータ上の処理系が多数ある。名前は、世界で最初の機械式計算機を発明したブレーズ・パスカルの名前にちなんだものである。
目次 |
[編集] 言語仕様
教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身がPascalコンパイラをPascal自身で書いてみせ、その能力を示した(後のModula-2では、OSをModula-2で書いてみせた)。当時FORTRAN以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。
PascalのシンプルさはLL(1)文法で解析できるという言語的な特徴によく表れている。全てのラベル、定数、型名、変数、サブルーチン(Pascalにおいては手続き (procedure) または関数 (function)と呼び、値を返し式の中で用いうるものを特に関数と読んで区別する)は使用に先立って定義しておく必要がある。ポインタ型を用いたリストを構築するための例外、交互にサブルーチンが呼び合うための例外的書法は導入された(ポインタ型に限っては、元になる型の定義の前に、その型の変数を参照するポインタ型を定義することができた。また、サブルーチンの定義部分だけを先に記述する方法で、後者は解決された)。
その結果一文字先読再帰下降型パーザを用いたワンパスコンパイル、すなわちソーステキストを一回走査するだけで実行ファイルを生成することが可能であった。尚、他言語のコンパイラでは、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とは別の言語である。
なお、ボーランドはその後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がある。
[編集] MacintoshとPascal
当初、Macintosh にはセルフ開発環境はなく、システムの開発およびアプリケーションのクロス開発用プラットフォームとして、もっぱらLisaが使用された。Lisaの公式開発言語はPascalであったためMacintosh Toolbox と呼ばれる API においても、その呼び出し手法が Pascal に準拠していたのはこうした理由による。
なお、このMacintoshの開発言語はオリジナルPascalではなく、ヴィルト自身が拡張したObject Pascalである。record機能をclassに拡張し、GUI環境構築の記述に実用性をもたせたものである。
[編集] Pascalの後継言語
ニクラス・ヴィルト自身がPascalを拡張した言語としてModula系の言語があり、Pascal系の言語に含まれている。Pascalの上位コンパチブルになっていないため、ヴィルトは新しい言語の名前にPascalを含めなかった。
- Modula - ?
- Modula-2 - モジュールの概念を追加し分割コンパイルなどを可能にした。ヴィルトは、Modula-2だけでOSを含むシステムを作って見せた。
- Modula-3 - オブジェクト指向言語へ拡張。
- Oberon - Modula-2の後継。
- Component Pascal - ?
[編集] Pascalに対する批判
Pascalは本来教育用を意図されていたこともあり簡素な文法が特徴だが、反面プロフェッショナルの用途には耐えないという批判がある。代表的なものは、C言語の開発者の一人カーニハンによる1981年の論文 "Why Pascal is Not My Favorite Programming Language" である。
[編集] 関連項目
[編集] 外部リンク
- Niklaus Wirth(英語)
- Pascal programming language(英語)
- FreePascal - PascalとObject Pascalのフリーなコンパイラ
- GNU Pascal - GCCの Pascal コンパイラ