Pascal
テンプレート:Otheruses テンプレート:プログラミング言語 テンプレート:Lang(パスカル)は、構造化された初期の代表的なプログラミング言語。
テンプレート:Lang は、1970年にスイスのチューリッヒ工科大学のニクラウス・ヴィルトが教育用プログラミング言語として開発し、テンプレート:Lang の影響を受けた簡素で厳密な構造化言語仕様を持つ。教育目的で広まり、実用的にも初期の テンプレート:Lang や テンプレート:Lang の オペレーティングシステム、アプリケーションの記述も テンプレート:Lang である。
ヴィルトは テンプレート:Lang で、文書とプログラムを生成する方法を例示している。現在でもパーソナルコンピュータ上の処理系が多数あり、多くの他のプログラミング言語、およびハードウェア記述言語の源泉になっている。名前は、世界で最初の機械式計算機を発明したブレーズ・パスカルの名前に因んだものである。
言語仕様
教育を主目的としつつ、コンパイラが記述できる程度に強力な言語を目指し、当初、ヴィルト自身が テンプレート:Lang コンパイラを テンプレート:Lang 自身で書いてみせ、その能力を示した(後の テンプレート:Lang では、オペレーティングシステムを テンプレート:Lang で書いてみせた)。当時 テンプレート:Lang 以外のコンパイラは生成される機械語が冗長で最適化が難しいと言われていたが、「言語仕様と最適化は独立した問題である」ことを証明するという目的もあったらしい。
テンプレート:Lang の単純さはLL(1) 文法で解析できるという言語的な特徴によく現れている。全ての名札、定数、型名、変数、サブルーチン[1]は使用に先立って定義しておく必要がある。ポインタ型を用いたリストを構築するための例外、交互にサブルーチンが呼び合うための例外的書法を導入した。ポインタ型に限っては、基になる型の定義の前に、その型の変数を参照するポインタ型を定義することができた。また、サブルーチンの定義部分だけを先に記述する方法で解決した。
その結果一文字先読再帰下降型パーザを用いたワンパスコンパイル、すなわちソーステキストを一回走査するだけで実行ファイルを生成することが可能だった。なお、他言語のコンパイラでは、2回以上走査を行い、最初の走査で識別子等の情報を中心に情報収集を行い、後続の走査で、それらの情報を参照しつつ実行ファイルを生成するマルチパス形式のものが多かった。また、C言語 などの文法は LL(1) 文法では説明できず、マルチパスを行う必要があった。後述の テンプレート:Lang テンプレート:Lang の高速性はアセンブラで記述されていたことも一因であるが、ワンパスによるコンパイルが可能な テンプレート:Lang 言語の仕様を活かし、かつ、作業領域を全てメモリ上に確保して、ファイルアクセスを最小限に留める特徴がある。
テンプレート:Lang 由来の構造化構文、サブルーチンの中に、そのサブルーチン内からのみ見えるローカルな変数、そのサブルーチン内からのみ呼び出せるサブルーチン等を定義できるといった、スコープの概念と再帰的な構文構造(ブロック構造と呼ぶ)、静的スコープによる参照の局所化機能を持つ。さらに、豊富なデータ型と、テンプレート:Lang に見られた構造体を含む新しいデータ型を定義できるという特徴も持っている。レコード型とポインタを用いてリスト、木といったデータ構造を自由に構築することができる(二分木#データの二分木への格納法の例参照)。それまでデータ構造といえば配列くらいしか知らないアマチュアプログラマにとっては、かなり衝撃的な言語だったろうことは想像に難くない。
コンパイル時にできるだけ多くの不注意な誤りを発見するため強力に型付けた言語であり、またハードウェアを隠蔽する思想が徹底している。たとえば集合型、ポインタ型はそれぞれビットマップとアドレスを抽象化したものと考えられる。また テンプレート:Lang は教育用ということもあり、最初の仕様では分割コンパイルや外部ライブラリの利用が考慮されていなかった。これは大規模なプログラムを記述したり、ハードウェアを直接操作するプログラムを記述するには不便な仕様であり、入出力の扱いなど処理系に依存しなければならない部分を言語の中に抱える結果に繋がった。たとえばファイル型変数に特定のファイルを関連付ける標準的な方法はない。ヴィルト自身は テンプレート:Lang の設計でこれらの要請に応える一方で、テンプレート:Lang 処理系のベンダがそれぞれ独自の拡張を施して、分割コンパイルやハードウェアの直接操作を可能としたが、この部分の互換性は乏しい。
初期の テンプレート:Lang
初期の テンプレート:Lang、またその派生 テンプレート:Lang は、テンプレート:Lang からP コードへのコンパイラと、Pコードインタプリタからなる、中間言語コンパイラだった。このことにより、後の テンプレート:Lang が異なるアーキテクチャの計算機への移植が進んだのと同様、多くの計算機への移植が進んだ。中間言語コンパイラを移植するためには、仮想スタックマシンであるPコードマシンのエミュレータを移植元の機械で開発し、コンパイラを移植先の機械でコンパイルするだけで良い。1970~80年代の低速な計算機では、このような中間言語方式では性能が不十分だった。
なお、Pコードマシンは負値の表現に「1の補数」を用いており、これは テンプレート:Lang テンプレート:Lang などにも引き継がれている。
パソコン用の テンプレート:Lang
初期のパソコン上のシステムでは、テンプレート:Lang や Z80 システムで動作する [[UCSD Pascal|テンプレート:Lang テンプレート:Lang]](後に対応言語を増やして テンプレート:Lang に発展)も存在したが、普及に最も貢献したのはボーランドの [[Turbo Pascal|テンプレート:Lang テンプレート:Lang]] である。 テンプレート:Lang テンプレート:Lang が登場するまでには デジタルリサーチ社 の テンプレート:Lang/テンプレート:Lang やJRTシステムズ社の JRT テンプレート:Lang(日本ではライフボートが αテンプレート:Lang として販売した)などが販売されていた。
テンプレート:Lang テンプレート:Lang とその後継
Z80 ベースの CP/M で動作する大変高速な1パスコンパイラ兼開発環境で(i8080/8085 ベースマシン、V30の8080エミュレーションモードでは動作しなかった)、従来の「コンパイラはコンパイル時間が長い」という常識を打ち破るに十分だった。さらに当時としては高機能なフルスクリーンエディタ(テンプレート:Lang テンプレート:Lang で記述していた)を備えていながら低価格であったため、テンプレート:要出典範囲8ビットの CP/M 版以外に16ビット版としてCP/M-86 版と テンプレート:Lang 版も開発された。
版を重ねるにつれてユニット(モジュール化)やオブジェクト指向の概念を取り入れていった。したがって、厳密に言えば テンプレート:Lang テンプレート:Lang と テンプレート:Lang とは別の言語である。
ボーランドにいた技術者が テンプレート:Lang テンプレート:Lang という言語を作成したが、トップ・スピード社は買収により テンプレート:Lang の開発を停止している。
ボーランドはその後 テンプレート:Lang テンプレート:Lang という、オブジェクト指向を取り入れた テンプレート:Lang を開発し、自社製品の テンプレート:Lang(デルファイ)に採用した。さらに テンプレート:Lang のバージョン7 より、言語名も テンプレート:Lang テンプレート:Lang から テンプレート:Lang と変更している。
また、マイクロソフトは テンプレート:要出典範囲し、同社の主力開発言語として、その普及を推進している。
テンプレート:Lang テンプレート:Lang と テンプレート:Lang の成功によって、互換性を謳った言語処理系が テンプレート:Lang や テンプレート:Lang 上でも開発されている。商用のものとしては テンプレート:Lang テンプレート:Lang、テンプレート:Lang テンプレート:Lang があり、フリーソフトとしては [[Free Pascal|テンプレート:Lang テンプレート:Lang]](元 FPK テンプレート:Lang)が広い範囲のプラットフォームで動作する。ISO 標準 テンプレート:Lang を意識したものでは、[[GNU Pascal|テンプレート:Lang テンプレート:Lang]] がある。また、テンプレート:Lang 向けのものに テンプレート:Lang がある。
当初、テンプレート:Lang にはセルフ開発環境はなく、システムの開発およびアプリケーションのクロス開発用プラットフォームとして、もっぱら [[Lisa (コンピュータ)|テンプレート:Lang]] を使用した。テンプレート:Lang の公式開発言語は テンプレート:Lang だったため テンプレート:Lang と呼ぶ API においても、その呼び出し手法が テンプレート:Lang に準拠していたのはこうした理由による。
なお、この テンプレート:Lang の開発言語は原初の テンプレート:Lang ではなく、ヴィルト自身が拡張した [[Object Pascal|テンプレート:Lang テンプレート:Lang]] である。record を class に拡張し、GUI 環境構築の記述に実用性を持たせたものである。
テンプレート:Lang の後継言語
ニクラス・ヴィルト自身が テンプレート:Lang を拡張した言語として テンプレート:Lang 系の言語があり、テンプレート:Lang 系の言語に含まれている。テンプレート:Lang の上位互換になっていないため、ヴィルトは新しい言語の名前に テンプレート:Lang を含めなかった。
- テンプレート:Lang - モジュール概念を取り入れ テンプレート:Lang の後継を目指したが、途中でヴィルトが テンプレート:Lang の方へ移ったため実質未完成。途上版のコンパイラだけがリリースされたらしい。
- テンプレート:Lang - モジュールの概念を追加し分割コンパイルなどを可能にした。ヴィルトは、テンプレート:Lang だけでオペレーティングシステムを含むシステムを作って見せた。
- テンプレート:Lang - オブジェクト指向言語へ拡張。
- テンプレート:Lang - テンプレート:Lang の後継。
- [[Concurrent Pascal|テンプレート:Lang テンプレート:Lang]]
- [[Component Pascal|テンプレート:Lang テンプレート:Lang]]
- テンプレート:Lang - アメリカ国防総省で開発された汎用言語
- VHDL - テンプレート:Lang風のハードウェア記述言語
- テンプレート:Lang - C言語風の前処理可能な テンプレート:Lang 風の記述のハードウェア記述言語
- テンプレート:Lang - テンプレート:Lang の拡張仕様
- テンプレート:Lang - テンプレート:Lang を拡張して作られたオブジェクト指向言語
- テンプレート:Lang - 構文が テンプレート:Lang に似ているオブジェクト指向言語
テンプレート:Lang に対する批判 と反批判
テンプレート:Lang は本来教育用を意図されていたこともあり簡素な文法が特徴だが、反面プロフェッショナルの用途には耐えないという批判がある。代表的なものは、C言語の開発者の一人カーニハンによる1981年の論文 「テンプレート:Lang テンプレート:Lang テンプレート:Lang」である。 実際にC言語の普及に伴い テンプレート:Lang の用途は減少し、のちに テンプレート:Lang による再ブームが起こるまで少数派の存在になっていた。カーニハンの批判そのものとこの減少に直接的な因果関係があるわけではないが、C言語の移植性が高く、多くの CPU 製造者が最初に作成するコンパイラとしてC言語を選択するようになった。しかし、テンプレート:Lang、 テンプレート:Lang のようにC言語そのものの部分集合を既定していくと テンプレート:Lang の仕様に近付いているという反批判もでてきている。
脚注
- ↑ テンプレート:Langにおいては手続き(
procedure)または関数(function)と呼び、値を返し式の中で用いうるものを特に関数と読んで区別する。
関連項目
- [[本物のプログラマはPascalを使わない|本物のプログラマはテンプレート:Langを使わない]]
文献
- 『テンプレート:Lang 原書第4版』ISBN 4-563-01466-4
外部リンク
- テンプレート:Langテンプレート:Lang - テンプレート:Lang と テンプレート:Lang テンプレート:Lang のフリーなコンパイラ
- テンプレート:Lang テンプレート:Lang - GCCのコンパイラ