Macintosh Programmer's Workshop (MPW) Object Pascal の簡単な使い方

# はじめに
備忘録的に、軽く **Macintosh Programmer's Workshop (MPW)** の使い方を説明します。資料が少ないので "Hello World が書けるまで" くらいの説明しかできません。

**See also:**

 - [Macintosh Programmer's Workshop (Wikipedia: en)](https://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Workshop)
 - [MPW Reference Books (developer.apple.com ミラー)](http://mirror.informatimago.com/next/developer.apple.com/tools/mpw-tools/books.html)
 - [『Macintosh Programmer’s Workshop Object Pascal 日本語版』を読んでみる (Qiita)](https://qiita.com/ht_deko/items/faefeb7123d04733ec8c)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)

## 動作環境
検証用として、次のエミュレータを使用しています。

 - [Basilisk II](http://basilisk.cebix.net/)
 - [SheepShaver](https://sheepshaver.cebix.net/)

使用する MacOS は 8.1J です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b89c7ad3-a97d-41a7-a6eb-b0962533e4ed.png)

# MPW Pascal の使い方

 1. プロジェクト用のフォルダを作成します。ここではデスクトップに `Projects/Hello` フォルダを作成しています。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/0aac1946-9eb1-b5d3-a07f-8bbdc3b17bd6.png)

 2. MPW Shell を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f0671ae3-4825-62ba-f67b-a12569d553e6.png)

 3. [Directory | Set Directory] で作業フォルダを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/bad66ea5-e00e-08bc-843f-18db49a94a9c.png)
`Projects/Hello` フォルダを辿って開いて行き、最後に [Select Current Directory] ボタンを押します。一つ前のフォルダ (画像の状態) で \[Directory\] ボタンを押しても構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/12769e7d-ab41-eee5-1137-53b52167c28b.png)

 4. \[File | New\] で新しいファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3286c0e6-c4ec-4be2-915a-83f89fca2722.png)
`Projects/Hello` フォルダに `Hello.p` という名前のファイルを作ります。拡張子は *.p である必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d5a31d01-ad41-3541-82ca-7535ea111878.png)
新規エディタが開きます。分かりやすいように右上に Finder で `Projects/Hello` フォルダを開いておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/abae51c5-7f1a-795b-20ef-7f95006ecd78.png)

 5. Hello World を記述します。書き終わったら \[File | Save\] で保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9aceeeb3-85ab-efb5-28ce-f42a9765d78b.png)

 6. \[Build | Create Build Commands\] でビルドコマンド (.make ファイル) を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b9ae6df4-cccf-c318-95df-857122d042c0.png)
設定項目を埋めます。\[Program type\] を `SIOW App` [^1]、\[Target\] を `68K Only` にすれば **SIOW アプリケーション** (コンソールアプリケーションのようなもの) が作れます。\[68K Model\] は `Model Near` か `Model Far` のいずれかを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9122fad7-1cf8-6349-7281-2eaf45a4aca4.png)
埋めたら \[Source Files\] ボタンを押し、ソースファイルを指定します。目的のファイルをダブルクリックするか、選択して [Add] ボタンを押し、下側のボックスに移動させます。移動が終わったら \[Done\] ボタンで確定させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/97e17c44-86ee-f5fd-cbe9-2152bd23c94c.png)
\[Command Line\] が画像のようになっていれば OK です。このまま \[CreateMake\] ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ad463a96-9dbe-48a0-40ad-a22763a9591d.png)
`hello.make` ファイルができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e2514bf7-8d7b-ff70-d365-eb79e0d90ed5.png)

 7. もし、コード中でオブジェクト型 (クラス) を使うのなら、リンカに ObjLib.o を渡さないとエラーになります。.make ファイルをダブルクリックするとコードエディタで開けますので、`"{Libraries}"ObjLib.o" ∂` を追加して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/51db85a5-bc50-d681-3e5e-e84758ada806.png)

 8. \[Build | Build\] でプロジェクトをビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5e3992a6-600a-0d08-4d6f-2746a0e51408.png)
プログラム名を尋ねられますので `Hello` と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/028f41d3-3aab-3ce3-37d6-c605b0a0806f.png)
しばらくするとビルドが完了し、実行ファイルが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e4f3da19-a4de-cbf8-29b3-c8a2cebf57d8.png)

 9. プログラム Hello を実行します。Finder からダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2b23ba2e-2212-fd82-1395-9f04f92e6e1d.png)
終了ボタンがなくて面食らうかもしれませんが、MacOS のメニューの [File | Quit] でアプリケーションを終了させる事ができます。

