Object Pascal

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

Object Pascalオブジェクト パスカル)は、コンピュータのプログラミング言語のひとつ。広義には、その名前の通りPascal言語にオブジェクト指向の概念を導入したものであり、狭義には、ボーランド社の統合開発環境Delphi(ただしボーランドの開発ツール部門CodeGearは2008年にエンバカデロ・テクノロジーズ社に合併されている)や、Free Pascalで使用されるような個別の言語仕様を指している。ただし、Delphiで使用されるプログラミング言語は、Delphi 7よりDelphi言語(デルファイげんご)と改称された。Pascalの作成者ニクラウス・ヴィルトラリー・テスラー(当時アップルコンピュータ社)により作られた。Pascalにクラス拡張を施したClascalを経て、Object Pascalとなり、アップルコンピュータ社のLisaの開発言語のひとつとして用いられ、暫くの間、AppleやMacの主要な開発言語の1つになった。

後に、ニクラウス・ヴィルトに計算機科学を学んだフィリップ・カーンによって、MS-DOS向けのボーランド社の統合開発環境Turbo Pascalが製品化された。Turbo PascalではアップルのPascalや、Smalltalkのオブジェクトの考え方を手本とし、後にObject Pascalを最大限に利用したTurbo Vision等のCUIライブラリが製品に付属した。それらのObject Pascal ライブラリの技術は、Microsoft Windowsが開発されて以降、DelphiとDelphiに付属するVCLへと引き継がれていった。

Delphiが世に出た当初、Pascalとオブジェクト指向ライブラリの融合は、当初難解だったWindows GUIアプリケーション開発を分かりやすくして成功を収め、多くの一般のホビープログラマにObject Pascalが広がった。同じくWindows用RADとしてVisual Basicを提供していたマイクロソフトはDelphiのプログラミングスタイルおよびVCLの完成度の高さに着目し、そのなかからObject Pascalのように言語に依存しないものとして、.NET Frameworkと呼ばれるアプリケーション開発・実行環境を開発した。.NETの主要言語であるC#の言語仕様、.NET Frameworkの基本クラスライブラリの設計思想、およびVisual C# RADは、それぞれObject Pascal、VCL、およびDelphi RADに強く影響を受けている。現在のDelphiには従来のObject Pascalのライブラリ(VCL)を利用するネイティブコンパイラ版と、.NET版のものが存在する。

一方、オープンソースのObject Pascalとして、PCやPDAで使えるクロスプラットフォームのPascalの実装Free Pascalも、Object Pascalの言語仕様をベースにして拡張・発展している。Free PascalではApple互換モードや、Delphi互換モードなどを選択でき、また、さらにクロスプラットフォームのための独自の仕様やCのようなマクロ等が使えるなどの拡張が言語仕様に加えられ、DelphiのようなGUI-IDEをクロスプラットフォームで実現するLazarusというObject Pascalのクラスライブラリの開発が大勢のユーザーによってオープンソースのものとして進められている。

Pascalからの拡張

Object Pascalはオブジェクト指向言語の三大要素である、カプセル化継承、および多態性(ポリモーフィズム)をサポートしている。Object Pascalにおける、従来のPascalからの主な拡張点は次のような点が挙げられる。

クラス

クラスの定義構文は、従来のPascalにおけるrecord(C/C++の構造体に相当)の定義構文を拡張したものである。クラス型の要素として変数以外にも手続きや関数を書けるようになっている。クラスに属する変数はフィールド(C++のメンバ変数に相当)、また手続きおよび関数はメソッド(C++のメンバ関数に相当)と呼ばれ、通常の変数、手続きおよび関数と区別される。

また、クラスの属性であるフィールドへアクセスする際に、冗長なメソッドを用いるのではなく、より簡潔に記述するための仕組みとして、プロパティと呼ばれる構文が用意されている。プロパティを用いることで、オブジェクト指向のカプセル化を維持しつつ、あたかもフィールドに直接アクセスしているかのような直感的な記述でクラスの属性を操作することが可能となる。

例:

  type TMyClass = class(TSuperClass)
  private
    Fa: Integer;
  public
    procedure SetValue(v: Integer);
    function GetValue: Integer;
  end;

クラス名は慣例的にTypeを意味する 'T' で始められることが多く、フィールド名は慣例的に 'F' で始められることが多い。

type TX = class の構文は、Systemユニットで定義されている基底クラスTObjectから暗黙的に派生することを意味する。type TB = class(TA) の構文において、クラスTAはTObjectそのものであるか、あるいはTObjectから派生している必要がある。 一方、type TB = object(TA) の構文を使用することで、TObjectから派生せず、組み込みのコンストラクタやデストラクタなどのメソッドをサポートしないオブジェクト型の宣言を行なうことができるが、Delphiにおいては下位互換性を保つ目的でのみ残されており、オブジェクト型の使用は推奨されていない。

メソッドの実装は implementation 以下に、(クラス名).(メソッド名)という形で記述する。

例:

  implementation

  procedure TMyClass.SetValue(v: Integer);
  begin
    Fa := v
  end;

  function TMyClass.GetValue: Integer;
  begin
    result := Fa
  end;

クラス参照型

C++などのオブジェクト指向言語と比較して、Object Pascalが優れている点として、クラス参照型のサポートが挙げられる。クラス参照型の変数には、実体ではないクラス自体を変数に代入することが出来る。これは、設計図をもとに作られた製品ではなく、設計図自体を格納する変数を定義できると考えれば分かりやすい。クラス参照型はメタクラスとも呼ばれ、実行時型情報(RTTI)によって実現される。クラス参照型は、その実際の型がコンパイル時にわからないクラスまたはオブジェクトでクラスメソッドまたは仮想コンストラクタを呼び出したい場合(例えば逆シリアライズなど)に便利である。

例外

Object Pascalは、エラーハンドリング機構として例外をサポートしている。例外オブジェクトは、エラーやその他のイベントによりプログラムの通常の実行が中断された場合に生成される。例外を用いることで、整数値エラーコードを用いるよりも多くの情報を呼び出し側に伝播させることができる。

例外処理の構文には try...except および try...finally がある。

言語としての特徴

Object Pascalはそのコンパクトで明快な言語仕様ゆえに、オブジェクト指向言語の学習に適していると言われる(C++の演算子オーバーロード、テンプレートや多重継承のような便利だが比較的難解な機能を持たない)。反面、近年多くのプログラミング言語が導入しているジェネリクスラムダ式をサポートしていなかったため、ジェネリックプログラミング関数型プログラミングには不向きだったが、Delphi 2009のDelphi言語では、ジェネリクスおよび無名メソッド匿名メソッド)が正式サポートされている。また、Delphi 2005以降ではインライン関数がサポートされ、実行速度面での強化も図られている。

また、DelphiのVCLは単なるクラスライブラリにとどまらず、コンポーネントと呼ばれるソフトウェア部品の集合で構成され、このコンポーネントを組み合わせて視覚的にアプリケーションを開発する方式となっている。Delphiではユーザープログラマがコンポーネントを自由に作成して開発環境自体に組み込むことができるため、「コンポーネント指向言語」と呼ばれることもある。

外部リンク

テンプレート:Asbox