Object Pascal

沿革

Object PascalはPascal言語の発明者であるニクラウス・ヴィルトと、アップル社のラリー・テスラー率いるチームにより開発されたPascal言語のオブジェクト指向拡張。Apple Lisaで利用可能だったClascalと呼ばれるPascal派生オブジェクト指向言語からの派生。
Object Pascalは、現在ではクラスライブラリと呼ばれる拡張可能なMacintoshアプリケーションフレームワークであるMacAppをサポートするために必要だった。開発は1985年に始まり、1986年に製品となった（Macintosh Programmer's Workshop Pascal）。しばらくの間、Object PascalはアップルやMacintoshの主要な開発言語の1つになった。MPW Pascal のサポートは1995年11月まで続いた。後にMPW Pascal (Apple Object Pascal) は遡ってMac Pascalと命名された。また、Object Pascal拡張はSymantec社のTHINK PascalやMetrowerks社の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) に加え、マルチプラットフォーム用クラスライブラリであるFireMonkey (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#の言語仕様、.NETの基本クラスライブラリの設計思想、およびRADとしてのVisual C#は、それぞれObject Pascal、VCL、およびRADとしてのDelphiに強く影響を受けている。なお、C#の開発者アンダース・ヘルスバーグは、もともとボーランドに在籍しており、Delphiの開発者でもあった。
ボーランド社の.NET用 Object Pascal コンパイラは、Delphi 8から始まりRAD Studio 2007まで存在していた。これらはDelphi for .NETと呼ばれた。代替製品としてRAD StudioにはRemObjects社のOxygeneがDelphi Prismという名称でRAD Studio 2009からXE3まで付属した。Oxygeneの開発は現在も継続されており、言語名もOxygene言語となっている。
一方、オープンソースのObject Pascal実装としてはFree PascalやGNU Pascalがある。Free Pascalは当初Turbo Pascalの言語仕様をベースにして作られた。現在ではApple互換モードやDelphi互換モードも実装され、さらにはクロスプラットフォームのための独自の仕様追加や、C言語のようなマクロ等の拡張も行われている。Delphiのような統合開発環境をマルチプラットフォームで実現するためのLazarusやクラスライブラリLazarus Component Library (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++のメンバ関数に相当）と呼ばれ、通常の変数、手続きおよび関数と区別される。
また、クラスの属性であるフィールドにアクセスする際に、冗長なメソッドを用いるのではなく、より簡潔に記述するための仕組みとして、プロパティと呼ばれる構文が用意されている。プロパティを用いることで、オブジェクト指向のカプセル化を維持しつつ、あたかもフィールドに直接アクセスしているかのような直感的な記述でクラスの属性を操作することが可能となる。
メソッドの実装は(クラス名).(メソッド名)という形で記述する。
例:
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 := vend;function TMyBaseClass.GetValueA: Integer;begin
  Result := Faend;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 := Nilend.
クラス名は慣例的に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 部に記述する。
例:
unit MyUnit;interfacetype
  TMyClass = class
  public
    procedure Proc;
  end;implementationprocedure 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ではユーザープログラマがコンポーネントを自由に作成して開発環境自体に組み込むことができるため、「コンポーネント指向言語」と呼ばれることもある。