**See Also:**

 - [Le Cabinet de "MPW" (JNQT's Lab)](http://hp.vector.co.jp/authors/VA019253/index.html)
 - [六色林檎のお部屋 (LNDMLSの黒猫実験室)](http://park12.wakwak.com/~alchemist/mac.html)
 - [MPW Pascal に関するツイート (@ht_deko)](https://twitter.com/ht_deko/status/1106608477571416064)
 - [Oberon についての個人的な感想 - 割と簡単に ’標準 Modula-2 / Oberon-2' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/8e8be01f749915167a91#oberon-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%80%8B%E4%BA%BA%E7%9A%84%E3%81%AA%E6%84%9F%E6%83%B3)

## MPW Pascal が必要とする標準ライブラリ
Pascal コンパイラが必要とする標準ライブラリは次の通りです [^2]。次に挙げる標準ライブラリは最初からビルドコマンドに含まれています。

| 機能 | ライブラリ | 場所| 
|:---|:--|:--|
| 低レベル I/O | IntEnv.o | Libraries|
| ToolBox, OS| Interface.o | Libraries|
| ランタイムサポート  | MacRuntime.o | Libraries|
| SANE [^3] | SANELib.o |  PLibraries|
| SANE [^3] (Far & コプロセッサ [^4] ) | SANELib881.o | PLibraries|
| Pascal | PasLib.o | PLibraries|

次に挙げる標準ライブラリはビルドコマンドの `Program Type` によって自動的に追加されます。

| 機能 | ライブラリ | 場所| 
|:---|:--|:--|
| SIOW [^1]| SIOW.o | Libraries|
| 標準ライブラリ | Stubs.o | Libraries|
| MPW tools | ToolLibs.o | Libraries|

次に挙げる標準ライブラリは追加で指定する必要があります。

| 機能 | ライブラリ | 場所| 
|:---|:--|:--|
| 数値演算 | MathLib.o | Libraries|
| 数値演算 (Far & コプロセッサ [^4] ) | MathLib881.o | Libraries|
| Object Pascal [^5]| ObjLib.o | Libraries|
| 68K セグメント操作 (Far) | RTLib.o | Libraries|

**See also:**

 - [Standard Apple Numerics Environment (Wikipedia:En)](https://en.wikipedia.org/wiki/Standard_Apple_Numerics_Environment)

## MPW Pascal と ANSI Pascal との違い

MPW Pascal は **ANSI/IEEE 770X3.97-1983 (ANSI Pascal)**  (≒ 標準 Pascal Level 0) に準拠していますが、異なる点もあります。

### ■ ANSI Pascal に対する例外

ANSI Pascal 範囲内での差異についてです。以下、書籍『Macintosh Programmer’s Workshop Object Pascal 日本語版』からの引用です [^6]。

 - 識別子は 63 文字に制限されています。
 - at 記号 (@) はキャレット (^) と等価ではありません。
 - ポインタに割り当てられる値を New 手続き以外の方法で知ることが可能です。
 - **SET OF** integer の範囲は 0..2039 に制限されています。
 - MPW Pascal の文字列型は、長さを示す 1 バイトのフィールドを先頭に付加した文字の並びとして表わされます。ANSI Pascal の文字列型は、**PACKED ARRAY** [1..n] **OF** char です。  
 - MPW Pascal では、text 型は **FILE OF** char 型とは異なります。**FILE OF** char型は、レコードの型が char であるようなファイルであり、その char 型の値は入出力操作においていかなる形にも翻訳あるいは変換されることはありません。  
 - Jensen と Wirth とにより記述された、Pack 手続きと Unpack 手続きはサポートされていません。  
 - 標準の注釈区切り符号 `{ }` と `(* *)` はコメントの入れ子を許すために使用されます。 このため、注釈区切り記号 `{ *)` と `(* }` はサポートされていません。

### ■ ANSI Pascal に対する拡張

ANSI Pascal から拡張された機能についてです。以下、書籍『Macintosh Programmer’s Workshop Object Pascal 日本語版』からの引用です [^7]。

 - 宣言およびインデックスにおいて、定数式が許されます。
 - 宣言はどのような順序に書いても構いません。
 - Cycle 文がサポートされています。
 - Leave 文がサポートされています。
 - **CASE** 文のタグに範囲を使用することができます。
 - Standard Apple Numeric Environment (SANE) がサポートされています。
 - Exit 手続きがサポートされています。
 - 垂直バー (|) 演算子とアンパサンド (&) 演算子がサポートされています。
 - 関数が構造型の値を返すことが可能です。
 - Univ 引数がサポートされています。  
 - 型変換がサポートされています。
 - ビット操作ルーチンが組み込まれています。
 - 指数演算子 **\*\*** がサポートされています。
 - ユニットと **USES** 宣言がサポートされています。
 - オブジェクトパスカルがサポートされています。
 - 標準変数 maxlongint, pi, inf,maxcomp, minnormreal, minnormdou minnormextended, compsecs, compdate, comptime がサポートされています。
 - open, blockread, blockwrite, byteread, bytewrite の各ルーチンがサポートされています。
 - Arctanh, Cosh, Sinh. Tanh, Log10, Exp10, Arccos, Arcsin, Sincos の各ルーチンがサポートされています。



# おわりに

Delphi 1 (や Turbo Pascal for Windows) にも SIOW アプリケーションみたいな WinCRT がありました。

Delphi 1 では MS-DOS アプリケーションを作れない代わりに疑似コンソールアプリケーションを作る事が可能でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/aa2650ea-bd9b-715e-3b64-c8a8d9d74a52.png)

[^1]: **S**imple **I**nput/**O**utput **W**indow
[^2]: 『Building and Managing Programs in MPW』の "Switching between MPW libraries (Table 9-2)" より。
[^3]: **S**tandard **A**pple **N**umerics **E**nvironment
[^4]: コプロセッサ (68881 / 68882) の有無はビルドコマンドの [68K Options] で指定できます。
[^5]: MacApp なしでオブジェクト指向プログラミングを行う場合には **uses** に `ObjIntf` を加えた上で、このライブラリをリンクする必要があります。
[^6]: Apple Computer Inc. (1992). "Macintosh Programmer's Workshop Object Pascal 日本語版" アスキー出版局, p.251.
[^7]: Apple Computer Inc. (1992). "Macintosh Programmer's Workshop Object Pascal 日本語版" アスキー出版局, p.252.