Object Pascal

**Object Pascal**（**オブジェクト パスカル**）は、コンピュータのプログラミング言語のひとつ。広義にはPascal言語にオブジェクト指向の概念を導入したものを指し、狭義には統合開発環境 (IDE) であるDelphiや、コンパイラであるFree Pascalで使用される言語仕様を指す。

## 沿革
Object Pascalは1980年代に登場したPascalのオブジェクト指向拡張に端を発する。Pascalは当時アップルコンピュータ（現Apple）の主要な開発言語として利用されており、と呼ばれる処理系の実装が存在した。Apple LisaにおいてもLisa Pascalと呼ばれる開発環境が使われていた。1983年、アップルコンピュータのラリー・テスラー率いるチームはPascal言語の発明者であるニクラウス・ヴィルトを招き、Lisa Pascalにオブジェクト指向のための拡張を導入し、これをと名付けた。このClascalがMacintosh上のObject Pascalにつながっていくことになる。

Object Pascalは、現在ではクラスライブラリと呼ばれる拡張可能なMacintoshアプリケーションフレームワークであるをサポートするために必要だった。Object Pascalをサポートするソフトウェア開発環境である (MPW) の開発は1985年に始まり、1986年に製品となった。しばらくの間、Object PascalはアップルやMacintoshの主要な開発言語の1つになった。MPW Pascalのサポートは1995年11月まで続いた。後にMPW Pascal (Apple Object Pascal) は遡って**Mac Pascal**と命名された。また、Object Pascal拡張はSymantec社のTHINK Pascalや社のCodeWarrior Pascalにも実装された。

1990年にリリースされたボーランド社のTurbo Pascal 5.5でも類似のObject Pascal拡張が実装されており、Object Pascalを最大限に利用したTurbo Vision等のCUIライブラリが製品に付属するようになった。これらのObject Pascalクラスライブラリの技術は後のDelphiとDelphiに付属する**[[Visual Component Library]]** (VCL) へと引き継がれていった。

1995年にリリースされたボーランド社のWindows用Rapid Application Development (RAD) ツールであるDelphiは、当初難解だったWindows GUIアプリケーション開発の難易度を下げるだけでなく効率も高めることで成功を収め、また無償の個人向けエディションも配布されていたことから、多くの一般ホビープログラマにObject Pascalが認知されることとなった。Microsoft Visual Basicと異なり、Delphiでは当初から高速な機械語コードを実行可能なネイティブバイナリを出力する方式であったこと、またC++と比べてコンパイルが高速であったことも人気に影響した。

DelphiのバージョンXE2以降には従来のクラスライブラリ (VCL) に加え、マルチプラットフォーム用クラスライブラリである***' (FMX) と各プラットフォーム向けのクロスコンパイラが付属する。

なお、開発環境としてのDelphiで使用されるプログラミング言語は、Delphi 6まではObject Pascalと呼ばれていたが、Delphi 7より'''Delphi言語''' ('''Delphi Language''') と改称された。その後、ボーランドの開発ツール部門[[CodeGear]]は2008年に[[エンバカデロ・テクノロジーズ]]に合併され、DelphiおよびDelphi言語はエンバカデロに移管された。[[Appmethod]]が登場してからは再びObject Pascalと呼ばれるようになっているが、ドキュメント類にはDelphi言語という表記も依然として残っている。

