Pascal

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

Pascal(パスカル)は、ニクラウス・ヴィルトの設計(デザイン)によるコンピュータ・プログラミング言語である。ALGOL(直接的にはその一派生[1]である、ヴィルトが関与したALGOL W(en:ALGOL W))などの影響があるが、個人の設計であることに由来する簡素だがよく整った言語仕様(構文と意味)を持つ。用途の中に教育を意識しており、構造化された制御構造など、その当時「良きプログラミングの慣習」と考えられていたことの影響もある。一方で批判者からは、あくまでも教育用に過ぎない言語だ、といったような評もあることにはあったが、PascalコンパイラをPascalで書ける(いわゆる言語処理系のブートストラップ)ことをはじめ[2]、Pascalで書かれた#実用プログラム例は多くある。名前は、哲学者・数学者・科学者で、機械式計算機を製作するなど技術者でもあったブレーズ・パスカルにあやかったものである[3]

言語仕様[編集]

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

Pascalの単純さは、例えば構文がLL(1)であることなどによく現れている(これは、プログラマに対して不親切なほどである。実際には多くの処理系が拡張しているが、本来の(構文がLL(1)の)Pascalでは、ラベルに普通に名前が使えず、数字による番号しか使えない)。全ての名札、定数、型名、変数、サブルーチン[5]は使用に先立って定義しておく必要がある(これもやはり不便である。プログラムのサブルーチンなどはボトムアップの順序で並べたほうがわかりやすいこともあれば、トップダウンで並べたほうがわかりやすいこともあるのに、ボトムアップ順を強制しているのである)。ポインタを用いたリストのような型の定義や、交互にサブルーチンが呼び合うためには、例外的な構文を使わねばならない。ポインタに限っては、参照される型の定義の前に、その型を参照するような定義ができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。

その結果、パーザはLL(1)パーザであり、バックエンドはいわゆるワンパスコンパイラであった(似たような長所が主張された処理系・言語にダートマスBASICがある)。なお、他言語のコンパイラでは、2回以上走査を行い、最初の走査で識別子等の情報を中心に情報収集を行い、後続の走査で、それらの情報を参照しつつ実行ファイルを生成するマルチパス形式のものが多かった[6]。ワンパスコンパイラであることは、絶望的に遅いフロッピディスクを作業ディスクとしてビルドするユーザさえ多かった、初期のパーソナルコンピュータでは大いに利点となった。 なお、Turbo Pascalの高速性はアセンブラで記述されていたことも一因であるが、Pascalの簡潔な仕様を活かし、かつ、メモリを使える限り使ってファイルアクセスを最小限に留めることで、前述のようなパーソナルコンピュータでも高速にコンパイルできた。

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

注目すべきは、C言語などでもALGOLと同様としている、変数などの定義の「int x」といったような「型名 変数名」という順序ではなく「var x : int」というような順になる、型名を後にした記法であろう。数学などで使われる記法の類似であるのでヴィルトの完全なオリジナルだとも言えないが、最初に述べたALGOL WではALGOLと同様であるので、プログラミング言語への導入としてはオリジナリティが高いものと考えられる(C言語では、もともと型があまり充実していなかったB言語から初期のC言語を経由して、徐々に型システムが充実した結果「void (*signal(int sig, void (*func)(int)))(int)」というような暗号解読が必要な宣言が現れるようなことになってしまっている)。この点について、JavaなどはC言語の構文の小改良にとどまっているが、LimboGo言語などC言語を使い尽した設計者らによる新言語が、Pascalに似た記法としていることは特筆事項であろう。なお、ALGOL系ではAdaも変数などの型の記述を、これに類似した構文としている。

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

実用プログラム例[編集]

著名なものに、TeX(TeXは特にその大規模さから、どんな実装でも少なくとも一つのバグがTeXによってあぶり出された、などと言われている)や初期のMacintoshオペレーティングシステムアプリケーション、などがある。

処理系も、2017年現在も多くのプラットフォームに多くの実装がある。

初期の処理系実装[編集]

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

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

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

標準[編集]

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

アルゴリズムの記述に[編集]

以前ならばALGOLが使われていたであろう、論文や学会誌等におけるアルゴリズムの記述に、ALGOLに代わってPascalは使われるようになった。

アルゴリズムの教科書に[編集]

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

パーソナルコンピュータとPascal[編集]

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

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

Turbo Pascalとその後継[編集]

1983年にBorlandが発売したTurbo Pascalは(当初はZ80マシンのCP/Mで動作する)、大変高速な1パスコンパイラ兼開発環境である。続いて8086マシン用(CP/M-86, MS-DOS)がリリースされ、1980年代後半〜1990年代前半に一般個人が所有するパーソナルコンピュータの環境として最も数の多かったMS-DOSにおいて大きな人気を得た。ビルドの高速さは、「コンパイラは、コンパイル時間があるので不便だ」という意識を、十分に速い環境であればたいして気にならないのだ、という事実を示して塗り替えた。さらにWordStar風のキー操作を持った、当時としては高機能なフルスクリーンエディタを備えていながら低価格であったため、日本では「フルスクリーンエディタを買うと、おまけに高速な Pascal コンパイラが付いてくる」とまで言われたほどである。[要出典]

