<3>  Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi)

# 3. Macintosh 用 Pascal のオブジェクト指向拡張
Apple の Object Pascal の源流は[ラリー・テスラー](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%86%E3%82%B9%E3%83%A9%E3%83%BC)氏が 1985 年に書いた **"Object Pascal Report"**[^1] [^2] です。Object Pascal は Apple のテスラーのチームと Pascal の生みの親である[ニクラウス・ヴィルト](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%82%AF%E3%83%A9%E3%82%A6%E3%82%B9%E3%83%BB%E3%83%B4%E3%82%A3%E3%83%AB%E3%83%88)氏が開発したものです。Clascal との関係はハッキリしませんが、Clascal を叩き台として Object Pascal へとブラッシュアップしたような印象を受けます。

当初、Macintosh にはセルフ開発用環境が用意されておらず、Lisa を使ったクロスコンパイルが行われていました。クロスコンパイル用環境 **Lisa Workshop** で使われたのが (Lisa) Object Pascal で、1986 年の 3 月にリリースされました。

その後、セルフ開発用環境である **Macintosh Programmer's Workshop (MPW)** が 1986 年の 10 月にリリースされました。MPW 用の言語の一つが (Macintosh) Object Pascal です [^3]。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/a6cae7ac-e807-3f7e-347d-2811a77bc54d.png)
Apple の Object Pascal には名前が付いておらず、後になって **Mac Pascal** という名前が付けられたようですが一般的ではないようです。Lisa の Object Pascal も Macintosh の Object Pascal も言語仕様は同じものなので、ひっくるめて `Apple Object Pascal` と記述するのが正しい気がします。
![MPW.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d4e892f4-c992-ca56-20e7-11a4bc547959.gif)
また、MPW Pascal にはオブジェクト指向部分以外の拡張もあり、ダン・アレン氏は次のような言葉を残しています。

> MPW Pascal overcomes most of Brian Kernighan's objections to Pascal included in his famous memo "Why Pascal Is Not My Favorite Programming Language."