同じくWindows用RADツールとして[[Visual Basic]]をリリースしていた[[マイクロソフト]]社は、[[Delphi]]のプログラミングスタイルおよびVCLの完成度の高さに着目し、Object Pascalのように言語に依存しないものとして、[[.NET Framework]]と呼ばれるアプリケーション開発・実行環境を開発した。[[.NET]]の主要言語である[[C Sharp|C#]]の言語仕様、.NETの[[基本クラスライブラリ]]の設計思想、およびRADとしての[[Microsoft Visual C Sharp|Visual C#]]は、それぞれObject Pascal、VCL、およびRADとしてのDelphiに強く影響を受けている。なお、C#の開発者[[アンダース・ヘルスバーグ]]は、もともとボーランドに在籍しており、Delphiの開発者でもあった。

ボーランド社の.NET用 Object Pascal コンパイラは、Delphi 8から始まり[[RAD Studio]] 2007まで存在していた。これらは'''Delphi for .NET'''と呼ばれた。代替製品として[[RAD Studio]]には[[:en:RemObjects|RemObjects]]社の[[:en:Oxygene|Oxygene]]が'''Delphi Prism'''という名称で[[RAD Studio]] 2009からXE3まで付属した。[[:en:Oxygene|Oxygene]]の開発は現在も継続されており、言語名もOxygene言語となっている。

一方、[[オープンソース]]のObject Pascal実装としては[[Free Pascal]]や[[GNU Pascal]]がある。[[Free Pascal]]は当初[[Turbo Pascal]]の言語仕様をベースにして作られた。現在ではApple互換モードやDelphi互換モードも実装され、さらにはクロスプラットフォームのための独自の仕様追加や、[[C言語]]のようなマクロ等の拡張も行われている。[[Delphi]]のような[[統合開発環境]]を[[マルチプラットフォーム]]で実現するための[[Lazarus]]やクラスライブラリ***' (LCL) の開発もオープンソースの元で進められている。GNU Pascalは標準Pascal (ISO/IEC 7185) や拡張Pascal (ISO/IEC 10206) をメインに実装されているが、Delphiの機能も部分的に実装している。また、GNU PascalにもDev-Pascalと呼ばれる統合開発環境が存在する。

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

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

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

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

例:

```pascal
program MyObjectPascalTest;

type
  TMyBaseClass = class
  private
    Fa: Integer;
    Fb: Integer;
  public
    procedure SetValueA(v: Integer);
    function GetValueA: Integer;
    property ValueB: Integer read Fb write Fb; // 読み書き両方が可能なプロパティ。
    procedure DoSomething; virtual; abstract;
  end;

  TMySubClass = class(TMyBaseClass)
  public
    procedure DoSomething; override;
  end;

procedure TMyBaseClass.SetValueA(v: Integer);
begin
  Fa := v
end;

function TMyBaseClass.GetValueA: Integer;
begin
  Result := Fa
end;

procedure TMySubClass.DoSomething;
begin
  WriteLn('TMySubClass.DoSomething is called.');
  WriteLn('ValueA = ', GetValueA);
  WriteLn('ValueB = ', ValueB)
end;

var
  obj: TMyBaseClass;
begin
  obj := TMySubClass.Create; // オブジェクトの生成。
  obj.SetValueA(100);
  obj.ValueB := -5;
  obj.DoSomething; // 派生クラスでオーバーライドされたメソッドが実行される（ポリモーフィズム）。
  obj.Free; // オブジェクトの解放。
  obj := Nil
end.
```

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

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

クラスの定義にユニット (unit) を用いる場合、クラスの宣言は interface 部に、メソッドの実装は implementation 部に記述する。

例:

```pascal
unit MyUnit;

interface

type
  TMyClass = class
  public
    procedure Proc;
  end;

implementation

procedure TMyClass.Proc;
begin
  { ここに実装を記述 }
end;

end.
```


### インターフェイス
Object PascalはC++と異なり、実装の多重継承をサポートしない。その代わりに、インターフェイスを実装することによる型の多重継承をサポートする。インターフェイス名は慣例的にInterfaceを意味する 'I' で始められることが多い。

Object Pascalにおける継承の機能やメカニズムはJavaとよく似ており、のちにC#にも受け継がれることになった。

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

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

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

## 言語としての特徴
Object Pascalはそのコンパクトで明快な言語仕様ゆえに、オブジェクト指向言語の学習に適していると言われる（C++の演算子オーバーロード、テンプレートや多重継承のような便利だが比較的難解で複雑な機能を持たない）。反面、近年多くのプログラミング言語が導入しているジェネリクスやラムダ式をサポートしていなかったため、ジェネリックプログラミングや関数型プログラミングには不向きだった。

DelphiではDelphi 2006で演算子のオーバーロードが、Delphi 2009でジェネリクスおよび無名メソッド（匿名メソッド）が、Delphi 10.3 Rioで型推論可能なインライン変数宣言が実装されたため、柔軟な記述が可能になっている。また、Delphi 2005以降ではインライン関数がサポートされ、実行速度面での強化も図られている。Delphi 2010ではRTTIが強化され、リフレクションをサポートするようになった。

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

## 出典・脚注

## 関連項目
* Pascal
* Delphi
* C#

## 外部リンク
* Delphi Downloads - Delphi Architect Edition（30日評価版）のダウンロードページ
* Delphi Community Edition - Delphi Community Edition（無償版）のダウンロードページ
* Free Pascal - Free Pascal はオープンソースの Pascal コンパイラ。Object Pascal もサポートしている。
* GNU Pascal - GNU Pascal はオープンソースの Pascal コンパイラ。Object Pascal も一部サポートしている。
* Lazarus - Lazarus は Free Pascal の統合開発環境。