Pascal
この記事には複数の問題があります。改善やノートページでの議論にご協力ください。
|
パラダイム | 命令型、構造化プログラミング |
---|---|
登場時期 | 1970年 (1970) |
設計者 | ニクラウス・ヴィルト |
型付け | 強い静的型付け |
主な処理系 | CDC 6000、Delphi、ICL 1900、Pascal-P、PDP-11、PDP-10、IBM System/370、HP Pascal、Free Pascal、GNU Pascal |
方言 | Delphi、Turbo Pascal、UCSD Pascal |
影響を受けた言語 | ALGOL W |
影響を与えた言語 | Ada、Component Pascal、Go、Java[1]、Modula/-2/-3、Oberon/-2、Object Pascal、Oxygene、Seed7 |
拡張子 | .pp 、.pas 、.inc |
Pascal(パスカル)は、1970年に発表された言語。ニクラウス・ヴィルトにより構造化プログラミングとして設計・デザインされた。名称は、ブレーズ・パスカルにちなむ。
ALGOL、ALGOL Wをベースとし、簡素だがよく整った言語仕様(構文と意味)を持つ。プログラミング教育を意識しており、「判読性」を重視している反面、「最適化」を犠牲にしていると批判もされた。
言語的には、自身のコンパイラを自身で書けるといった、言語処理系のブートストラップを備え、多くの#実用プログラム例を持っている。
日本では、1979年にシャープ製MZシリーズ向けに「Tiny PASCAL PALL」として発売されている[2]。
目次
1 言語仕様
2 実用プログラム例
3 初期の処理系実装
4 標準
5 アルゴリズムの記述に
6 アルゴリズムの教科書に
7 パーソナルコンピュータとPascal
7.1 Turbo Pascalとその後継
7.2 MacintoshとPascal
8 後継や派生
9 批判
10 脚注
11 文献
12 外部リンク
言語仕様
教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身がPascalコンパイラをPascal自身で書いてみせ、その能力を示した(後のModula-2では、オペレーティングシステムをModula-2で書いてみせた)。当時 FORTRAN 以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。[要出典][3]
Pascalの単純さは、例えば構文がLL(1)であることなどによく現れている[4]。全ての名札、定数、型名、変数、サブルーチン[5]は使用に先立って定義しておく必要がある。ポインタを用いたリストのような型の定義や、交互にサブルーチンが呼び合うためには、例外的な構文を使わねばならない。ポインタに限っては、参照される型の定義の前に、その型を参照するような定義ができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。
その結果、パーサはLL(1)パーサであり、バックエンドはいわゆるワンパスコンパイラであった[6]。なお、他言語のコンパイラでは、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環境で動作する後発言語も、型を後置する記法を採用している。
コンパイル時にできるだけ多くの不注意による誤りを発見できる、強く型付けされた(strongly typed)言語であり、またハードウェアを隠蔽する思想が徹底している。たとえば集合型、ポインタ型はそれぞれビットマップとアドレスを抽象化したものと考えられる。また Pascal は教育用ということもあり、最初の仕様では分割コンパイルや外部ライブラリの利用が考慮されていなかった。これは大規模なプログラムを記述したり、ハードウェアを直接操作するプログラムを記述するには不便な仕様であり、入出力の扱いなど処理系に依存しなければならない部分を言語の中に抱える結果に繋がった。たとえばファイル型変数に特定のファイルを関連付ける標準的な方法はない。ヴィルト自身は Modula-2 でこれらの要請に応える一方で、Pascalでは実装のベンダがそれぞれ独自の拡張を施して、分割コンパイルやハードウェアの直接操作を可能としたが、この部分の互換性は乏しい。
実用プログラム例
著名なものに、TeX[7]、初期のMacintoshのオペレーティングシステムおよびアプリケーションなどがある。
処理系に関しても、2017年現在も多くのプラットフォームに多くの実装[要説明]がある。
初期の処理系実装
最初のPascalコンパイラは、CDC 6000 シリーズ用に1970年に書かれた1パスコンパイラで、それ自身が Pascal で書かれていた[8]。CDC 6000 シリーズは 1ワードが 60ビットのマシンであった。Pascal には、メモリを節約するための詰め合わせ機能(pack/unpack)や、10文字(1文字は6ビット)の詰め合わせ文字列である alfa 型の存在[9]、長いワードをビットごとに扱うための集合型など、CDC のアーキテクチャの影響を受けた箇所がある。CDC 用のコンパイラは、extern 宣言によって外部ライブラリを読み込むことができた[10]。
1975年にカリフォルニア工科大学で Pascal を並列動作用に拡張した Concurrent Pascal が開発され、それを使ってシングルユーザのオペレーティングシステムを開発し、Pascal がシステムプログラミングにも優れていることを明らかにした[11]。
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 II や Z80 システムで動作する UCSD Pascal(後に対応言語を増やして UCSD p-System に発展)が動いていた[12]。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/2 や UNIX 上でも開発されている。商用のものとしては Speed Pascal、Virtual Pascal があり、フリーソフトとしては Free Pascal(元 FPK Pascal)が広い範囲のプラットフォームで動作する。ISO 標準 Pascal を意識したものでは、GNU Pascal がある。また、Borland自身がDelphiをベースにして作ったGNU/Linuxシステム向け開発環境のKylixもある。
以上のように「Borlandの成功」が語られがちではあるが、実際のところ、Turbo Pascalの開発者であるアンダース・ヘルスバーグは、1990年代にMicrosoftに移籍している[13]。ヘルスバーグはMicrosoftでVJ++などを担当した後、C#を開発している。C#は、C++とJavaの基本文法や特徴をベースに、ヘルスバーグの経験が反映された設計がなされており、DelphiおよびBorland C++ Builderの影響もある[14]が、「Object Pascal のブロック表記などをC言語風に置き換えた」と説明するのは間違っている。
MacintoshとPascal
当初、Macintosh にはセルフ開発環境はなく、システムの開発およびアプリケーションのクロス開発用プラットフォームとして、もっぱら Lisa を使用した。Lisa の公式開発言語は Pascal だったため Macintosh Toolbox と呼ぶ API においても、その呼び出し手法が Pascal に準拠していたのはこうした理由による。
なお、この Macintosh の開発言語は原初の Pascal ではなく、ヴィルト自身が拡張した Object Pascal である。record
を class
に拡張し、GUI 環境構築の記述に実用性を持たせたものである。
後継や派生
ニクラス・ヴィルト自身によって、Pascalや他の言語の経験にもとづき、後継と言える言語が設計されている。Pascalとの互換性を残した拡張といったようなスタイルではなく、そのため名前にもPascalを含めていない。
- Modula - モジュール化などを指向した。Modula-2の方へ移ったため実質未完成。途上版のコンパイラだけがリリースされたらしい[要出典]。
Modula-2 - モジュール化などの機能を追加した。ヴィルトは、Modula-2だけでオペレーティングシステムを含むシステムを作って見せた。
Modula-3 - オブジェクト指向など。
Oberon, Oberon-2 - 言語を拡張して強力にするのではなく、拡張可能にしてコア部分は小さくする、という方向性で設計されている。
その他の言語ないし実装
Object Pascal - オブジェクト指向的拡張- Concurrent Pascal - コンカレント(並行[15])拡張
- Component Pascal
Ada - アメリカ国防総省の意向で策定された多機能な言語。PascalないしAlgolの影響が大きいが、Pascalの「簡潔に」とは正反対の巨大化という方向性はALGOL 68(en:ALGOL 68)の魂の影響があるかもしれない[16]
VHDL - Adaの影響が多大なハードウェア記述言語
Verilog HDL - C言語風やPascal風などともいわれるが、どちらにも似ていないハードウェア記述言語
SystemVerilog - Verilogの拡張
Delphi - Object Pascal を、さらに拡張している。IDEによるGUIアプリの開発支援もある統合環境が用意された。
Eiffel - 構文がPascalに似ている、とも言われるオブジェクト指向言語
批判
「本物のプログラマはPascalを使わない」というエッセイは、そのタイトルだけは有名だが、Pascalについては実のところ、構造化プログラミングの代名詞のような感じで引き合いに出されているだけであり、その内容についても、当のハッカーたちからも否定と肯定が半々といった所である(例えばジャーゴンファイルでは、用語集本体では否定的に、附録では肯定的に言及している)。
本格的な批判の文章としては、カーニハンによるWhy Pascal is Not My Favorite Programming Language[17]がある。
脚注
^ “A Conversation with James Gosling - ACM Queue”. 2015年8月11日閲覧。
^ 工学舎 月刊I/O 1979年12月号 PASCAL時代がやってきた! mz-80k用Tiny PASCAL「PALL」全リスト公開
^ 変数の内容がエイリアスである可能性の有無など、言語仕様と最適化は大いに関係がある。従って「言語仕様と最適化は独立した問題である」などということは証明できない。[要出典]
^ これは、プログラマに対して不親切なほどである。実際には多くの処理系が拡張しているが、本来の(構文がLL(1)の)Pascalでは、ラベルに普通に名前が使えず、数字による番号しか使えない。[要出典]
^ Pascalにおいては手続き(procedure
)または関数(function
)と呼び、値を返し式の中で用いうるものを特に関数と読んで区別する。
^ 似たような長所が主張された処理系・言語にダートマスBASICがある。
^ TeXは特にその大規模さから、どんな実装でも少なくとも一つのバグがTeXによってあぶり出された、などと言われている。
^ Wirth, Niklaus 1986, pp. 318-319.
^ 『Pascal』第二版 イェンゼン & ヴィルト 1981, p. 106
^ 『Pascal』第二版 イェンゼン & ヴィルト 1981, p. 99
^ Per Brinch Hansen 1980.
^ “THE UCSD P-SYSTEM MUSEUM”. THE JEFFERSON COMPUTER MUSEUM (2004年). 2015年8月28日閲覧。
^ 本人によればBorland社内で、「開発ツール部門の守護者」であった創業者フィリップ・カーンをはじめ、開発ツール部門を大幅に圧縮する内紛があったため。
^ http://softwareengineering.stackexchange.com/questions/96793/in-what-specific-ways-did-delphi-influence-the-c-language/96927#96927
^ 並列(パラレル)ではない
^ ホーアの The Emperor's Old Clothes doi:10.1145/358549.358561も参照。
^ https://www.lysator.liu.se/c/bwk-on-pascal.html
文献
- Per Brinch Hansen 『並行動作プログラムの構造』 田中英彦訳、日本コンピュータ協会〈コンピュータ・サイエンス研究書シリーズ〉、1980年。NCID BN01967499。
Charles Antony Richard Hoare (1981-02). “The emperor's old clothes”. Magazine Communications of the ACM (New York: ACM) 24 (2): 75-83. doi:10.1145/358549.358561.
- K・イェンゼン、N・ヴィルト 『PASCAL』 原田賢一訳、培風館〈情報処理シリーズ, 2〉、1981年、原書第二版。ISBN 456300782X。
- Wirth, Niklaus 「プログラミング言語:要求項目と評価方法」『Ada, C, Pascal』 アラン・フォイヤー; ナレイン・ゲハーニ、宇井康隆訳、工学社、1986年、305-325頁。ISBN 4875930844。
- K・イェンゼン、N・ヴィルト、A.B. ミケル、J.F. マイナー 『PASCAL』 原田賢一訳〈情報処理シリーズ, 2〉、1993年10月、原書第4版。ISBN 4-563-01466-4。
外部リンク
FreePascal - Pascal と Object Pascal のフリーなコンパイラ
GNU Pascal - GCCのコンパイラ
|