**See also:**

 - [Object Pascal (Wikipedia)](https://ja.wikipedia.org/wiki/Object_Pascal)
 - [Larry Tesler 氏のサイト](http://www.nomodes.com/Larry_Tesler_Consulting/Home.html)
 - [Macintosh Programmer's Workshop (Wikipedia: En)](https://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Workshop)
 - [The Macintosh Programmer's Workshop (Dr.Dobb's)](https://www.drdobbs.com/architecture-and-design/the-macintosh-programmers-workshop/184408063)
 - [MacApp (Wikipedia: En)](https://en.wikipedia.org/wiki/MacApp)
 - [Macintosh Programmer's Workshop (MPW) Object Pascal の簡単な使い方 (Qiita)](https://qiita.com/ht_deko/items/de6838acd1d22722b674)

## 3.1. Apple Object Pascal のクラス
Apple Object Pascal のオブジェクト指向拡張は**オブジェクト型**によって行われています。Object Pascal におけるクラスとはオブジェクト型の事なのですが、Apple は `クラス` という用語を使っていません。

オブジェクト型は型宣言部 (**type**) にて "型名 = **object** ～ **end**;" として定義します。

### 3.1.1. オブジェクト型の定義
以下のコードでルートクラスを作れます。

```pascal
type
  TClass = object { オブジェクト型 TClass の定義 }
    FID: Integer;
  end;
```

普通のルートクラスは ObjIntf.p で定義されている **TObject** です。MacApp アプリケーションを作る場合には通常 TApplication を継承します。多重継承は行えません。

```pascal
uses
  ObjIntf;

type
  TClass = Object (TObject) { TObject を継承したオブジェクト型 TClass の定義 }
    FID: Integer;
  end;
```

Apple Object Pascal のオブジェクト型にはコンストラクタやデストラクタがなく、プロパティもありません。

 - 多重継承はできません。
 - 可視性指定子はありません。
 - 自クラスを表すにはキーワード `SELF` を使います。
 - **Clascal** にあった抽象メソッドはありません。


### 3.1.2. オブジェクト型の作成と破棄

生成と破棄は New() と Dispose() で行います。

```pascal:ClassTest.p
program ClassTest;

type
  TClass = object
    FID: Integer;
    FFirstName: string;
    FLastName: string;
    function GetName: string;
  end; { TClass }

  TClassEx = object(TClass)
  end; { TClassEx }

function TClass.GetName: string;
begin
  GetName := Concat(FFirstName, FLastName);
end;

var
  ClassEx: TClassEx;

begin
  New(ClassEx); 

  ClassEx.FID := 100;
  ClassEx.FFirstName := 'Hello,';
  ClassEx.FLastName  := 'world.';
  writeln(ClassEx.FID       );
  writeln(ClassEx.GetName   );

  Dispose(ClassEx);  
end.
```

TObject から派生していれば、Dispose() の代わりに Free() メソッドを呼ぶ事もできます。

```pascal
uses
  ObjIntf;

type
  TClass = Object (TObject)
    ...
    procedure Free; override;
  end; { TClass }
...

procedure TClass.Free;
begin
  inherited Free;
end;
```

ObjIntf.p の TObject には最低限のメソッドしか実装されていません。

```pascal:ObjIntf.p
{
  File: ObjIntf.p
    
  Pascal Interface to the Macintosh Libraries
  Copyright Apple Computer, Inc.  1986 - 1988
  All rights reserved.  
}

UNIT ObjIntf;

INTERFACE

TYPE
  TObject = OBJECT
    FUNCTION  ShallowClone: TObject;
      {Lowest level method for copying an object; should not be overridden
        except in very unusual cases.  Simply calls HandToHand to copy
        the object data.}
    FUNCTION  Clone: TObject;
      {Defaults to calling ShallowClone; can be overridden to copy objects
        refered to by fields.}
    PROCEDURE ShallowFree;
      {Lowest level method for freeing an object; should not be overridden
        except in very unusual cases.  Simply calls DisposHandle to
        free the object data.}
    PROCEDURE Free;
      {Defaults to calling ShallowFree; can be overridden to free objects 
        refered to by fields.}
    END;


END.
```

**See also:**

 - [System.Classes.TPersisten (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Classes.TPersistent)

## 3.3. 命名規則
Apple の Object Pascal のコードはなんだか読みやすく、初めて読んでもさほど違和感がありません。

 - クラスは型 (Type) を拡張して作られているので、名前を T で始める。
 - インスタンス変数はオブジェクトのフィールドでもあるので名前を f で始める。
 - 名前の境界はアンダースコア(`_`)で区切らず大文字で示す。

これらは Apple 社が推奨した命名規則です。Borland 系のオブジェクト指向 Pascal もこれを踏襲しています。

## 3.4. その他の Macintosh 用 Object Pascal
オブジェクト指向拡張されている Pascal は他に Symantec の **THINK Pascal** や Metrowerks の **CodeWarrior Pascal** があります。

### 3.4.1. Symantec THINK Pascal
Symantec **THINK Pascal** は WPM Pascal と高い互換性を持っています。初期は **LightSpeed Pascal** と呼ばれていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/0f26771b-8014-9735-03ae-a239e53f2ba5.png)
最終的に無償公開されました。現在でも DL 可能です。

**See also:**

 - [Ingemar's guide to Think Pascal 4.5d4 (think-pascal.org)](http://www.think-pascal.org/)
 - [Think Class Library（TCL） (Wikipedia: En)](https://en.wikipedia.org/wiki/THINK_C)
 - [(0.1.1.1.) Propagated Uses (Uses Propagation / Unit Propagation) - <0> はじめに (標準 Pascal 範囲内での Delphi 入門) (Qiita)](https://qiita.com/ht_deko/items/afb3c008a83a20792169#0111-propagated-uses-uses-propagation--unit-propagation)

### 3.4.2. Metrowerks CodeWarrior Pascal
Metroweaks **CodeWarrior** は 1998 年の Pro 4 まで Pascal コンパイラが付属しました。Windows 版もありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ff359edd-79cd-7192-022c-602223c4df0b.png)

**See also:**

 - [CodeWarrior (Wikipedia)](https://ja.wikipedia.org/wiki/CodeWarrior)
 - [CodeWarrior (Wikipedia:En)](https://en.wikipedia.org/wiki/CodeWarrior)
 - [PowerPlant (Wikipedia:En)](https://en.wikipedia.org/wiki/PowerPlant)
 - [メトロワークス、『CodeWarrior Professional』の新バージョンと『Ruputer』用IDEを発表 (ASCII.jp)](https://ascii.jp/elem/000/000/313/313854/)

# 参考文献
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3563e617-9343-766d-f2fc-bacc301cd685.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| オブジェクト指向プログラミング〈上巻〉 | カート・J.シュマッカー (著)<br>大谷 和利 (訳) |  [4890520910](https://www.amazon.co.jp/dp/4890520910/)  | 1989/12/15 |

**『オブジェクト指向プログラミング〈上巻〉』** には MPW Pascal の断片的な情報が載っています。入手は比較的容易ですが、全容を知るには情報が足りません。

MPW は開発者登録しないと購入できなかった [^4] 上に高額だったらしく [^5]、MPW Pascal の資料は殆ど残っていません。インターネット普及期には既にディスコンだったため [^6]、ウェブサイトにも殆ど情報がありません。

同様の理由で **C+-** (typo ではない) の言語仕様を調べるのも困難です [^7]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c4bbe9ce-5c6e-ab55-50a6-53bfaf2e5c32.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| Macintosh Programmer’s Workshop<br>Object Pascal : 日本語版 | Apple Computer (著)<br>アップルコンピュータジャパン (訳) |  [4756109519](https://www.amazon.co.jp/dp/4756109519/)  | 1991/12/1 |

本書は、リファレンスマニュアルであり規格書の類です。よく言えば必要最低限のページ数で簡潔にまとめられています。とにもかくにも Object Pascal の源流を知るには貴重な資料です。

但し、入手難易度がかなり高いです。[大学や図書館の蔵書も検索](https://calil.jp/book/4756109519)してみましたが、20件しかヒットしませんでした。表紙の画像もこの記事に貼られたものが最初ではないでしょうか？

**See also:**

 - [A Brief History of Apple Computer's Work with the Pascal Language (applefritter.com)](https://www.applefritter.com/content/brief-history-apple-computer%E2%80%99s-work-pascal-language)
 - [『Macintosh Programmer’s Workshop Object Pascal 日本語版』を読んでみる (Qiita)](https://qiita.com/ht_deko/items/faefeb7123d04733ec8c)

# 索引
[ [← 2. Clascal のオブジェクト指向拡張](https://qiita.com/ht_deko/items/770f2db98c9cf3e8ef7b) ] [ [↑ 目次へ](https://qiita.com/ht_deko/items/ff2d90c9174290583377) ] [ [→ 4. Turbo Pascal のオブジェクト指向拡張](https://qiita.com/ht_deko/items/5935a06ca7aee27842f6) ]

[^1]: "Object Pascal Report", Structued Programming (Structured Language World) 9, 3 (1985), pp. 10-15.
[^2]: "Object Pascal Report", Apple Technical Report No.1 (1985)
[^3]: 当初は Object Pascal とアセンブラのみで、後に C と C++ が追加された。
[^4]: APDA (Apple Programmer's and Developer's Association) の事。参考文献に "APDA" の文字があったら、その書籍は入手困難です。
[^5]: 後に無償公開されました。
[^6]: Power Macintosh の時代になると MPW での Pascal サポートは打ち切られてしまいます。具体的には [1995/11](https://web.archive.org/web/20110805132122/http://developer.apple.com/tools/mpw-tools/mpw_faq.html) に打ち切られています。
[^7]: "Minimal C++ Report (C+- Specification)", Apple Technical Report No.2 (1985?)