Pascal

プログラミング言語 >>他のプログラミング言語 ■カテゴリ / ■テンプレート Pascal（パスカル）は、1970年に発表されたプログラミング言語。ニクラウス・ヴィルトにより構造化プログラミングとして設計・デザインされた。名称は、ブレーズ・パスカルにちなむ。 ALGOL、ALGOL Wをベースとし、簡素だがよく整った言語仕様（構文と意味）を持つ。プログラミング教育を意識しており、「判読性」を重視している反面、「最適化」を犠牲にしていると批判もされた。 言語的には、自身のコンパイラを自身で書けるといった、言語処理系のブートストラップを備え、多くの#実用プログラム例を持っている。 教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身がPascalコンパイラをPascal自身で書いてみせ、その能力を示した（後のModula-2では、オペレーティングシステムをModula-2で書いてみせた）。当時 FORTRAN 以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。[要出典] Pascalの単純さは、例えば構文がLL(1)であることなどによく現れている。全ての名札、定数、型名、変数、サブルーチンは使用に先立って定義しておく必要がある。ポインタを用いたリストのような型の定義や、交互にサブルーチンが呼び合うためには、例外的な構文を使わねばならない。ポインタに限っては、参照される型の定義の前に、その型を参照するような定義ができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。 その結果、パーサはLL(1)パーサであり、バックエンドはいわゆるワンパスコンパイラであった。なお、他言語のコンパイラでは、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では静的配列のみをサポートする。これはコンパイル時にサイズが決定され、実行中はサイズを変更できない。しかし実際のプログラムは実行するまでサイズが決められないことが多く、後発の言語は実行中にサイズを変更できる動的配列をサポートしている。 著名なものに、TeX、初期のMacintoshのオペレーティングシステムおよびアプリケーションなどがある。 処理系に関しても、2019年現在も多くのプラットフォームに多くの実装がある。 AVRco - マイクロプロセッサ用の Pascal。 Delphi - 現在最もメジャーな Pascal。 DWScript - Delphi用のスクリプトエンジン。 Free Pascal - オープンソースの Pascal。 GNU Pascal - オープンソースの Pascal。 IP Pascal - 標準 Pascal をベースに拡張された Pascal。 mikropascal - マイクロプロセッサ用の Pascal。 Modern Pascal - Free Pascalで書かれたマルチプラットフォームのインタプリタおよびP-Codeコンパイラ。 NewPascal - Lazarus / Free Pascal のフォーク。 Open Sibyl - Speedsoft Sibyl のオープンソース実装。 Oxygene - .NET 用の Object Pascal。 PascalABC.NET - .NET 用の Object Pascal。 Pascal Script - DelphiまたはFree Pascalプロジェクト内で使えるスクリプトエンジン。 Pascal-P5 - 標準 Pascal に準拠したフルセットの Pascal-P。 PICco - マイクロプロセッサ用の Pascal。 THINK Pascal - Classic MacOS 用の 4.5d4 が無償公開されている。 Turbo Rascal - Commodore 64/128、VIC-20、Nintendo ファミリーコンピュータ向けのクロスコンパイラ。 Turbo51 - 8051 マイクロプロセッサ用の Pascal。 Ultibo - Raspberry Pi ベアメタルプログラミング用環境（Lazarus / Free Pascal のカスタマイズ）。 Vector Pascal - MMXやAMD 3d NowなどのSIMD命令セット用のPascal。 Virtual Pascal - DOS、Windows、OS/2用 WDSibyl - Speedsoft Sibyl のオープンソース実装。 最初のPascalコンパイラは、CDC 6000 シリーズ用に1970年に書かれた1パスコンパイラで、それ自身が Pascal で書かれていた。CDC 6000 シリーズは 1ワードが 60ビットのマシンであった。Pascal には、メモリを節約するための詰め合わせ機能(pack/unpack)や、10文字（1文字は6ビット）の詰め合わせ文字列である alfa 型の存在、長いワードをビットごとに扱うための集合型など、CDC のアーキテクチャの影響を受けた箇所がある。CDC 用のコンパイラは、extern 宣言によって外部ライブラリを読み込むことができた。 1972年から1974年にかけてチューリッヒ工科大学で書かれたPascal-Pは、Pascal からP コードへのコンパイラと、Pコードインタプリタからなる中間言語コンパイラで、やはり Pascal 自身で書かれていた。このことにより、後の Java が異なるアーキテクチャの計算機への移植が進んだのと同様、多くの計算機への移植が進んだ。中間言語コンパイラを移植するためには、仮想スタックマシンであるPコードマシンのエミュレータを移植元の機械で開発し、コンパイラを移植先の機械でコンパイルするだけで良い。1970 - 80年代の低速な計算機では、このような中間言語方式では性能が不十分だった。Pascal-PにはPascal-P1・Pascal-P2・Pascal-P3・Pascal-P4の4つのバージョンがあるが、いずれもPascalのサブセット実装となっている。 1975年にニクラウス・ヴィルトがインタプリタであるPascal-Sを書いた。サブセットであるとはいえ、このPascalのソースコードは2,000行程しかない。 同じく1975年にカリフォルニア工科大学で Pascal を並列動作用に拡張したConcurrent Pascalが開発され、それを使ってシングルユーザのオペレーティングシステムを開発し、Pascal がシステムプログラミングにも優れていることを明らかにした。 1978年にカリフォルニア大学サンディエゴ校（UCSD）でPascal-P2をベースにしたUCSD Pascalが開発された。これは、異なるプラットフォームに移植できるカスタムオペレーティングシステム（UCSD p-System）上で実行可能なバージョンである。Appleもライセンスを取得し、Apple IIやApple IIIへ移植されている。 日本では、1979年にシャープ製MZシリーズ向けに「Tiny PASCAL PALL」として発売されている。 ISOではPascalを1983年にISO 7185として標準化し現在は1990年版である。対応する日本の規格はJIS X 3008-1990で、改訂版は1994である。標準 Pascal には水準0と水準1があり、後者は長さの異なる配列を引数に取るための整合配列が使える。また、拡張規格としてISO/IEC 10206が1991年に策定された。1993年のオブジェクト指向拡張の規格はドラフトで終わっている。 以前ならばALGOLが使われていたであろう、論文や学会誌等におけるアルゴリズムの記述に、ALGOLに代わってPascalは使われるようになった。 Pascal は、アルゴリズムの教科書にしばしば使われた。ヴィルト自身による『アルゴリズム+データ構造=プログラム』をはじめ、エイホ・ホップクロフト・ウルマン『データ構造とアルゴリズム』などは Pascal を使用している。 1970年代末のパソコン上のシステムでは、Apple II や Z80 システムで動作する UCSD Pascalが動いていた。UCSD Pascal はPコードを使った中間コードコンパイラで、文字列型・case文の拡張・ユニットを使った Modula-2 風の分割コンパイルなどをサポートしており、言語以外にメニューを使ったユーザーインターフェースも優れていた。 ほかに、デジタルリサーチの Pascal/MT+ やJRTシステムズ社の JRT pascal（日本ではライフボートが αPascal として販売した）などが販売されていた。 1983年にボーランドが発売したTurbo Pascalは（当初はZ80マシンのCP/Mで動作する）、大変高速な1パスコンパイラ兼開発環境である。続いて8086マシン用（CP/M-86, MS-DOS）がリリースされ、1980年代後半〜1990年代前半に一般個人が所有するパーソナルコンピュータの環境として最も数の多かったMS-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もある。 以上のように「ボーランドの成功」が語られがちではあるが、実際のところ、Turbo Pascalの開発者であるアンダース・ヘルスバーグは、1990年代にマイクロソフトに移籍している。ヘルスバーグはマイクロソフトでVJ++などを担当した後、C#を開発している。C#は、C++とJavaの基本文法や特徴をベースに、ヘルスバーグの経験が反映された設計がなされており、DelphiおよびBorland C++ Builderの影響もあるが、「Object Pascal のブロック表記などをC言語風に置き換えた」と説明するのは間違っている。 当初、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 - 言語を拡張して強力にするのではなく、拡張可能にしてコア部分は小さくする、という方向性で設計されている。 その他の言語ないし実装 Object Pascal - オブジェクト指向的拡張 Concurrent Pascal - コンカレント（並行）拡張 Component Pascal Ada - アメリカ国防総省の意向で策定された多機能な言語。PascalないしAlgolの影響が大きいが、Pascalの「簡潔に」とは正反対の巨大化という方向性はALGOL 68（en:ALGOL 68）の魂の影響があるかもしれない 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がある。 初期の批判にもかかわらずPascalは進化し続けた。そしてカーニハンの批判ポイントの殆どは商用バージョンのPascalに当てはまらなくなった。例えば論文The Pascal Programming LanguageのMyth 6節で拡張Pascalの言語仕様に基づき、論文The Macintosh Programmer's Workshopでは、Object Pascal（MPW Pascal）の言語仕様に基づき、批判ポイントの殆どは克服していると語られている。 ALGOL