この項目では、プログラミング言語について説明しています。その他の用法については「パスカル (曖昧さ回避) 」をご覧ください。
Pascal (パスカル)は、1970年に発表されたプログラミング言語 。ニクラウス・ヴィルト により構造化プログラミング のサポート等を特徴として設計・デザインされた。名称は、ブレーズ・パスカル にちなむ。
ALGOL 、特にALGOL W をベースとし、簡素だがよく整った言語仕様(構文と意味)を持つ。プログラミング教育を意識しており、「判読性」を重視している反面、「最適化」を犠牲にしていると批判もされた [要出典 ] 。言語的には、自身のコンパイラ を自身で書けるといった、セルフホスティング の能力がある。また、多くの#実用プログラム例 を持っている。
教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身がPascalコンパイラ をPascal自身で書いてみせ、その能力を示した(後のModula-2では、オペレーティングシステムをModula-2で書いてみせた)。当時FORTRAN 以外のコンパイラは生成される機械語 が冗長で最適化 が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。 [要出典 ]
Pascalの単純さは、例えば構文がLL(1) であることなどによく現れている[ 注釈 1] 。全ての名札、定数、型名、変数、サブルーチン [ 注釈 2] は使用に先立って定義しておく必要がある。ポインタ を用いたリストのような型の定義や、交互にサブルーチンが呼び合うためには、例外的な構文を使わねばならない。ポインタに限っては、参照される型の定義の前に、その型を参照するような定義ができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。
その結果、パーサはLL(1)パーサであり、バックエンドはいわゆるワンパスコンパイラであった[ 注釈 3] 。なお、他言語のコンパイラでは、2回以上走査を行うマルチパス形式のものが多かった。マルチパス形式では、最初の走査で識別子等の情報を中心に情報収集を行い、後続の走査でそれらの情報を参照しつつ実行ファイルを生成するため、コンパイル速度面では不利だが、最適化の点で有利となる。絶望的に遅いフロッピーディスク を作業ディスクとするユーザが多かった初期のパーソナルコンピュータでは、ワンパスコンパイラであることは大いに利点となった。なお、Turbo Pascalの高速性は、アセンブラ で記述されていたことも一因であるが、Pascalの簡潔な仕様を活かしメモリを使える限り使ってファイルアクセスを最小限に留めることで実現された。
ALGOL由来の制御構造、サブルーチンの中に、そのサブルーチン内からのみ見えるローカルな変数、そのサブルーチン内からのみ呼び出せるサブルーチン等を定義できるといった、スコープの概念と再帰的 な構文構造(ブロック構造 と呼ぶ)、静的スコープ による参照の局所化機能を持つ。さらに、豊富なデータ型 と、COBOL に見られた構造体 を含む新しいデータ型を定義できるという特徴も持っている。レコード型とポインタを用いてリスト 、木 といったデータ構造を自由に構築することができる(二分木#データの二分木への格納法 の例参照)。なお由来は不明だが、最後にピリオドを付けるという、微妙にALGOLの構文と違う点がある。
Pascalの注目すべきは、変数の宣言を「変数名、型名」の順序とした記法であろう。ALGOLを源流とするC言語 などでは、変数などの定義でint xといったような「型名 変数名」という順序で記述される。一方、Pascalでは「var x : int」というような、「変数名 型名」の順序で記述する。この記法は数学などと類似の記法であるため、ヴィルトの完全なオリジナルだとは言いにくいが、最初に述べたALGOL WではALGOLと同様であるので、プログラミング言語への導入としてはオリジナリティが高いものと考えられる。この点について、Java などはC言語の構文の小改良にとどまっているが、Limbo やGo言語 などC言語を使い尽した設計者らによる新言語が、Pascalに似た記法としていることは特筆事項であろう。なお、ALGOL系ではAda も変数などの型の記述を、これに類似した構文としている。Scala やKotlin といったJava VM 環境で動作する後発言語も、型を後置する記法を採用している。この表記法は型推論 の普及に伴って良い方向に働いた。型名を前置する言語では、「=」の左辺において、型名があれば変数の宣言と初期化、変数名だけなら代入として区別できるが、型推論では型名が省略されてしまうため区別できなくなる。その結果、C++ やD では「auto」などの接頭辞が必要で、初学者にとってはautoのような型があるかのようにみえてしまう。型名を後置する言語ではそのような問題はない。
コンパイル時にできるだけ多くの不注意による誤りを発見できる、強く型付けされた(strongly typed)言語であり、またハードウェアを隠蔽する思想が徹底している。たとえば集合 型、ポインタ型はそれぞれビットマップ とアドレス を抽象化したものと考えられる。また Pascal は教育用ということもあり、最初の仕様では分割コンパイル や外部ライブラリ の利用が考慮されていなかった。これは大規模なプログラムを記述したり、ハードウェアを直接操作するプログラムを記述するには不便な仕様であり、入出力の扱いなど処理系に依存しなければならない部分を言語の中に抱える結果に繋がった。たとえばファイル型変数に特定のファイルを関連付ける標準的な方法はない。ヴィルト自身は Modula-2 でこれらの要請に応える一方で、Pascalでは実装のベンダがそれぞれ独自の拡張を施して、分割コンパイルやハードウェアの直接操作を可能としたが、この部分の互換性は乏しい。
配列 についても問題点が発覚した。Pascalでは静的配列のみをサポートする。これはコンパイル時にサイズが決定され、実行中はサイズを変更できない。しかし実際のプログラムは実行するまでサイズが決められないことが多く、後発の言語は実行中にサイズを変更できる動的配列をサポートしている。
著名なものに、Te X [ 注釈 4] 、初期のMacintosh のオペレーティングシステム およびアプリケーション などがある。
処理系に関しても、2025年現在も多くのプラットフォームに多くの実装がある。
最初のPascalコンパイラは、CDC 6000 シリーズ用に1970年に書かれた1パスコンパイラで、それ自身が Pascal で書かれていた[ 20] 。CDC 6000 シリーズは 1ワード が 60ビットのマシンであった。Pascal には、メモリを節約するための詰め合わせ機能(pack/unpack)や、10文字(1文字は6ビット)の詰め合わせ文字列である alfa 型の存在[ 21] 、長いワードをビットごとに扱うための集合型など、CDC のアーキテクチャの影響を受けた箇所がある。CDC 用のコンパイラは、extern 宣言によって外部ライブラリを読み込むことができた[ 22] 。
1972年から1974年にかけてチューリッヒ工科大学 で書かれたPascal-P[ 23] は、Pascal からP コード へのコンパイラと、Pコードインタプリタからなる中間言語コンパイラで、やはり Pascal 自身で書かれていた。このことにより、後の Java が異なるアーキテクチャの計算機への移植が進んだのと同様、多くの計算機への移植が進んだ。中間言語コンパイラを移植するためには、仮想スタックマシンであるPコードマシンのエミュレータを移植元の機械で開発し、コンパイラを移植先の機械でコンパイルするだけで良い。1970 -80年代 の低速な計算機では、このような中間言語方式では性能が不十分だった。Pascal-PにはPascal-P1・Pascal-P2・Pascal-P3・Pascal-P4の4つのバージョンがあるが、いずれもPascalのサブセット実装となっている。
1975年にニクラウス・ヴィルト がインタプリタであるPascal-S[ 24] を書いた。サブセットであるとはいえ、このPascalのソースコードは2,000行程しかない。
同じく1975年にカリフォルニア工科大学 で Pascal を並列動作用に拡張したConcurrent Pascal が開発され、それを使ってシングルユーザのオペレーティングシステムを開発し、Pascal がシステムプログラミング にも優れていることを明らかにした[ 25] 。
1978年にカリフォルニア大学サンディエゴ校 (UCSD)でPascal-P2をベースにしたUCSD Pascal が開発された。これは、異なるプラットフォームに移植できるカスタムオペレーティングシステム(UCSD p-System )上で実行可能なバージョンである。Apple もライセンスを取得し、Apple II やApple III へ移植されている。
日本では、1979年にシャープ 製MZシリーズ 向けに「Tiny PASCAL PALL」として発売されている[ 26] 。
ISOではPascalを1983年 にISO 7185 として標準化し現在は1990年版である。対応する日本の規格はJIS X 3008-1990で、改訂版は1994である。標準 Pascal には水準0と水準1があり、後者は長さの異なる配列を引数に取るための整合配列が使える[ 27] 。また、拡張規格としてISO/IEC 10206 が1991年に策定された。1993年のオブジェクト指向拡張の規格はドラフトで終わっている。
以前ならばALGOLが使われていたであろう、論文や学会誌等におけるアルゴリズムの記述に、ALGOLに代わってPascalは使われるようになった。
Pascal は、アルゴリズムの教科書にしばしば使われた。ヴィルト自身による『アルゴリズム+データ構造=プログラム』をはじめ、エイホ ・ホップクロフト ・ウルマン 『データ構造とアルゴリズム』などは Pascal を使用している。
1970年代末のパソコン上のシステムでは、Apple II やZ80 システムで動作するUCSD Pascal が動いていた[ 28] 。UCSD Pascal はPコードを使った中間コードコンパイラで、文字列型・case文の拡張・ユニットを使ったModula-2 風の分割コンパイルなどをサポートしており、言語以外にメニューを使ったユーザーインターフェースも優れていた。
ほかに、デジタルリサーチ の Pascal/MT+ やJRTシステムズ社の JRT pascal(日本ではライフボート が αPascal として販売した)などが販売されていた。
1983年にボーランド が発売したTurbo Pascalは(当初はZ80マシンのCP/M で動作する)、大変高速な1パスコンパイラ兼開発環境である。続いて8086マシン用(CP/M-86 ,DOS )がリリースされ、1980年代後半〜1990年代前半に一般個人が所有するパーソナルコンピュータの環境として最も数の多かったDOSにおいて大きな人気を得た。ビルドの高速さは、「コンパイラは、コンパイル時間があるので不便だ」という意識を、十分に速い環境であればたいして気にならないのだ、という事実を示して塗り替えた。さらにWordStar 風のキー操作を持った、当時としては高機能なフルスクリーンエディタ を備えていながら低価格であったため、日本では「フルスクリーンエディタを買うと、おまけに高速なPascalコンパイラが付いてくる」とまで言われたほどである。 [要出典 ]
「Turbo Pascal」は、版を重ねるにつれてモジュール機能やオブジェクト指向 の拡張を加え、「Pascal処理系の実装としての名前」というよりも「Pascal を拡張した言語の名前」となった。オブジェクト指向の拡張はやがてObject Pascal という言語として認知されるようになった。ボーランドはObject Pascalの開発環境をより充実させたWindows向けの製品としてDelphi をリリースした。
Turbo Pascal と Delphi の成功によって、互換を謳った実装が開発されている。商用のものとしては Speed Pascal、Virtual Pascal、マイクロソフト のQuickPascal があり、フリーソフトとしてはFree Pascal (元 FPK Pascal)が広い範囲のプラットフォームで動作する。ISO 標準 Pascal を意識したものでは、GNU Pascal がある。また、ボーランド自身がDelphiをベースにして作ったGNU/Linux 向け開発環境のKylix もある。
当初、Macintoshにはセルフ開発環境はなく、システムの開発およびアプリケーションのクロス開発用プラットフォームとして、もっぱらLisa 上でIDE のLisa Workshopを使用した。Lisaの公式開発言語はPascalだったためMacintosh Toolboxと呼ぶAPIにおいても、その呼び出し手法 がPascalに準拠していたのはこうした理由による。Lisa PascalはSilicon Valley Software社の68000用ネイティブコードコンパイラをライセンス取得したもので、後にオブジェクト指向を取り入れたClascalに進化する。
後に登場したMacintosh用セルフ開発環境Macintosh Programmer's Workshop (英語版 ) (MPW)にはヴィルト と Apple のラリー・テスラー 率いるチームが開発したObject Pascal が含まれていた。これはClascalの言語仕様を整理・発展させたものである。この環境で書かれていたアプリケーションとしてAdobe Photoshop がある。
ニクラス・ヴィルト自身によって、Pascalや他の言語の経験にもとづき、後継と言える言語が設計されている。Pascalとの互換性を残した拡張といったようなスタイルではなく、そのため名前にもPascalを含めていない。
Modula - モジュール化などを指向した。Modula-2の方へ移ったため実質未完成。途上版のコンパイラだけがリリースされたらしい [要出典 ] 。 Modula-2 - モジュール化などの機能を追加した。ヴィルトは、Modula-2だけでオペレーティングシステムを含むシステムを作って見せた。Modula-3 -オブジェクト指向 など。Oberon ,Oberon-2 - 言語を拡張して強力にするのではなく、拡張可能にしてコア部分は小さくする、という方向性で設計されている。その他の言語ないし実装
「本物のプログラマはPascalを使わない 」というエッセイは、そのタイトルだけは有名だが、Pascalについては実のところ、構造化プログラミング の代名詞のような感じで引き合いに出されているだけであり、その内容についても、当のハッカーたちからも否定と肯定が半々といった所である(例えばジャーゴンファイル では、用語集本体では否定的に、附録では肯定的に言及している)。本格的な批判の文章としては、カーニハン によるWhy Pascal is Not My Favorite Programming Language [ 30] がある。
初期の批判にもかかわらずPascalは進化し続けた。そしてカーニハン の批判ポイントの殆どは商用バージョンのPascalに当てはまらなくなった。例えば論文The Pascal Programming Language [ 31] のMyth 6節で拡張Pascalの言語仕様に基づき、論文The Macintosh Programmer's Workshop [ 32] では、Object Pascal(MPW Pascal)の言語仕様に基づき、批判ポイントの殆どは克服していると語られている。
^ これは、プログラマに対して不親切なほどである。実際には多くの処理系が拡張しているが、本来の(構文がLL(1)の)Pascalでは、ラベルに普通に名前が使えず、数字による番号しか使えない。 [要出典 ] (『PASCAL』(原書第4版)培風館 〈情報処理シリーズ, 2〉p. 221 中程、及び、p. 229 最上部)^ Pascalにおいては手続き (procedure)または関数 (function)と呼び、値を返し式 の中で用いうるものを特に関数と読んで区別する。 ^ 似たような長所が主張された処理系・言語にダートマスBASIC がある。 ^ Te Xは特にその大規模さから、どんな実装でも少なくとも一つのバグがTe Xによってあぶり出された、などと言われている。 ^ 並列(パラレル)ではない 低水準言語 高水準言語
1950年代 1960年代 1970年代 1980年代 1990年代 2000年代 2010年代 2020年代
架空の言語