「Turbo Pascal」は、版を重ねるにつれてモジュール機能やオブジェクト指向の拡張を加え、「Pascal処理系の実装としての名前」というよりも「Pascal を拡張した言語の名前」となった。オブジェクト指向の拡張はやがてObject Pascalという言語として認知されるようになった。BorlandはObject Pascalの開発環境をより充実させた製品としてDelphiをリリースした。しばらくは言語名はObject Pascalであるとしていたが、バージョン7で言語名もDelphiに変更した(言語そのものには、バージョンアップ以上の大きな変化は無い)。

Turbo Pascal と Delphi の成功によって、互換を謳った実装が OS/2UNIX 上でも開発されている。商用のものとしては Speed Pascal、Virtual Pascal があり、フリーソフトとしては Free Pascal(元 FPK Pascal)が広い範囲のプラットフォームで動作する。ISO 標準 Pascal を意識したものでは、GNU Pascal がある。また、Borland自身がDelphiをベースにして作ったGNU/Linuxシステム向け開発環境のKylixもある。

以上のように「Borlandの成功」が語られがちではあるが、実際のところ、Turbo Pascalの開発者であるアンダース・ヘルスバーグは、1990年代に(本人によればBorland社内で、「開発ツール部門の守護者」であった創業者フィリップ・カーンをはじめ、開発ツール部門を大幅に圧縮する内紛があったため)、Microsoftに移籍している。ヘルスバーグはMicrosoftでVJ++[12]などを担当した後、C♯を開発している。C♯は、C++とJavaが、似ているあるいは違っている程度には、やはりC++あるいはJavaと似ているあるいは違っている言語であるが、ヘルスバーグの経験が反映した設計がされており、Delphiの影響がある[13]が、「Object Pascal のブロック表記などをC言語風に置き換えた」と説明するのは間違っている。

MacintoshとPascal[編集]

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

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

後継や派生[編集]

ニクラス・ヴィルト自身によって、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[17]がある。

脚注[編集]

  1. ^ ALGOLは「委員会による言語」の罠におちいることなく標準としていったんは完成したが、その後最終的には「ALGOL 68」となる、その拡張にまつわる過程は混迷し、いわゆる「セカンドシステム症候群」として引き合いに出されることもある。そのため、多くの非標準の拡張が提案されたりしているが、そのうちの一つである。
  2. ^ ただし、ジャーゴンファイルのMFTLの項目の記述では、自身のコンパイラを書ける、というのは、MFTL話の(面白みのない)正準として挙げられている例ではある。
  3. ^ 日高哲郎による基本情報技術者の参考書(とりあえず、検索するとそれが出てきたので)には「Philips' Automatic Sequence CALculator」と書いてあるが、それはオランダで1960年頃作られた、この言語とは全く無関係のPASCALという名前のコンピュータ(nl:PASCAL (computer) を参照)の名前の由来(ないしこじつけ)の英訳であり、無関係である。
  4. ^ 変数の内容がエイリアスである可能性の有無など、言語仕様と最適化は大いに関係がある。従って「言語仕様と最適化は独立した問題である」などということは、絶対に証明できない。
  5. ^ Pascalにおいては手続きprocedure)または関数function)と呼び、値を返しの中で用いうるものを特に関数と読んで区別する。
  6. ^ 当然である。ワンパスコンパイラではろくに最適化などできないのであるから。もし、高度な最適化が可能なことを証明する目的なら、ワンパスコンパイラという選択はありえない。
  7. ^ Wirth (1986) pp.318-319
  8. ^ 『Pascal』第二版 p.106
  9. ^ 『Pascal』第二版 p.99
  10. ^ Per Brinch Hansen 『並行動作プログラムの構造』 田中英彦訳、日本コンピュータ協会、1980年
  11. ^ THE UCSD P-SYSTEM MUSEUM”. THE JEFFERSON COMPUTER MUSEUM (2004年). 2015年8月28日閲覧。
  12. ^ それ自体としては、「非互換のJava」としてのSunとの紛争で悪名高い。
  13. ^ http://softwareengineering.stackexchange.com/questions/96793/in-what-specific-ways-did-delphi-influence-the-c-language/96927#96927
  14. ^ 並列(パラレル)ではない
  15. ^ ホーアThe Emperor's Old Clothes も参照。
  16. ^ その程度ならRubyだって似ていると強弁できてしまうが。
  17. ^ https://www.lysator.liu.se/c/bwk-on-pascal.html

文献[編集]

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

外部リンク[編集]